Microsoft Azure平臺提供了不同類型處理消息或事件的服務(wù)。用戶可以將他們的應(yīng)用數(shù)據(jù)(消息/事件)傳遞到這些服務(wù)中,也可以通過一定應(yīng)用程序或者服務(wù)獲取放在這些服務(wù)中的數(shù)據(jù)。對于剛開始或者準(zhǔn)備開始使用Azure消息&事件服務(wù)的用戶來講,心里會存有以下疑問:這些消息&事件服務(wù)有什么區(qū)別,各有什么特征呢?或者這些服務(wù)分別適用于哪些應(yīng)用場景呢?這篇文章就以上的問題展開做詳細(xì)的介紹。
首先我們來看一下在Azure平臺上有哪些可用的消息/事件服務(wù),目前Azure平臺提供8種不同類型的消息/事件服務(wù)它們分別是:
·Storage queue
·Service bus queue
·Service bus topic
·Event Hub
·IOT Hub
·Service bus Relay
·Notification Hub
·Event Grid
通過以下圖表我們先直觀清晰的對這些服務(wù)有一個大概的了解。
接下來我們就這些服務(wù)分別做相應(yīng)的介紹:
1.Storage queue
a.什么是Storage queue
Storage queue服務(wù)是Azure存儲提供的存儲服務(wù)之一,也是Azure平臺最早出現(xiàn)的messaging服務(wù),可以追溯到2010年。Storage queue允許用戶存儲大量的消息,這里講的量可達(dá)到甚至幾百TB的數(shù)量級。
b.適用場景
如果用戶剛開始接觸云端消息隊列服務(wù),并且有需求存儲TB數(shù)量級別的消息時,可以考慮使用Storage queue。
c.服務(wù)特性
Storage queue服務(wù)的主要優(yōu)勢在于:實現(xiàn)簡單,節(jié)省費用(用多少付多少),支持存儲大量的消息。
另外Storage queue支持在消費消息時"at least once"的模式,換句話說一個客戶端接收某條消息后,這條消息不會從服務(wù)端被刪除掉,這樣其他的客戶端也可以再次接收該條消息。因此使用Storage queue服務(wù)時要注意接收端可能會受到重復(fù)消息。
Storage queue有一項很有意思的功能是其他Azure消息服務(wù)沒有的,那就是Storage queue提供記錄日志的功能,用戶需要在Storage服務(wù)端開啟日志記錄功能,這樣所有對queue的操作包括這些操作來源于那些IP地址都會被記錄,方便用戶去檢索對應(yīng)的操作行為。
d.一些限制和說明
用戶在使用Storage queue的時候,有些服務(wù)端的限制也需要考慮,比如在Storage queue里能夠存儲的消息大小最大為64KB,消息最多可以在服務(wù)端存放7天(Max TTL=7 days)。
2.Service bus queue
a.什么是Service bus queue
Azure Service bus queue相比較Storage queue是Microsoft Azure提供的具備更強(qiáng)大功能、更復(fù)雜的消息傳遞服務(wù),可以支持更加復(fù)雜的消息傳遞解決方案。
當(dāng)我們從Service bus queue中接收消息時支持"First In,First Out(FIFO)"的消息傳遞模式,這種模式下每條消息只能被一個消費端接收。
b.服務(wù)特性
Service bus queue有一個很特殊的功能,就是dead-letter queue,簡單講,就是當(dāng)客戶端無法成功接收到某條消息或者消息在一定的期限中過期沒有被接收時,該條消息會自動轉(zhuǎn)移到第二個隊列中,也就是dead-letter queue。
另外Service bus queue的一個很有意思的功能就是可以檢測重復(fù)消息,一旦開啟該功能,如果接收端重復(fù)接收一條已經(jīng)接收過的消息,第二條重復(fù)的消息會被忽略。
值得被提的一點是我們提供兩種不同從Service bus queue中接收消息的方式,分別是"Peek and Lock"和"Receive and Delete",當(dāng)用戶采用第一種方式(也是默認(rèn)方式)接收消息時,當(dāng)接收端還在處理該條消息的時候,這條消息會被服務(wù)端鎖定,從而其他接收端無法接收該條消息,直到接收端成功處理完這條消息后,這條消息才會從queue中刪除掉。如果在一定的時間段(可以設(shè)置的timeout時間)服務(wù)端還是沒有收到接收端的成功接收的返回請求,那么該條消息會被服務(wù)端解除鎖定重新釋放掉,這個時候其他的接收端可以再次接收這條消息。
c.與Storage queue的區(qū)別
首先Service bus queue與Storage queue底層的實現(xiàn)是完全不一樣的。相比較Storage queue,Service bus queue存儲的的消息大小最大可以達(dá)到256KB,并且可以根據(jù)屬性TimeSpan.Max調(diào)整消息存儲在服務(wù)端的時間,滿足用戶需要長時間存儲消息的需求,然而不同與Storage queue強(qiáng)大的存儲功能,Service bus queue最大能存放80GB的消息。
其次Service bus queue服務(wù)支持使用AMQP 1.0協(xié)議進(jìn)行數(shù)據(jù)傳輸,這一特點很好的適用于嵌入式設(shè)備。這意味著,用戶可以使用Service bus queue構(gòu)建cross-platform的混合應(yīng)用,用戶也可以在不同的操作平臺上使用不同語言和開發(fā)框架去連接Service bus queue。
最后正如我們上一節(jié)“服務(wù)特性”中講到的,相比較Storage queue,Service bus queue提供更豐富更強(qiáng)大的消息傳遞功能。
更多關(guān)于Storage queue與Service bus queue的區(qū)別用戶可以參考官方對比文檔。
d.適用場景
Service bus服務(wù)主要提供給用戶一種強(qiáng)大的企業(yè)級消息傳遞解決方案,在這種典型的云端消息方案體系下,Service bus將服務(wù)端和應(yīng)用程序進(jìn)行分離。
細(xì)心的讀者在閱讀Service bus queue的“服務(wù)特性”章節(jié)后不難發(fā)現(xiàn),Service bus queue更加適用于對消息敏感(即不允許重復(fù)消息、不允許消息丟失),需要長期存儲消息的使用場景。
e.一些限制和說明
Service bus服務(wù)提供不同的等級(SKU)供用戶選擇,在標(biāo)準(zhǔn)和高級版本(目前高級版本還沒有在中國上線)的服務(wù)中,Service bus queue最大可以到達(dá)80GB。
另外在在同一個命名空間下(namespace)的所有服務(wù)(包括Service bus queue以及Service bus topic)最大的并發(fā)連接數(shù)可以達(dá)到5000個,這里包括接收端的連接也包括發(fā)送端的連接。
3.Service bus topic
a.什么是Service bus topic
Service bus topic與Service bus queue很類似,因此Service bus queue所具備的功能topic都有。但是Service bus topic還有一個非常重要也區(qū)別于queue的功能,就是一條消息發(fā)送到topic中,可以生成多個copy根據(jù)一定的規(guī)則分發(fā)到多個的接收端,這里我們稱為訂閱(subscribers)。
我們可以將每個訂閱理解為一個“queue”,而具體每個queue里接收的消息是由對應(yīng)的規(guī)則定義的。
b.服務(wù)特性
Service bus topic是典型的支持Publish/Subscribe消息傳輸模式的服務(wù)。每個topic最多可以支持2000個訂閱,這意味著每一條發(fā)到topic里的消息都可以被多達(dá)2000個訂閱接收。我們可以在topic運(yùn)行期間的任何時刻增加新的訂閱,這不會影響其他已經(jīng)存在的訂閱接收消息,一旦新的訂閱添加成功,新進(jìn)入topic中的消息就會根據(jù)規(guī)則被新添加的訂閱接收。
上面我們提到“規(guī)則”,在Service bus topic的世界中,我們將其稱為“filter”,用戶可以根據(jù)自己的需求為每個訂閱定義不同的“filter”規(guī)則(每一條傳遞到service bus服務(wù)中的消息都會包含一組屬性properties,用戶可以通過使用屬性來自定義“filter”規(guī)則)所有滿足“filter”規(guī)則的消息將會被相應(yīng)的訂閱接收。通過這樣的方式,可以達(dá)到不同的訂閱偵聽或接收不同消息的目的。
Service bus topic的特性不止于此,我們不僅可以自定義不同的“filter”規(guī)則,我們還可以為每個訂閱定義不同的action,即當(dāng)該訂閱接收到相應(yīng)的消息后就會執(zhí)行對應(yīng)的action(比如我們可以修改某個屬性的名稱值等等),這對于某些場景非常有用。
c.與Service bus queue的區(qū)別
根據(jù)前面的介紹,我們能得到Service bus queue與topic一個最大的區(qū)別在于:Service bus queue是"one to one"的消息分發(fā)模式,而Service bus topic是"one to many"的消息分發(fā)模式。
Queue的消息分發(fā)模式可以參照下圖:
Topic的消息分發(fā)模式可以參考下圖:
d.適用場景
從上面的特性描述中我們不難發(fā)現(xiàn),如果用戶有需要將同一份消息傳遞到不同的接收端或系統(tǒng)中做不同的后續(xù)分析或處理,并且接收端可能在動態(tài)變化,那么Service bus topic將會是非常好的解決方案。
本篇中主要對Azure平臺提供的三種消息服務(wù)從幾個不同的維度做介紹和對比,Azure平臺還提供了處理大量事件的服務(wù),比如IOT Hub和Event Hub,接下來我們會在中篇會對這兩種事件服務(wù)繼續(xù)做介紹和對比,如果您對這個話題感興趣可以在中篇中繼續(xù)了解詳細(xì)內(nèi)容。