在前一個教程中,我們創(chuàng)建了一個工作隊列。工作隊列背后的假設(shè)是每個任務(wù)會被交付給一個【工人】。在這一部分我們將做一些完全不同的事情--我們將向多個【消費者】傳遞信息。這種模式被稱為“發(fā)布/訂閱”。

   為了說明這種模式,我們將構(gòu)建一個簡單的日志系統(tǒng)。它將包括兩個程序,第一個將發(fā)出日志消息,第二個將接收并打印它們。

   在我們的日志系統(tǒng)中每個接收程序的運行副本都會得到消息。這樣我們就可以運行一個接收者程序,將日志記錄到磁盤;同時我們可以運行另一個接收者程序,并在屏幕上看到打印出來的日志。

   從本質(zhì)上講,已發(fā)布的日志消息將被廣播到所有的接收者程序。

1、消息交換機【Exchange】

   在教程的前面部分,我們從隊列中發(fā)送和接收消息。在RabbitMQ中,現(xiàn)在是時候引入全消息模型。

   讓我們快速看看我們以前的教程講了什么:

   【生產(chǎn)者】:就是一個用于發(fā)送消息的用戶程序
   
   【消費者】:就是一個用于接收和使用消息的用戶程序

   【隊列】:是一個暫存消息的緩存區(qū)

   RabbitMQ消息傳遞模型的核心思想是,【生產(chǎn)者】不直接發(fā)送任何信息到隊列。事實上,【生產(chǎn)者】根本就不知道消息是否會被傳送到任何隊列。

   相反,【生產(chǎn)者】只能發(fā)送消息到【消息交換機】。交換是件很簡單的事。一方面它接收來自【生產(chǎn)者】的消息,另一方面是將接收到消息推送到隊列中。【消息交換機】必須知道它如何處理接收消息的確切方法。是否應(yīng)該發(fā)送到特定隊列?它應(yīng)該被發(fā)送到多個隊列呢?或者它應(yīng)該被丟棄。該規(guī)則由【消息交換機】的類型來定義。
      
   這里有一些可用的【消息交換機】的類型:【Direct】直接,【Topic】主題,【Headers】標題和【Fanout】扇出。我們將集中關(guān)注最后一個-【Fanout】扇出。讓我們創(chuàng)建一個這種類型的【消息交換機】,并給它命名為Logs:

channel.ExchangeDeclare("logs", "fanout");


   【Fanout】類型的【消息交換機】非常簡單。正如你從名字可能猜出的,它只是傳播它收到的所有消息去它知道所有的隊列中。這正是我們需要我們的日志記錄器。

    顯示【消息交換機】的列表:

    使用Rabbitmqctl列出在服務(wù)器上可以運行的最有用的【消息交換機】

 sudo rabbitmqctl list_exchanges

    在這個列表中會有一些amq.*【消息交換機】和默認(未命名)消息交換機。這些都是默認創(chuàng)建的,但現(xiàn)在不太可能需要使用它們。

    默認的消息交換機

    在教程前面的部分我們隊【消息交換機】是一無所知,但是我依然可以發(fā)送消息去想去的隊列,那是因為我們使用了默認

網(wǎng)友評論