Издатель RabbitMQ - несколько подписчиков - как настроить. Net? - PullRequest
1 голос
/ 03 апреля 2020

Как настроить клиенты / очереди / обмены RabbitMQ для следующего сценария (в. Net)? У меня есть один сервер (назовем его server1), на котором запущено много служб (service1, service2 ...) и несколько клиентов (client1, client2, clientN). Я хочу, чтобы сообщения, генерируемые server1 service1, отправлялись всем клиентам, которые прослушивают сообщения от service1.

Мне удалось это сделать, но у меня есть одна проблема - очевидно, хотя сообщение получено клиентом, прослушивающим обмен / очередь service1 и AutoACK включены, сообщения не удаляются - когда приходит следующее старые приходят снова, и события клиентов Received запускаются столько раз, сколько было предыдущих сообщений.

Мне нужен минимальный пример для сервера / производителя (один отправляющий сообщения) и пример для клиентов, которые получают сообщения, основанные на некоторых ключ маршрутизации. Если нет клиентов, которые слушают этот указанный c ключ маршрутизации, не говоря уже о том, что сообщение может быть отброшено. Ключ маршрутизации заранее известен как серверу, так и клиенту, поэтому c клиент "знает", что он хочет получать сообщения от service2.

Текущая настройка такова:

Клиент код (этот слушает все сообщения, вот почему ключ маршрутизации «#» - некоторые клиенты определили ключ маршрутизации - service1 и т. д.

servicesChannel = conn.CreateModel();
servicesChannel.ExchangeDeclare("services", ExchangeType.Fanout);

var queueName = servicesChannel.QueueDeclare().QueueName;
servicesChannel.QueueBind(queue: queueName, exchange: "services", routingKey: "#");
var consumer = new EventingBasicConsumer(servicesChannel);
consumer.Received += (model, ea) =>
{
    // do bunch of stuff before
    log.Trace("Acknowledging message " + ea.DeliveryTag);
    // if we uncomment this, no more messages will arrive after 1st!
    //servicesChannel.BasicAck(ea.DeliveryTag, false);
}
servicesChannel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);

И код сервера, отправляющий сообщения:

servicesChannel= conn.CreateModel();
servicesChannel.ExchangeDeclare("services", ExchangeType.Fanout);
...
string message = Newtonsoft.Json.JsonConvert.SerializeObject(data, settings);
var body = Encoding.UTF8.GetBytes(message);
servicesChannel.BasicPublish(exchange: "services", routingKey: routingKey, basicProperties: null, body: body);

1 Ответ

0 голосов
/ 03 апреля 2020

То, что вы ищете, - это обмен Темами.

Кроме моего комментария о вас, опубликовал sh другой обмен.

Вы обмениваетесь, декларируйте:

servicesChannel.ExchangeDeclare("services", type: "topic");

Узнайте больше и посмотрите пример кода здесь: https://www.rabbitmq.com/tutorials/tutorial-five-dotnet.html

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