2011-02-04 1 views
1

Это связано с another question, относящимся к обработке платежей, и это мой пример использования, но я рассматривал попытку интегрировать node.js и ruby ​​на том же сервере, используя beanstalkd. В принципе, я хочу использовать node.js в качестве основного веб-сервера, но когда мне нужно сделать некоторую обработку платежей, я бы хотел использовать что-то надежное и стабильное, как ruby.Объединение node.js/ruby ​​с beanstalkd

Я рассматривал возможность использования beanstalkd в качестве способа выполнения задач обработки очереди node.js для рубинов для выполнения в фоновом режиме. Документация для beanstalkd немного тонкая, поэтому мне трудно понять, хорошо ли это, или как именно я буду заниматься этим. Из того, что я могу сказать, должно быть довольно просто начать процесс beanstalkd, а затем подключиться к нему node.js для отправки заданий и иметь рубиновый скрипт, который может выполнять задания и отправлять результаты.

+1

Вместо этого я бы использовал семантику очереди сообщений redis. Я думаю, это будет быстрее на node.js, потому что есть очень хорошее расширение c. – Alfred

ответ

0

Итак, после достаточного укоренения, я нашел документацию, которая мне действительно нужна, чтобы оценить beanstalkd. В источнике нет protocol document, который не связан ни с чем, что я читал, либо с главной страницей (хотя это находится в папке с именем doc), которая дает более подробную информацию о ее возможностях и ограничениях.

Кажется очень приятным в качестве асинхронной рабочей очереди, которая идеально подходит для node.js, и было бы неплохо связаться с некоторым кодом Ruby для обработки платежей, но, как говорит dkam, как мне получить ответьте back to node.js, чтобы иметь возможность обновлять клиент. Хотя я думаю, что это имеет смысл для многих задач, для меня этого недостаточно.

Учитывая совет Альфреда, я исследовал redis, и хотя это не совсем то, что мне нужно прямо из коробки, я думаю, этого будет достаточно. Существует уже actor library, построенный на вершине redis для Ruby, поэтому я думаю, что мне нужно сделать что-то простое, что может говорить между узлом и Ruby с семантикой примерно актерского стиля или, по крайней мере, с семантикой обратного вызова.

+0

Если бы вы использовали Beanstalk, я думаю, у вас будет Node.js создать запись транзакции, установить состояние в «Queued» или подобное. Эта запись станет состоянием транзакции для клиента - Node.js проведет опрос этой записи. Когда ваш процесс Ruby захватит задание, обновите запись БД до «Ожидание», после чего завершите «Завершить» или «Сбой». – dkam

+0

Я не уверен в этом, но у Redis есть PubSub, который, как я предполагаю, не использует опрос. Redis молниеносно и будет находиться в том же окне, что и узловые и рубиновые процессы. Я думаю, что это, вероятно, будет более чистая настройка, чем опрос базы данных. Рад слышать, если я ошибаюсь. –

3

Beanstalk подходит для выполнения этой задачи. Убедитесь, что вы используете опцию binlog, чтобы сделать задания постоянными между перезапусками beanstalkd.

Вашего Node.js процессы использовать трубку (называется, скажем, «платежи») и поставил рабочих мест в нем, с соответствующим приоритетом.

Ваш Ruby-скрипт может затем смотреть платежную трубку и обрабатывать задания.

Удостоверьтесь, что задание задано адекватным TTL - вы хотите, чтобы обработка платежей успела завершить до того, как beanstalk предположил, что задание не удалось и перезаписало его.

Просто любопытно - как вы сообщите клиенту, что платеж преуспел? Возможно, скрипт Ruby обновит запись в базе данных?

+0

Да, я в конечном итоге смог найти протоколы протокола beanstalkd, поэтому это имело смысл, но да, точкой отсчета была обратная связь. Я уверен, что единственный способ сделать эту часть - это иметь какую-то трубку возврата, которую node.js ждет или, возможно, даже обратную трубку, специфичную для идентификатора задания. В конце концов, я думаю, что redis может быть лучшим решением. –