Node.js Разветвление AMQP

#javascript #node.js #rabbitmq

#javascript #node.js #rabbitmq

Вопрос:

Я пытаюсь построить распределенную систему, я использую postwait / node-amqp. Будучи новичком в этом, я нахожу документы очень бесполезными.

Теперь схема моего плана:

 Client -> Gate -> Q -> EatProcessor
                    -> WalkProcessor
                    -> Logger
  

Допустим, клиент отправил Start Eating . Gate Получает это и добавляет к Q сообщению, поскольку сообщение о том, что eating только EatProcessor Q должен получить сообщение от, должно получить сообщение от.

Итак, давайте скажем, EatProcessor:

 connection.queue('Q', {autoDelete: false}, function(queue){
        queue.subscribe(function(msg){
            // recv message
        });
    });
  

Итак, как мне:

  • Пусть процессор Eat получает только данные eat из Q
  • Пусть обработчик обхода получает только материал для обхода из Q
  • И регистратор получит все из Q и просто зарегистрирует.

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

Если разветвление, означает ли это, что все получат сообщение? Допустим, я еще не написал регистратор, я напишу его в функции, но когда я напишу его, я хотел бы просто прослушать непосредственно Q и не изменять никакого кода в Gate .

Комментарии:

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

2. итак, есть q, ходить q и регистрировать q? как бы я отправлял сообщения всем q?

3. ДА. Используйте обмены (определите один и привяжите к нему несколько очередей). Подробнее об этом читайте здесь: rabbitmq.com/tutorials/tutorial-three-python.html

4. Как бы это было в node.js ?

Ответ №1:

Хорошо, итак, в первую очередь используйте exchange. Таким образом, вы сможете публиковать более чем в одной очереди одновременно. Я не знаю RabbitMQ с Node.js но я думаю, что что-то подобное должно сработать:

 // define a queue for each type
connection.queue('eat-q', {autoDelete: false}, function(eat_queue) {
    // ...
    connection.queue('walk-q', {autoDelete: false}, function(eat_queue) {
        // ...
        connection.queue('log-q', {autoDelete: false}, function(log_queue) {
            // ...
        });
    });
});
  

Затем определите exchange и выполните привязку:

 connection.exchange('my-exchange', function(exchange) {
    eat_queue.bind('my-exchange', 'eat', function() {
        // ...
    });
    walk_queue.bind('my-exchange', 'walk', function() {
        // ...
    });
    log_queue.bind('my-exchange', 'walk', function() {
        // ...
    });
    log_queue.bind('my-exchange', 'eat', function() {
        // ...
    });
});
  

Наконец-то вы можете публиковать на бирже:

 exchange.publish('eat', 'my message', {}, function() {
    // ...
});
  

Сообщение должно заканчиваться в обоих eat-q и log-q .

Обратите внимание, что здесь следует использовать какую-нибудь библиотеку потоков, такую как у caolan async.js или вопрос крисковала, потому что в итоге вы получите множество обратных вызовов. Я предпочитаю второе.

Комментарии:

1. Я также могу просто сделать var eat_q = conn.queue('eat-q'); или я ошибаюсь? Я думаю, мы можем избежать вложенных обратных вызовов для этого, верно?

2.В документации говорится, что conn.queue() Returns a reference to a queue

3. conn.exchange Также не обязательно должен быть обратный вызов, он также возвращает ссылку на объект exchange.

4. также как насчет принимающей части? Как мне восстановить сообщение из eat?

5. q = con.queue('eat-q') Тогда subscribe я понимаю.