Как настроить клиенты / очереди / обмены 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);