RabbitMQ LVC 正在提供所有消息
RabbitMQ LVC is giving all messages
所以我安装了 RabbitMQ 插件 https://github.com/rabbitmq/rabbitmq-lvc-plugin 我在 c# 中使用,通过交换发送相同的值,每次订阅者启动时他都会收到所有消息,如果我继续发送我的消费者会收到同样的消息,我不知道这是否是它应该如何工作的,但我假设我只会收到最后一条消息,我正在做的事情有什么问题吗,或者我不明白它是如何工作的?
出版商代码:
var bus = RabbitHutch.CreateBus("host=brw20028419,brw20028414").Advanced;
var exchange = bus.ExchangeDeclare("lvc", "x-lvc");
var routingKey = "lvcTest";
ThreadStart start = () =>
{
while (true)
{
var key = Console.ReadKey();
if (key.Key == ConsoleKey.Enter)
{
var messageS = new Message<string>("value");
bus.Publish(exchange, routingKey, false, false, messageS);
}
else
{
break;
}
}
};
var thread = new Thread(start);
thread.Start();
消费者代码:
var bus = RabbitHutch.CreateBus("host=brw20028419,brw20028414").Advanced;
var exchange = bus.ExchangeDeclare("lvc", "x-lvc");
var queue = bus.QueueDeclare("q");
bus.Bind(exchange, queue, "lvcTest");
Console.WriteLine(" [*] Waiting for messages. " +
"To exit press CTRL+C");
bus.Consume(queue, (body, properties, info) => Task.Factory.StartNew(() =>
{
var message = System.Text.Encoding.UTF8.GetString(body);
var routingKey = info.RoutingKey;
Console.WriteLine(" [x] Received '{0}':'{1}'",
routingKey, message);
}));
"and everytime that the subscriber is up he receives all the messages, and if i keep sending the same message my consumer will get"
如项目自述文件所述
"The last value exchange acts like a direct exchange"
所以这是预期的行为。
与直接交换器的唯一区别是 lvc 交换器跟踪每个路由键的最后一条消息,因此当一个新队列使用特定绑定键绑定到交换器时,最后一条消息发布到交换器路由键等于绑定键(存储在缓存中)的路由键被发送到新添加的队列。
要理解,您可以更改生产者代码,以便在第一个消费者绑定到您的交易所后仅发送一条消息。然后将第二个消费者绑定到您的交换,使用相同的绑定密钥,即使您的生产者不发送任何新消息,第二个消费者也会收到与第一个消费者相同的消息,因为它已被 lvc 交换缓存。
所以我安装了 RabbitMQ 插件 https://github.com/rabbitmq/rabbitmq-lvc-plugin 我在 c# 中使用,通过交换发送相同的值,每次订阅者启动时他都会收到所有消息,如果我继续发送我的消费者会收到同样的消息,我不知道这是否是它应该如何工作的,但我假设我只会收到最后一条消息,我正在做的事情有什么问题吗,或者我不明白它是如何工作的? 出版商代码:
var bus = RabbitHutch.CreateBus("host=brw20028419,brw20028414").Advanced;
var exchange = bus.ExchangeDeclare("lvc", "x-lvc");
var routingKey = "lvcTest";
ThreadStart start = () =>
{
while (true)
{
var key = Console.ReadKey();
if (key.Key == ConsoleKey.Enter)
{
var messageS = new Message<string>("value");
bus.Publish(exchange, routingKey, false, false, messageS);
}
else
{
break;
}
}
};
var thread = new Thread(start);
thread.Start();
消费者代码:
var bus = RabbitHutch.CreateBus("host=brw20028419,brw20028414").Advanced;
var exchange = bus.ExchangeDeclare("lvc", "x-lvc");
var queue = bus.QueueDeclare("q");
bus.Bind(exchange, queue, "lvcTest");
Console.WriteLine(" [*] Waiting for messages. " +
"To exit press CTRL+C");
bus.Consume(queue, (body, properties, info) => Task.Factory.StartNew(() =>
{
var message = System.Text.Encoding.UTF8.GetString(body);
var routingKey = info.RoutingKey;
Console.WriteLine(" [x] Received '{0}':'{1}'",
routingKey, message);
}));
"and everytime that the subscriber is up he receives all the messages, and if i keep sending the same message my consumer will get"
如项目自述文件所述
"The last value exchange acts like a direct exchange"
所以这是预期的行为。
与直接交换器的唯一区别是 lvc 交换器跟踪每个路由键的最后一条消息,因此当一个新队列使用特定绑定键绑定到交换器时,最后一条消息发布到交换器路由键等于绑定键(存储在缓存中)的路由键被发送到新添加的队列。
要理解,您可以更改生产者代码,以便在第一个消费者绑定到您的交易所后仅发送一条消息。然后将第二个消费者绑定到您的交换,使用相同的绑定密钥,即使您的生产者不发送任何新消息,第二个消费者也会收到与第一个消费者相同的消息,因为它已被 lvc 交换缓存。