[Practice Note] RabibtMQ多种模式实现

本文详细介绍了RabbitMQ的多种模式,包括简单模式、工作模式、发布订阅模式(fanout)、路由模式(direct)和主题模式(topics)。在简单模式中,生产者直接发送消息到队列,消费者直接消费。工作模式下,多消费者的消息分配可以通过Qos设置实现负载均衡。发布订阅模式下,消息广播到所有绑定的队列。路由模式引入了交换机和key匹配。主题模式则允许使用通配符进行模糊匹配,提供更灵活的消息路由。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目准备

本篇以控制台项目做讲解,在项目中添加一个生产者,两个消费者,一共三个控制台。
在每个项目中添加Nuget引用:RabbitMQ.Client
新建帮助类:

	public class MQHelper
    {
   
        public static ConnectionFactory GetConnectionFacroty()
        {
   
            return new ConnectionFactory()
            {
   
                HostName = "localhost",   //远程服务器设置为对方服务器IP地址或机器名称
                UserName = "guest",	      //RabbitMQ内置账号
                Password = "123456",	  //RabbitMQ账号密码
                RequestedHeartbeat = 0,
            };
        }
    }

简单模式

简单模式就是生产者直接将消息发送到队列,然后消费者直接消费
生产端代码:

public static void ProduceSimpleMode()
        {
   
            string queuename= "SimpleModeQue";
            var factory = MQHelper.GetConnectionFacroty();

            using (var connnection = factory.CreateConnection())
            {
   
                using (var channel = connnection.CreateModel())
                {
   
                    channel.QueueDeclare(queuename,false,false,false,null);

                    int i = 1;
                    while (i<=50)
                    {
                          
                        //消息内容
                        string message = "简单模式OneToOne 消息--" + i.ToString().PadLeft(4, '0');
                        var body1 = Encoding.UTF8.GetBytes(message);
                        //发送消息
                        Thread.Sleep(i * 10);
                        channel.BasicPublish("",queuename,null, body1);
                        Console.WriteLine("生产了消息:{0}", message);
                        i++;
                    }
                }

                Console.ReadLine();
            }

        }

消费者1 代码:

		public static void ConsumerSimpleMode()
        {
   
            var queuename = "SimpleModeQue";
            var factory = MQHelper.GetConnectionFacroty();
            using (var connnection = factory.CreateConnection())
            {
   
                using (var channel = connnection.CreateModel())
                {
   
                    channel.QueueDeclare(queuename, false, false, false, null);

                    QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
                    channel.BasicConsume(queuename, false, consumer);
                    channel.BasicQos(0, 1, true);    //能者多劳

                    int i = 1;
                    while (true)
                    {
   
                        BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                        byte[] bytes = ea.Body;
                        var message = Encoding.UTF8.GetString(bytes);
                        Console.WriteLine("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n收到第[" + i + "]条消息,内容:" + message);
                        Thread.Sleep(1000);
                        channel.BasicAck(ea.DeliveryTag, false);
                        i++;
                    }
                }
            }
        }

生产者与消费者1 主函数中分别调用上面的方法

工作模式

该模式相比简单模式,增加了消费者的数量!在消费者2中添加上面相同的代码

public static void ConsumerSimpleMode()
        {
   
            var queuename = "SimpleModeQue";
            var factory = MQHelper.GetConnectionFacroty();
            using (var connnection = factory.CreateConnection())
            {
   
                using (var channel = connnection.CreateModel())
                {
   
                    channel.QueueDeclare(queuename, false, false, false, null);

                    QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
                    //第二个设置是否自动应答
                    channel.BasicConsume(queuename, false, consumer);

                    //channel.BasicQos(0, 1, true);    //可以在生产者中定义

                    int i = 1;
                    while (true)
                    {
   
                        BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                        byte[] bytes = ea.Body;
                        var message = Encoding.UTF8.GetString(bytes);
                        Console.WriteLine("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值