RabbitMQ的六种工作模式

一、普通队列模式

1.  一个消费者,一个队列,一个消费者。
2.  消息产生消息放入队列,消息的消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失)应用场景:聊天(中间有一个过度的服务器;p端,c端)

22.cnblogs.com/blog/1913282/202207/1913282-20220730231124618-1368574550.png)

  • 获取RabbitMQ连接帮助类

    后面代码,这部分创建连接共用

    public class RabbitMQHelper
        {
            /// <summary>
            /// 获取RabbitMQ连接
            /// </summary>
            /// <returns></returns>
            public static IConnection GetConnection()
            {
                //实例化连接工厂
                var factory = new ConnectionFactory
                {
                    HostName = "127.0.0.1", //ip
                    Port = 5672, // 端口
                    UserName = "Admin", // 账户
                    Password = "Admin", // 密码
                    VirtualHost = "/"   // 虚拟主机
                };
    
                return factory.CreateConnection();
            }
        }
  • 生产者

    public class Send
    {
    
        public static void SendMessage()
        {
            string queueName = "normal";
    
            //1.创建链接
            using (var connection = RabbitMQHelper.GetConnection())
            {
                // 2.创建信道
                using(var channel = connection.CreateModel())
                {
                    // 3.声明队列
                    channel.QueueDeclare(queueName, false, false, false, null);
                    // 没有绑定交换机,怎么找到路由队列的呢?
                    for (int i = 1; i <= 30; i++)
                    {
                        //4.构建Byte消息数据包
                        string message =$"第{i}条消息";
                        var body = Encoding.UTF8.GetBytes(message);//消息以二进制形式传输
    
                        // 发送消息到rabbitmq,使用rabbitmq中默认提供交换机路由,默认的路由Key和队列名称完全一致
                        //5.发送数据包
                        channel.BasicPublish(exchange: "", routingKey: queueName, null, body);
                        Thread.Sleep(1000);//添加延迟
                        Console.WriteLine("生产:" + message);
                    }
                }
            }
    
        } 
    }
  • 消费者

    public class Receive
    {
        public static void ReceiveMessage()
        {
            // 消费者消费是队列中消息
            string queueName = "normal";
            //1.建立链接链接
            var connection = RabbitMQHelper.GetConnection();
            {
                //2.建立信道
                var channel = connection.CreateModel();
                {
                    //3.声明队列:如果你先启动是消费端就会异常
                    channel.QueueDeclare(queueName, false, false, false, null);
                    //4.创建一个消费者实例
                    var consumer = new EventingBasicConsumer(channel);
                    //5.绑定消息接收后的事件委托
                    consumer.Received +=(model, ea) => {
                        var message = Encoding.UTF8.GetString(ea.Body.ToArray());
                        Thread.Sleep(1000);
                        Console.WriteLine(" Normal Received => {0}", message);
                    }; 
                    //6.启动消费者
                    channel.BasicConsume( queue: queueName, autoAck:true, consumer);//开始消费
                }
    
            }
    
        } 
    }

二、工作队列模式

  1. 一个消费者,一个队列,多个消费者。但多个消费者中只会有一个会成功地消费消息

  2. 消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2,同时监听同一个队列,消息被消费?C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患,高并发情况下,默认会产生某一个消息被多个消费者共同使用。

  3. 应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)

  • 生产者

    public class WorkerSend
        {
    
            public static void SendMessage()
            {
                string queueName = "Worker_Queue";
    
                using (var connection = RabbitMQHelper.GetConnection())
                {
           
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值