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

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

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

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

1、消息交換機(jī)【Exchange】

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

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

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

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

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

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

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


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

    顯示【消息交換機(jī)】的列表:

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

 sudo rabbitmqctl list_exchanges

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

    默認(rèn)的消息交換機(jī)

    在教程前面的部分我們隊(duì)【消息交換機(jī)】是一無所知,但是我依然可以發(fā)送消息去想去的隊(duì)列,那是因?yàn)槲覀兪褂昧四J(rèn)