2015-01-21 4 views
3

Я работаю над сервисом, который каждые пять минут должен анализировать данные из социальных сетей для разных пользователей. Я разрабатываю его в node.js, и я реализую его на Heroku.Разработка часов и рабочих в node.js на heroku

Согласно this article на сайте Heroku, лучший способ сделать это - отделить логику планировщика от работника. На самом деле, идея состоит в том, чтобы иметь один динамик, предназначенный для планирования задач, чтобы избежать дублирования. Этот дино задает ферме рабочих (n dynos по мере необходимости) для выполнения этих задач.

Вот PROCFILE этой архитектуры:

web: node web.js 
worker: node worker.js 
clock: node clock.js 

Проблема заключается в том, как реализовать это в Node.js. Я googled это, и предложение - использовать системы очереди сообщений (например, IronMQ, RabbitMQ или CloudAMQP). Но я пытаюсь установить свой код и приложение просто и с незначительной необходимостью надстройки.

Вопрос: есть ли способ связи непосредственно с моим планировщиком (часами) с рабочими динамиками?

Спасибо за ваши ответы.

+0

Очередь, безусловно, путь сюда .. –

+0

Создать REST API может быть другим способом? –

ответ

0

Если я правильно понял это, вы хотите открутить часы в виде одного приложения, а затем открутить работников как отдельные приложения? Конечно, есть прямой путь. Вы открываете соединение с часовым приложением в рабочем приложении.

Например, у каждого работника открываются соединения клиентских сокетов с часами. Затем часы могут общаться с ними и ретранслировать заказы.

Или используйте WebRTC. Таким образом, рабочие будут разговаривать с часами, но они также могут разговаривать друг с другом.

Или сделайте (аутентифицированный) HTTP (ы) конечную точку REST для рабочего, где он получит задания. Например, POST /tasks создаст задачу для рабочего. Если задача короткая, она может сразу ответить, чтобы часы знали, что задание выполнено. Или, если это более длинная задача, она может это подтвердить, но позже позвоните в конечную точку на часах, чтобы сказать, что это сделано, что-то вроде PUT /tasks/32.

Или даже более прямо, откройте прямое сетевое соединение к часам, например, при запуске рабочего стола (и наоборот). Используйте dgram и отправьте сообщения UDP между рабочим и часами.

В любом случае, я также считаю, что люди, предлагающие MQ, такие как RabbitMQ, намного лучше просто нажимать задания/задачи. Затем он может распределять задачи по мере необходимости и на основе unacked рассчитывать на очередь заданий, при необходимости он может увеличивать число рабочих.

Но ваш вопрос очень широк, поэтому, чтобы получить более подробную информацию, вы могли бы предоставить более подробную информацию.

2

У процессоров Heroku нет фиксированных IP-адресов, поэтому нет возможности открыть прямое соединение между ними. Вот почему вам нужно создать отдельный экземпляр сервера со статическим IP или другим фиксированным конечным пунктом, который действует как промежуточный.

У вас есть как минимум два жизнеспособных варианта: очередь сообщений типа RabbitMQ или урезанная версия, использующая фид pub-sub redis. Я обычно использую последний, потому что он быстрый, простой и достаточно прочный для всех моих потребностей (например, если сообщение теряется каждый раз в синей луне, это не имеет большого значения). Если, однако, важно, чтобы вы никогда не теряли сообщение, вы должны использовать полномасштабную очередь сообщений, такую ​​как RabbitMQ.

Настройка реализации redis очень проста. Есть несколько redis-надстроек (я использую RedisCloud) со свободными и недорогими планами. Когда вы их устанавливаете, вы получаете конечную точку для подключения и пароль. Затем вы просто подключаете свои веб-дино (ы) и рабочие динамо (ы) к вашему экземпляру redis, чтобы ваше веб-приложение публиковало задания на канал, а работник подписывался на этот канал.

Если вам требуется веб-приложение для связи с клиентом после завершения задачи, вы просто создаете еще один канал для публикации работника для публикации сообщений о завершении задачи и веб-приложения для их прослушивания.

Вы никогда не получите дублирование задач, так как каждый раз, когда рабочий получает сообщение, оно вылетает из очереди.

+0

не может ли рабочий иметь свой собственный таймер? Как делать работу каждые 5 минут? – Toolkit

Смежные вопросы