Ответ 1
Самая большая причина заключается в том, что экосистема Rails не была построена для событийного ввода-вывода, а введение в приложение одного отдельного не входящего в IO ввода-вывода устраняет преимущества. Очень возможно написать код события в Ruby (и с Rails), но это не обязательно будет простым, так как не всегда ясно, когда самоцветы выполняют или не выполняют событие с IO, и разработчику нужно будет потратить много времени преследуя, где приложение может блокировать. Для сравнения, Node был создан с неявным идеалом, который IO никогда не должен быть синхронным, и вся его экосистема вытекает из этого идеала, а это означает, что разработчику не нужно беспокоиться о том, будут ли их операции ввода-вывода быть синхронным или нет; по умолчанию предполагается, что они асинхронны.
Кроме того, запущенные веб-приложения действительно полезны, когда вы привязаны к IO. Если ваше приложение привязано к процессору или выполняет тяжелую работу с синхронным процессором, то в любом случае потенциальная модель, вероятно, не подходит. Ruby может потребовать значительного количества CPU, в первую очередь из-за конструкций метапрограммирования языка и сборщика мусора (что должно существенно улучшиться в Ruby 2.1!), Что может сделать его менее подходящим, чем Node для запланированного программирования.
Rails имеет множество доступных моделей concurrency - forking, preemptive threading и eventing - и разработчик должен выбрать тот, который наилучшим образом соответствует их домену приложений. Викинг по умолчанию - это просто, не требует особых соображений (пока вы развертываете систему POSIX!), А Ruby не имеет системных потоков при создании Rails. Теперь, с Ruby 1.9+ (системные потоки, GIL) и JRuby (без GIL!), Многопоточный код очень прост в развертывании. Ruby 2.0 приносит COW-friendly сборщик мусора, что означает, что forking более эффективен, чем раньше.
В конце дня код события не является значением по умолчанию, потому что он требует больше работы от разработчика, и для многих людей модель forking по умолчанию достаточно хороша. В тех случаях, когда это не так, разработчик имеет вариант с потоковым или evented-кодом, который наилучшим образом соответствует их инфраструктуре и домену приложений.