在前一個教程中,我們創(chuàng)建了一個工作隊列。工作隊列背后的假設是每個任務會被交付給一個【工人】。在這一部分我們將做一些完全不同的事情--我們將向多個【消費者】傳遞信息。這種模式被稱為“發(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)者】的消息,另一方面是將接收到消息推送到隊列中?!鞠⒔粨Q機】必須知道它如何處理接收消息的確切方法。是否應該發(fā)送到特定隊列?它應該被發(fā)送到多個隊列呢?或者它應該被丟棄。該規(guī)則由【消息交換機】的類型來定義。
這里有一些可用的【消息交換機】的類型:【Direct】直接,【Topic】主題,【Headers】標題和【Fanout】扇出。我們將集中關(guān)注最后一個-【Fanout】扇出。讓我們創(chuàng)建一個這種類型的【消息交換機】,并給它命名為Logs:
channel.ExchangeDeclare("logs", "fanout");
【Fanout】類型的【消息交換機】非常簡單。正如你從名字可能猜出的,它只是傳播它收到的所有消息去它知道所有的隊列中。這正是我們需要我們的日志記錄器。
顯示【消息交換機】的列表:
使用Rabbitmqctl列出在服務器上可以運行的最有用的【消息交換機】
sudo rabbitmqctl list_exchanges
在這個列表中會有一些amq.*【消息交換機】和默認(未命名)消息交換機。這些都是默認創(chuàng)建的,但現(xiàn)在不太可能需要使用它們。
默認的消息交換機
在教程前面的部分我們隊【消息交換機】是一無所知,但是我依然可以發(fā)送消息去想去的隊列,那是因為我們使用了默認