Почему рельсы не полностью поддерживают отправку кода с кодом из коробки

После выхода Node.js это было единственное, что популяризировало запущенное программирование. Но у Ruby есть EventMachine, который поддерживает запись событийного кода.

Требования для поддержки событий в рельсах:
1. Событийный сервер (тонкий, радуга), который запускает реактор
2. Fibers (Ruby 1.9.3), чтобы упростить запись кода, иначе мы могли бы использовать потоки.
3. Все события, связанные с драгоценными камнями (пример mysql2).

Nodejs показал очевидные преимущества программируемого события. Итак, почему сообщество рельсов НЕ принимает eventmachine? Я думаю, что одна из причин, по которой рельсы не полностью переносимы на eventmachine, связана с зависимостью от основных драгоценных камней, которые могут не отображаться. Но кто-нибудь знает, есть ли план сделать движение в этом направлении?

Rails может делать то, что делает Nodejs, но Nodejs начал свою работу, выступая за программирование на всех организаторах библиотек, поэтому в соответствии с большинством зависимостей, которые вы добавляете к package.json в node, вы знаете, что это будет событие и будет работайте с nodejs из коробки.

Ответ 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-кодом, который наилучшим образом соответствует их инфраструктуре и домену приложений.