Вчера обсуждая с бывшим коллегой мои впечатления от рельс,
levgem — 20.09.2011 Вчера обсуждая с бывшим коллегой мои впечатления от рельс, я смог сформулировать проблему рельс.Они перестали отвечать тенденциям времени.
Когда я в 2005-м открыл Agile Web Development On Rails, я понял, что люди, делающие свои фреймворки — упёртые идиоты, потому что абсолютно всё, что можно и хочется сделать во фреймворке для малого и среднего сайта есть в рельсах. В течении последующих нескольких лет мы могли наблюдать, как весь web-мир, включая монстров типа Java и .NET рванулись догонять Rails. Вопрос стоял лишь так: как бы сэмулировать на говнопохапешечке has_many, что бы было не так мучительно отстойно.
Всё, что было не Rails-like отдавало зловонным запахом гнилостных масс неподдерживаемого кода
Рельсы исчерпывающе и прекрасно отвечали потребностям сайтов и продолжают оставаться единственно пригодным и незаменимым инструментом для создания среднего размера проекта, который надо потом поддерживать.
Можно много рассуждать о том, как на питоне вот в том самом фреймворке есть фича _почти_ похожая на рельсы, но факт остается фактом: Рельсы вовремя уничтожили всю конкуренцию кода на Ruby и это прекрасно. Есть только один мейнстрим, Руби без рельс не существует (если вам кто-то говорит обратное — развернитесь и не слушайте его, он вам как наёмный работник неинтересен) и все коммитят в него. И, в принципе, длительное время во главе проекта стоял один человек, что опять же прекрасно: design by commitee — говно и пиздец. Должна быть одна точка принятия решений.
Но я считаю, что пик при нынешней архитектуре и концепции пройден. Рельсы перестали отвечать тенденциям времени.
Тенденции очень простые: то, что раньше делалось с перезагрузкой страницы, теперь делается без неё. Там, где раньше ты приходил на сайт один, теперь ты видишь, что тут же и твои друзья. Там где раньше ты жал релоад что бы увидеть результат, теперь тебе просто обновляют страницу.
Если вкратце, то: сервер стал гораздо активнее пихать данные в клиента. Веб-сокеты, комет, флеш — это всё транспорт и детали, но суть простая: теперь сервер является источником событий для клиента. Раньше такого практически не было.
И рельсы тут превращаются в кошмар. Там, где когда-то раньше можно было поднять vhost в passenger и просто кинуть файлы в папку, нужно городить огород из delayed job (rescue или чего-то ещё), comet server, messaging сервер и т.д. и т.п.
Одной из шокирующих новостей моего знакомства с эрлангом стало то, в нём не нужно этого огорода. Просто напиши код, пропиши зависимости и всё будет работать в одном процессе. Локальность данных по сравнению с рельсами сумашедшая, записи на диск во много раз меньше и удобство возрастает.
Понятно, что когда деплоишься на 10 серверов, то одним процессом уже не обойтись, но я бы хотел сейчас оставить этот вопрос в стороне. Слишком много оговорок и частностей, что бы говорить про абстрактный хайлоад в вакууме.
Хочется сконцентрироваться на одном несчастном проекте на 100 К уников в день, которому приходится покупать второй сервер, потому что рельсы тупо не справляются на одном из-за того, что дрочат базу, жрут CPU и память там, где говнокод на PHP (написанный в 5 раз дольше и в 3 раза дороже) справлялся бы на одном сервере.
И когда программисту такого сайта приходится добавлять милые штуки типа «оповестить онлайн-пользователя о том, что ему пришло личное сообщение» или просто приделать на сайт чат как во вконтакте/фейсбуке, начинается черти-что.
Удобство рельс заканчивается: мало того, что нужно возиться ещё с пачкой дополнительных демонов, их ещё надо выкатывать на продакшн, надо их запускать там, следить за ними, настраивать monit для них и т.д. и т.п.
Т.е. новые вызовы времени проходят мимо развития рельс. Глобальный и мучительный переход на 3-и рельсы обошел стороной вопросы потребления памяти, асинхронности работы и т.д. и т.п.
Хотя казалось бы: появились ведь файберы, решение ведь простое: запускать в одном процессе EventMachine с обработкой существенно большего количества пользователей. Или отказаться от MRI, начать миграцию на JVM что бы пользоваться ядрами.
В любом случае на EventMachine сегодня можно собрать удобный кусок кода, который будет в себе и delayed job сочетать, и Comet-сервер, и веб-обработку, но это всё будет мимо рельс.
Мне бы очень не хотелось видеть дробление усилий и надеюсь, что всё таки рельсы дадут адекватный ответ тем запросам, которые возникают сегодня.