已经使用了大约1-2年的小兔子.rabbitmq。但是我一直都很浮躁,并没有仔细的去阅读使用文档。用的是EasyNetQ,而且用的是最简单的send/Receive模式。
前面想用publish/Subscribe,但是不会用。打开小兔子的管理页面,看不懂。因为不知道数据是怎么来的,又是怎么被消费的。
听说MassTransit很强大。然后就试着用了一下。看了文档, 不懂。写了例子,神奇的事情发生了。Publish的数据。在各个客户端都收到呢?于是我就觉得还是用EasyNetQ。
有一个新的需求来了。缓存同步。缓存更新了。需要通知各个前端api要更新缓存了。总不能用send/Receive模式。publish是个什么意思?最后我决定还是读下文档吧。
看到了别人的写的文档。https://dotnet.ctolib.com/SFLAQiu-RabbitMQDemo.html
又看了小兔子的后台。Exchange 交换机。和队列 之间是什么关系我才明白了。
像EasyNetQ 的send/Receive模式。使用的是默认的交换机,类型是direct,直接发送到绑定的队列。
像publish的模式。使用的是fanout类型的默认的交换机。
可以在后台管理的exchange点开看得到bind的队列。
基本的消息通讯步骤就是首先定义ExChange,然后定义队列,然后绑定交换机和队列。
需要明确的一点儿是,发布者在发送消息是,并不是把消息直接发送到队列中,而是发送到Exchang,然后由交互机根据定义的消息匹 配规则,在将消息发送到队列中。
Exchange有四种消息消息分发规则:direct,topic,fanout,header。
来自:https://www.cnblogs.com/dandan123/p/10097711.html
1>有一个生产者send消息。4个消费者receive干活。应该使用同一个id.(同一个队列)=>(轮流的发送消息到各个消费者)
2>有一个生产者publish消息。不同消费者都要知道。需要绑定到同一个交换机上面。而且id不同。(不同队列)
使用EasyNetQ 来实现的话。可以参考 https://www.cnblogs.com/dandan123/p/10097711.html 封装的很好。
我的例子在http://127.0.0.1:15672/ 上面的结果。
关键代码。
服务端
using (var bus = RabbitHutch.CreateBus("host=127.0.0.1:5672;virtualHost=/;publisherConfirms=true;timeout=10"))
{
var exchange = bus.Advanced.ExchangeDeclare("exchnage2020", ExchangeType.Fanout);
//bus.Advanced
//模拟生成者
Random rd = new Random();
while (true)
{
#region 核心代码,其他可以不要
string message = $"你好,{System.Guid.NewGuid().ToString()}。";
bus.Advanced.Publish(exchange, "", false, new Message<string>(message));
//bus.Publish(message, "hello111");2222
#endregion
Console.WriteLine("发送信息:{0}", message);
//随机休眠
Thread.Sleep(TimeSpan.FromSeconds(rd.Next(10)));
}
}
消费端
using (var bus = RabbitHutch.CreateBus("host=127.0.0.1:5672;virtualHost=/;publisherConfirms=true;timeout=10"))
{
var exchange = bus.Advanced.ExchangeDeclare("exchnage2020", ExchangeType.Fanout);
var qu = bus.Advanced.QueueDeclare("A");
var qu2 = bus.Advanced.QueueDeclare("B");
bus.Advanced.Bind(exchange, qu,"");
bus.Advanced.Bind(exchange, qu2, "");
bus.Advanced.Consume<string>(qu, (message, info) =>
{
Console.WriteLine("A接收信息:{0}", message.Body);
});
bus.Advanced.Consume<string>(qu2, (message, info) =>
{
Console.WriteLine("B接收信息:{0}", message.Body);
});
//bus.Subscribe<string>("hello", (message) =>
// {
// Console.WriteLine("接收信息:{0}", message);
// });
// bus.Subscribe<string>("hello1", (message) =>
// {
// Console.WriteLine("接收信息hello1:{0}", message);
// });
while (Console.ReadLine() != "fuck")
{
}
}
我很遗憾,一个如此简单的小兔子,我花了1-2年还不知道如何使用。真的是太浮躁了。
记录备查。