RabbitMQ系列(二)-点对点模式
上一篇 : RabbitMQ系列(一)-单机部署
下一篇 : RabbitMQ系列(三)-工作队列模式
一、 介绍
1. Rabbitmq作为一个优秀的消息队列中间件,提供很多种消息生产消费的工作模式
2. 点对点模式只是其中的一种. 指的是一个同一时刻,一个生产者,一个队列,一个消费者.
3. 使用默认的default交换机,rootingkey是ququename
4. 下图是官网对这个模式介绍的一张图片.
二、 测试
2.1 生产者
- 首先安装Nuget包–>RabbitMQ.Client
- 生产者—>
static void Main(string[] args)
{
var factory = new ConnectionFactory
{
HostName = "192.168.3.20", # rabbit地址
Port = 5672, # 如果改了端口的需要在这里指定
UserName = "xxx", #登录名
Password = "xxx", #密码
VirtualHost = "/" #虚拟主机
};
#region 点对点
string queueName = "OneToOne"; # 声名队列
using var conn = factory.CreateConnection(); #创建连接
using var channel = conn.CreateModel(); #创建channel信道
channel.QueueDeclare(queue: queueName, # 声明队列
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
Console.WriteLine("请输入要发送的消息,如果发送完毕,输入ok即可.");
var sendMsg = "";
while (sendMsg != "ok")
{
sendMsg = Console.ReadLine();
var body = Encoding.UTF8.GetBytes(sendMsg);
channel.BasicPublish(exchange: "", # 发送消息
routingKey: queueName,
basicProperties: null,
body: body);
if (sendMsg == "ok")
{
Console.WriteLine("消息发送结束,按任意键退出.");
}
else
{
Console.WriteLine($"Send ====>{sendMsg}");
}
}
#endregion
Console.ReadKey();
}
- 此时咱们看到消息已经发送到了rabbitmq中,队列名称OneToOne.至于交换机请看下图.
- 从上图可以看到,在不绑定交换机的情况下,一律使用的都是rabbitmq的默认交换机.rootingkey是队列名称
2.2 消费者
var factory = new ConnectionFactory
{
HostName = "192.168.3.20", # rabbit地址
Port = 5672, # 如果改了端口的需要在这里指定
UserName = "xxx", #登录名
Password = "xxx", #密码
VirtualHost = "/" #虚拟主机
};
#region 点对点
string queueName = "OneToOne"; # 声名队列
using var conn = factory.CreateConnection(); #创建连接
using var channel = conn.CreateModel(); #创建channel信道
channel.QueueDeclare(queue: queueName, # 声明队列
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
#消费者是以事件的方式订阅消息的
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($"Received {message}");
};
channel.BasicConsume(queue: queueName, #消费完成通知rabbit
autoAck: true,
consumer: consumer);
#endregion
Console.ReadKey();
- 上两图可以看到消费完成后,rabbitmq的队列里面积压数清零了.
2.3 联动实时发送和消费测试
三、 总结
1. 上面博主介绍了点对点的工作模式和实现.
2. 但是实际上我们很少用这种方式,因为消费能力不足.只有一个生产者和一个消费者.
3. 但是在针对某些场景我们只能用点对点的方式,比如·强顺序消费·的场景.就只能点对点了. 要保证消息的顺序
4. 如有不对,欢迎指正.