НовостиОбзорыСобытияIT@Work
Сети/Серверы/СХД/ЦОД:

Блог

Поучительная история про Ruby, JavaScript и немножечко про Микрософт

Крупнейший сервис коллективных скидок Groupon за последний квартал подрос на 10% и стоит сегодня 1,34 млрд. долл. Но когда он был еще совсем маленьким стартапом с небольшим числом пользователей и единичными программистами (в конце прошлого десятилетия), фронтенд для своей системы решено было делать на Ruby on Rails -- исходя из соображений прежде всего максимальной простоты и скорости разработки.

Архитектура исходно была проста: клиент через самый популярный в среде highload-разработчиков всего мира веб-сервер nginx Игоря Сысоева обращался к скриптам Ruby, которые в свою очередь взаимодействовали с целостным кластером MySQL.

Однако бизнес, неожиданно :) стал успешно расти, и такая монолитная система стала сильно тормозить, а все плюсы исходной мини-архитектуры, связанные с ее простотой, тут же превратились в минусы. Groupon запустила 48 национальных центров в разных странах, выяснив попутно, что уже около половины пользователей заходят на сайт с мобильных устройств. В процессе расширения также были приобретены менее удачливые конкуренты, среди которых был и весьма массовый CityDeal. Их архитектура тоже не сильно отличалась от Groupon: только вместо nginx -- Apache, вместо Ruby -- Java, вместо MySQL -- PostgreSQL. И так же, все попытки сделать эту архитектуру многозвенной завершились неудачей. Одной из главных проблем, в частности, стало бутылочное горлышко БД -- операции записи занимали слишком много времени. Кроме того, над монолитным кодом Ruby трудился уже крупный коллектив разработчиков, система стала тяжелой и неповоротливой, локально запустить ее стало практически нереальным -- а как отлаживаться? В итоге борьба даже с маленькими багами приводила к каскадным сбоям в проектной системе.

Решено было, как водится, переделать всю систему с нуля, но главный акцент делался на масштабировании системы и эффективной поддержке мобильных юзеров. Теперь система разбита на десятки независимых модулей, которые взаимодействуют с БД через унифицированный API. В итоге и развивать такую крупную систему стало легче, и заработала она заметно быстрее. Интересное же в этом проекте то, что надо было решить типовую задачу эффективной параллельной обработки множества входящих HTTP-запросов, которые обращаются к внутреннему API системы.
Подробнее про историю с техническими деталями можно прочитать тут:
https://engineering.groupon.com/2013/misc/i-tier-dismantling-the-monoliths/

Перепробовав немало доступных решений, архитекторы Groupon решили остановиться на Node.js! Эта популярная свободная платформа, использующая JavaScript на стороне сервера (на движке V8), в принципе, и применяется для схожих целей, но данный проект стал крупнейшим в мире внедрением Node.js -- потому как к JavaScript отношение со стороны корпоративных разработчиков пока не очень серьёзное.
Но первая ласточка прилетела, и наверняка теперь стоит ждать целых стай.

Чем же так хорош Node.js, в сравнении с Ruby on Rails и, главное, Java, которая по сей день во множестве крупных организаций считается корпоративным стандартом серверного программирования? И Ruby, и Java, тащат с собой унаследованный груз концепций, которые появились задолго до современных систем, обслуживающих сотни миллионов пользователей. А Node.js создавался именно с прицелом на онлайновую масштабируемость и быстродействие, с отказом от низкопроизводительных схем «поток на соединение». Практика показала, что технология получалась удачной и работоспособной.

Официально признала это Микрософт -- в ноябре она выпустила NTVS, плагин Node.js Tools for Visual Studio 12/13, который теперь позволяет разрабатывать, отлаживать в Windows/MacOS/Linux, и даже профилировать node.js-приложения (с помощью V8). Показательна и поспешность, с которой плагин выпущен (видимо, дабы поскорее подсадить на него грядущее поколение серверных программистов) -- даже в альфа-версии он уже открыто выложен: http://nodejstools.codeplex.com/

Что приятно, участвует в этой разработке, судя по ФИО, наш соотечественник Дмитрий Третьяков.