生成者就是發送信息,消費者就是接收信息,隊列就是存儲數據的排隊。消息經過你的應用程序和RabbitMQ進行傳輸,它們只能存儲在隊列中,隊列容量沒有限制,你要存儲多少消息均可以——基本上是一個無限的緩衝區。多個生產者(producers)可以把消息發送給同一個隊列,一樣,多個消費者(consumers)也能從同一個隊列(queue)中獲取數據。
MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通訊方法。應用程序經過讀寫出入隊列的消息(針對應用程序的數據)來通訊,而無需專用鏈接來連接它們。
RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。RabbitMQ服務器是用Erlang語言編寫的,而集羣和故障轉移是構建在開放電信平臺框架上的。全部主要的編程語言均有與代理接口通信的客戶端庫。消息傳遞相較文件傳遞與遠程過程調用(RPC)而言,彷佛更勝一籌,由於它具備更好的平臺無關性,並可以很好地支持併發與異步調用。對操做的實時性要求不高,而須要執行的任務極爲耗時,存在異構系統間的整合等效果更好。使用工做隊列的一個好處就是它可以並行的處理隊列。若是堆積了不少任務,咱們只須要添加更多的消費者(Consuming)就能夠了,擴展很簡單。html
> 1. 這是一個ASP.NET Core Web項目,主要展現RabbitMQ的使用
> 2. ReceiveMQ接收消息項目
> 3. SendMQ發送消息項目
> 4. 若是發送的信息不少的時候,能夠啓動多個消費者(ReceiveMQ)git
using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text; using System.Threading; /// <summary> /// 接收信息 /// </summary> namespace ReceiveMQ { class Program { static void Main(string[] args) { Console.WriteLine("銷售者開始運行"); var factory = new ConnectionFactory() { HostName = "localhost", Port = 32850, UserName = "test", Password = "test123" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); //模擬接受者 var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine("接收信息:{0}", message); }; while (true) { channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer); Thread.Sleep(TimeSpan.FromSeconds(10)); Console.WriteLine("每隔10秒接收一次"); } } } } }
using RabbitMQ.Client; using System; using System.Text; using System.Threading; /// <summary> /// 發送信息 /// </summary> namespace SendMQ { class Program { static void Main(string[] args) { Console.WriteLine("生產者開始運行"); var factory = new ConnectionFactory() { HostName = "localhost", Port = 32850, UserName = "test", Password = "test123" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); //模擬生成者 Random rd = new Random(); while (true) { string message = $"你好,{rd.Next(10)}。"; var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body); Console.WriteLine("發送信息:{0}", message); //隨機休眠 Thread.Sleep(TimeSpan.FromSeconds(rd.Next(5))); } } } } }
設置用戶名和密碼而且啓用管理頁面
docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management
https://github.com/jasonhua95/samll-project/tree/master/RabbitMQDemogithub
利用開源庫實現RabbitMQ,EasyNetQ操做RabbitMQ(高級消息隊列),另外一種簡單的方式操做消息隊列。docker