LINUX.ORG.RU

Как перехватывать все сообщения

 ,


0

2

Режиссер(Producer) посылает сообщение Потребителю(Consumer). Потребитель его потребляет, все хорошо. Я сделал ещё одного своего Потребителя и хочу перехватывать все сообщения от Режиссера, которые не предназначались мне. Точнее, я не буду их потреблять (не буду посылать отчет о потреблении), а мне нужно просто их видеть.

Может ли RabbitMQ такое сделать: приходит сообщение в очередь, он берет его и отправляет целевому потребителю и ещё моему потребителю. Вот как его заставить это сделать?

Использую nodejs c либой amqplib, сервер RabbitMQ на Ubuntu...

★★★★

Последнее исправление: gobot (всего исправлений: 1)

Может ли RabbitMQ такое сделать

Может. Приходит сообщение в точку обмена (exchange) ты на неё подписываешь (binding) всех, кого надо.

приходит сообщение в очередь

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

crutch_master ★★★★★
()
Ответ на: комментарий от gobot

Сообщения в rabbit шлются в exchange. Создай queue для слушателя всех сообщений, забинди exchange с сообщениями и binding key равным ‘#’ - все сообщения будут в этой очереди, оттуда их и читай.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Создай queue для слушателя всех сообщений

как? bindQueue()?

забинди exchange с сообщениями и binding key равным ‘#’

как?

Можно пример, пожалуйста, в терминологии https://amqp-node.github.io/amqplib/channel_api.html

В AMQP я вообще ничего не понимаю

gobot ★★★★
() автор топика

Режиссер(Producer)

Крутой перевод.

Miguel ★★★★★
()
Ответ на: комментарий от unC0Rr
let queue = "";
this.channel.assertQueue(queue, {
  durable: false,
  autoDelete: true  
}).then(() => {

  this.channel.bindQueue(queue, "myrpc", queue).then((res) => {

    this.channel.consume(queue, (rawMessage) => {
      console.info("rawMessage", rawMessage);
    })


  }).catch((e) => {
    console.error(e.stack)
  })
});



Вот шаблон, что тут нужно сделать?

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Как вариант, но это можно также настраивать прямо на самом сервере.

crutch_master ★★★★★
()
Ответ на: комментарий от firkax

Нс какой, китайский норм язык?

gobot ★★★★
() автор топика
Ответ на: комментарий от crutch_master

У меня сообщение отправляется в Direct точку(exchange). То есть, publish(", to, data).

В доках написано, что если указать пустые кавычки " в качестве точки, то сообщение будет отправляться прямо в очередь, указанную в ключе маршрутизации (A special case is sending " as the exchange, which will send directly to the queue named by the routing key)

Если я создам точку fanout, ну и очердь привяжу к ней. Разве сообщения будут попадать в мою точку? Ведь Режиссер отправляет в Direct точку.

gobot ★★★★
() автор топика
Ответ на: комментарий от unC0Rr

А в Direct точке можно забиндить по этому шаблону #? Мой Продюссер отправляет сообщение без указания Точки, но с указанием маршрутизируемого ключа(routing key). Насколько я понял, такие сообщения отправляется в Direct точку. Но вот в какую именно, если у меня несколько Direct точек? Или напрямую в очередь, у которой совпадает routing key? В ообщем, не получится сделать как я понимаю

gobot ★★★★
() автор топика
Последнее исправление: gobot (всего исправлений: 1)
Ответ на: комментарий от gobot

Не знаю, честно говоря. Такими извращениями не занимался. Но я так представляю, сообщение всё равно сначала попадает на default exchange, к которому таки можно забиндить очередь с шаблоном на любой ключ. Всегда можно для начала поэкспериментировать через веб-интерфейс рэббита, чтобы понять, что нужно сделать, прежде чем кодить.

unC0Rr ★★★★★
()

Кто такую упоротую терминологию придумал? Да и если придумал то я хз заменить на Источник/Вещатель/Генератор/ шлёт сообщение Приёмнику/Слушателю/Обработчику. И не потреблять, а принимать сообщения. Хоспади боже мой. ))))))))))

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от unC0Rr

ТС: Мб попробовать https://www.rabbitmq.com/firehose.html ? Но вообще, извращениями какими-то занимаешься. Лучше изучить технологию и понять, что делаешь фигню какую-то, чем вот так лезть удалять гланды через жопу.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Producer-Consumer

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

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от unC0Rr

На default автоматически биндятся все очереди. Если патерна нет, то он равен имени очереди. Так в доках прочитал.

gobot ★★★★
() автор топика
Ответ на: комментарий от unC0Rr

Да почему фигню? Ну мне нужны некоторые действия делать исходя из сообшений. Просто авторы софтины не предусмотрели хуки, евенты. Вот приходится как то перехватывать.
Ладно, буду подключаться к уже созданной очереди тогда консумером. Вот только динамические имена у них...тоже надо как то перехватывать

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Консумеры читают сообщения из очереди по очереди.

unC0Rr ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Просто producer это в том числе «производитель/поставщик/генератор». У слова больше одного перевода (как и для большинства слов) и надо выбирать по контексту. А ТС учил английский по титрам фильмов или троллит.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

О боже, совсе ч/ю нет? ) как звучит так и написал )

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

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

Тогда сообщения будут делиться пополам. Одно тебе, другое ему.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от gobot

Просто авторы софтины не предусмотрели хуки, евенты. Вот приходится как то перехватывать.

Не предусмотрели, что кто-то не будет владеть кодом и пихать костыли с перехватом? Да, упущение.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Нет. Софртина - кластер, состоящий из микросервисов, общающихся меж собой посредством Кролика. Это по сути Framework. Хотя с другой стороны - из коробки рабочая система с веь-админкой. Я кастомизирую все это под себя. Мне надо по событию Х запустить некое действие. Можно конечно логи парсить и там отлавливать, но я решил делать это на уровне Кролика

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Хмм, а вот это плохо. Какие решения могут быть?

Отправлять в exchange, а не очередь.

crutch_master ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.