Кокаин(Yandex cocaine) прекрасен своей масштабируемостью. Вот, например, есть у нас всего лишь одна нода и на ней всего одно приложение на nodejs. При возрастании нагрузки кокс сам запустит необходимое количество процессов nodejs, чтобы отдавать данные с минимальным откликом.
Приложения изолируются друг от друга. Путей изоляции несколько: proccess spawning, cgroups, docker.
И так, посмотрим на продакшен:
$ cocaine-tool info { "apps": { "site_web-1.0": { "load-median": 0, "profile": "spawn", "sessions": { "pending": 0 }, "queue": { "depth": 0, "capacity": 100 }, "state": "running", "slaves": { "active": 0, "idle": 1, "capacity": 10 } }, "test_site_web-1.1": { "load-median": 0, "profile": "spawn", "sessions": { "pending": 0 }, "queue": { "depth": 0, "capacity": 100 }, "state": "running", "slaves": { "active": 0, "idle": 0, "capacity": 10 } } } }У нас запущенно два приложения: продакшен, в который смотрит интернет и тест в который смотрит локальная сеть. Нагрузка в данный момент минимальна.
Попробуем пустить нагрузку. Я буду использовать yandex-tank. С линейным возрастанием количества запросов в секунду, а потом с постоянным RPS в течении 5 минут. Будем нагружать тестовое приложение :). Пульки заряжаем:
line(1,1000,1m) const(1, 800, 5m)
Пулим и смотрим, что происходит с кокаином:
ps aux | grep cocaine | wc -l 134
Кокс сам пустил дофигища своих форков, чтобы нормально отрабатывать запросы.
Довольно слов! А графики вот:
* http://storage1.static.itmages.ru/i/15/1013/h_1444741070_8277061_cc04f720d3.png
* http://storage5.static.itmages.ru/i/15/1013/h_1444741087_2241184_6546648048.png
* http://storage8.static.itmages.ru/i/15/1013/h_1444741106_8000667_4fdb5b0c2e.png
* http://storage9.static.itmages.ru/i/15/1013/h_1444741121_4574491_424dfe3a4b.png
* http://storage1.static.itmages.ru/i/15/1013/h_1444741138_7778052_204ac4dc16.png
Выглядит неплохо? Нагрузка, конечно небольшая и синтетическая.
А если вдруг нам станет не хватать этого сервера, то мы сходим на другой и зупустим приложение и там
cocaine-tool -h another.cox.node.example.com app start --name uber-app-0.1 --profile spawn --timeout 20000
И локатор найдет его там, и нагрузку пустит как надо, и будет хорошо, да.