#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
я понимаю.