RabbitMQ跟Redis做消息隊列的區別


區別

https://www.zhihu.com/question/20795043

 https://blog.csdn.net/dd18709200301/article/details/79077839

 

RabbitMQ安裝

https://blog.csdn.net/weixin_39735923/article/details/79288578

 

然后http://localhost:15672 進得去 說明安裝成功

 

有三種模式  fanout , direct topic   

fanout 發送到所有的隊列

direct 可以設置key 發送到對應的隊列

topic 第二種的增強版   key支持模糊匹配

 

自己創建賬號  不要用guest賬號(應用程序跟RabbitMQ在同一個電腦上  可以用guest登陸     guest賬號給限制了  無法通過外網登陸   )

賬號創建完成需要設置賬號權限才可以使用

 

1.生產者

            //創建連接工廠
            ConnectionFactory factory = new ConnectionFactory
            {
                //這是默認帳號密碼
                UserName = "guest",//用戶名
                Password = "guest",//密碼
                HostName = "localhost"//"192.168.157.130"//rabbitmq ip
            };

            //創建連接
            var connection = factory.CreateConnection();
            //創建通道
            var channel = connection.CreateModel();
            //聲明一個隊列
            channel.QueueDeclare("hello", false, false, false, null);

            Console.WriteLine("\nRabbitMQ連接成功,請輸入消息,輸入exit退出!");

            string input;
            do
            {
                input = Console.ReadLine();

                var sendBytes = Encoding.UTF8.GetBytes(input);
                //發布消息到hello隊列
                channel.BasicPublish("", "hello", null, sendBytes);

            } while (input.Trim().ToLower() != "exit");
            channel.Close();
            connection.Close();

 

2.消費者

            //創建連接工廠
            ConnectionFactory factory = new ConnectionFactory
            {
                UserName = "guest",//用戶名
                Password = "guest",//密碼
                HostName = "localhost"//"192.168.157.130"//rabbitmq ip
            };

            //創建連接
            var connection = factory.CreateConnection();
            //創建通道
            var channel = connection.CreateModel();

            //事件基本消費者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);

            //接收到消息事件
            consumer.Received += (ch, ea) =>
            {
                var message = Encoding.UTF8.GetString(ea.Body);
                Console.WriteLine($"收到消息: {message}");
                
                //確認該消息已被消費
                channel.BasicAck(ea.DeliveryTag, false);
            };
            //啟動消費者 設置為手動應答消息
            //監聽hello隊列
            channel.BasicConsume("hello", false, consumer);
            Console.WriteLine("消費者已啟動");
            Console.ReadKey();
            channel.Dispose();
            connection.Close();

  

channel.BasicAck(ea.DeliveryTag, false);
執行這句話就表示當前這條記錄已經被消費

可以在這句話之前執行調用接口 或者某些數據庫操作 成功在執行這句話 不成功該條信息還會放回隊列中


上面這種寫法是生產者直接把消息直接放到某個隊列中 一般我們不會這樣做 實際上都是生產者將消息發送到Exchange交換器中 由它將消息路由到一個或多個隊列(Queue)中

            string exchangeName = "TestFanoutChange";
            string queueName1 = "hello1";
            string queueName2 = "hello2";
            string routeKey = "";
            //創建連接工廠
            ConnectionFactory factory = new ConnectionFactory
            {
                //這是默認帳號密碼
                UserName = "guest",//用戶名
                Password = "guest",//密碼
                HostName = "localhost"//"192.168.157.130"//rabbitmq ip
            };

            //創建連接
            var connection = factory.CreateConnection();
            //創建通道
            var channel = connection.CreateModel();
            //定義一個Direct類型交換機
            channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout, false, false, null);

            //定義隊列1
            channel.QueueDeclare(queueName1, false, false, false, null);
            //定義隊列2
            channel.QueueDeclare(queueName2, false, false, false, null);

            //將隊列綁定到交換機
            channel.QueueBind(queueName1, exchangeName, routeKey, null);
            channel.QueueBind(queueName2, exchangeName, routeKey, null);

            //生成兩個隊列的消費者
            ConsumerGenerator(queueName1);
            ConsumerGenerator(queueName2);

            Console.WriteLine("\nRabbitMQ連接成功,請輸入消息,輸入exit退出!");

            string input;
            do
            {
                input = Console.ReadLine();

                var sendBytes = Encoding.UTF8.GetBytes(input);
                //發布消息到exchangeName交換機上  綁定到這個交換機上的所有隊列都會產生信息
                channel.BasicPublish(exchangeName, routeKey, null, sendBytes);

            } while (input.Trim().ToLower() != "exit");
            channel.Close();
            connection.Close();
        static void ConsumerGenerator(string queueName)
        {
            //創建連接工廠
            ConnectionFactory factory = new ConnectionFactory
            {
                UserName = "guest",//用戶名
                Password = "guest",//密碼
                HostName = "localhost"//rabbitmq ip
            };

            //創建連接
            var connection = factory.CreateConnection();
            //創建通道
            var channel = connection.CreateModel();

            //事件基本消費者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);

            //接收到消息事件
            consumer.Received += (ch, ea) =>
            {
                var message = Encoding.UTF8.GetString(ea.Body);

                Console.WriteLine($"Queue:{queueName}收到消息: {message}");
                //確認該消息已被消費
                channel.BasicAck(ea.DeliveryTag, false);
            };
            //啟動消費者 設置為手動應答消息
            channel.BasicConsume(queueName, false, consumer);
            Console.WriteLine($"Queue:{queueName},消費者已啟動");
        }
更具體的 見  https://www.cnblogs.com/stulzq/p/7551819.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM