Шаблон RabbitMQ для одного потребителя / одного издателя - PullRequest
0 голосов
/ 07 мая 2018

Я немного запутался / застрял. Я перечитывал лучшие практики RabbitMQ, и появляется много статей о том, что у вас должно быть два соединения - одно для вашего подписчика, а другое для вашего издателя.

Итак, что я в итоге сделал, так это запустил мой сервер так:

    amqp.connect(RABBIT_URL, (err, conn) => {
        conn.createChannel((ampqErr, subscribingChannel) => {
            // .....
    })

    amqp.connect(RABBIT_URL, (err, conn) => {
        conn.createChannel((ampqErr, publishingChannel) => {
            // .......
    });

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

Кроме того, на самом деле это не сработает, поскольку после выполнения задачи (т.е. завершения очистки страницы) в конце этого события мне нужно запустить событие, которое вызовет анализ в другом сервисе. Я в значительной степени делал

    ch.publish(...)

прямо перед тем, как я сделаю ack. Это не чисто, так как канал, который я использовал исключительно для потребления, теперь публикует события для запуска анализа из другого сервиса.

Этот тип заказа «событие / действие» осуществляется через 2 другие службы. (1. web / app -> 2. scrape -> 3. parse -> 4. analytics)

Мой план - просто вызвать событие после завершения в каждой службе. Это правильный способ сделать это?

Полагаю, есть два вопроса.

Спасибо .. спасибо .. большое спасибо тому, кто может мне здесь помочь. Потерял целые выходные, просто баловавшись. :(

1 Ответ

0 голосов
/ 05 июля 2018

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

Множество соединений и каналов, как лучший метод, не обязательно хорошо переводят в Node, поскольку цикл обработки событий является однопоточным, вы не получите никакой реальной выгоды, открыв несколько каналов, если вы не используете дочерние процессы или какую-либо другую форму потоков, что позволяет использовать оба канала одновременно.

Кроме того, на самом деле это не сработает, поскольку после выполнения задачи (т.е. завершения очистки страницы) в конце этого события мне нужно запустить событие, которое вызовет анализ в другом сервисе. Я в значительной степени делал ch.publish (...) прямо перед тем, как я сделаю подтверждение. Это не чисто, так как канал, который я использовал исключительно для потребления, теперь публикует события для запуска анализа из другой службы.

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

Мой план - просто вызвать событие после завершения в каждой службе. Это правильный способ сделать это?

Я не вижу проблем с этим методом, и я довольно широко использовал его в своих собственных микросервисах Node. Rabbit - очень надежная и гибкая система, и архитектура каждого будет отличаться в зависимости от их собственных потребностей приложений / услуг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...