RabbitMQ是什麼及如何安裝就不再贅述,百度一下就知道了,只是在配置方面要多加註意。
話不多說,先直接上一個簡範例程式碼
發送端:
ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { im.ExchangeDeclare("rabbitmq_route", ExchangeType.Direct); im.QueueDeclare("rabbitmq_query", false, false, false, null); im.QueueBind("rabbitmq_query", "rabbitmq_route", ExchangeType.Direct, null); for (int i = 0; i < 1000; i++) { byte[] message = Encoding.UTF8.GetBytes("Hello Lv"); im.BasicPublish("rabbitmq_route", ExchangeType.Direct, null, message); Console.WriteLine("send:" + i); } } }
接收端:
ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { while (true) { BasicGetResult res = im.BasicGet("rabbitmq_query", true); if (res != null) { Console.WriteLine("receiver:"+UTF8Encoding.UTF8.GetString(res.Body)); } } } }
發送端一次性發送一千條,發送過程很快,接收時相對要慢一些。
上述DEMO只限一個接收著,那相同的發送量,多個接收者會出現什麼情況,添加一個新的接收端,直接複製DEMO中接收端即可。
附上運行結果:
可以看到,在兩個接收端同時運行時,RabbitMQ 會按順序的分發每個訊息。當每個收到確認後,會將該訊息刪除,然後將下一個分發到下一個接收者,主要是因為RabbitMQ的迴圈分發機制。
上面簡單說了一下,在多個接收者時,因為迴圈分發的原因,訊息幾乎是兩個接收端對分的。
那麼如何將相同的訊息分發到多個接收端。
對發送端代碼進行修改:
ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);// 路由 int i = 0; while (true) { Thread.Sleep(1000); ++i; byte[] message = Encoding.UTF8.GetBytes(i.ToString()); im.BasicPublish("rabbitmq_route_Fanout", "", null, message); Console.WriteLine("send:" + i.ToString()); } } }
與上種方式比較,會發現在代碼注釋後面少兩段代碼,在設定了Fanout方式後,不需要再指定隊列名稱。停一秒是為了方便看結果,以免重新整理太快。
再來看看接收端代碼:
ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout); var queueOk = im.QueueDeclare();//1 im.QueueBind(queueOk.QueueName, "rabbitmq_route_Fanout", "");//2 var consumer = new QueueingBasicConsumer(im);//3 im.BasicConsume(queueOk.QueueName, true, consumer);//4 while (true) {var _result = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//5 var body = _result.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine("received:{0}", message); } }
當一個新的接收端串連時(消費者),需要一個申報一個新的隊列,注釋1處代碼,RabbitMQ在申報隊列時,如果不指定名稱會自動產生一個,這還是不錯的。
兩個接收端時運行結果,符合預期。
至於廣播方式有什麼不好之處,親自運行下就知道了.