選擇傳訊平台

已完成

許多通訊平台都有助於改善分散式應用程式的可靠性,Microsoft Azure 中就有好幾個。 每個平台都是工具,各有不同用途。 請務必選擇正確的工具,以滿足應用程式的各種需求。 看一下 Azure 服務匯流排中的選項。

提議的 Contoso Bicycles 訂購和追蹤應用程式的分散式架構需要幾個元件,包括網站、資料儲存體和後端服務。 應用程式的元件有許多不同的繫結方式,單一應用程式可以利用多種技術。

您必須決定要在新的 Contoso Bicycles 應用程式中使用哪些技術。 第一步是評估有多個組件彼此通訊的各個地方。 某些元件必須及時執行,才能讓應用程式完成工作。 某些元件可能很重要,但並不急迫。 最後,其他元件 (例如行動應用程式通知) 是更具選擇性的。

在訊息與事件之間做決定

訊息和事件都是資料包:從一個元件傳送至另一個元件的資料套件。 初看差異細小,但這些差異可能造成應用程式的建構大不相同。

訊息

在分散式應用程式的術語中,訊息的明確界定為應用程式的整體完整性可能仰賴接收的訊息。 您可以將傳送訊息視為一個元件將流程交棒給另一個元件。 整個工作流程可能是重要的商務程序,訊息就是將這些元件連在一起的黏合劑。

訊息通常會包含實際資料,而不只是資料的參考 (例如識別碼或 URL)。 相較於傳送參考,資料放在資料包中傳送比較不會損毀。 傳訊結構可保證訊息傳遞,而且因為不需要額外查閱,處理訊息較可靠。 不過,傳送應用程式必須確實知道要包含的資料,以避免傳送太多資料,而需要接收元件執行不必要的工作。 因此,訊息的傳送者和接收者通常會締結嚴格的資料合約。

在 Contoso Bicycles 的新架構中,有人下單時,公司可能使用訊息。 Web 前端或行動應用程式會將訊息傳送給後端處理元件。 在後端會執行步驟,例如安排最靠近客戶的店家路線和以信用卡收費。

事件

事件會觸發通知,指出有狀況發生。 事件比訊息更為「精簡」,最常用於廣播通訊。

事件具有下列特性:

  • 事件可能傳送給多個接收者,或完全不傳送。
  • 事件通常會「散開」,或每個發佈者有大量訂閱者。
  • 事件發行者未設想接收端元件採取的動作。

自行車零件連鎖店可能會使用事件來通知使用者有狀態變更。 狀態變更事件可能傳送到 Azure 事件方格,再到 Azure Functions,然後到 Azure 通知中樞,形成完全無伺服器解決方案。

事件與訊息之間之所以會有此差異,基本上是因為通訊平台通常設計為只能處理其中一種。 服務匯流排專門處理訊息。 如果您想要傳送事件,則應選擇事件方格。

Azure 也有 Azure 事件中樞,但最常用在特定類型的高流量通訊串流 (用於分析)。 例如,如果您的製造倉庫有連線到網路的感應器,您可以使用事件中樞搭配 Azure 串流分析,監看溫度變化的模式,或許能看出不必要的火災或元件磨損。

服務匯流排主題和佇列

Azure 服務匯流排可用兩種不同的方式來交換訊息:佇列和主題。

什麼是佇列?

服務匯流排佇列是訊息的簡易暫存位置。 傳送端元件將訊息新增至佇列。 目的地元件提取佇列前端的訊息。 在一般情況下,每則訊息只會讓一個接收者收到。

顯示訊息佇列範例的圖表,其中有一個傳送者將訊息傳送至佇列,而一個接收者從佇列逐一接收訊息。

佇列會分離來源和目的地元件,以避免目的地元件處於高需求狀態。

在尖峰期間,訊息可能太快傳入,目的地元件來不及處理。 因為來源元件不直接連到目的地,來源不受影響,並且佇列會持續成長。 目的地元件能夠處理訊息時會從佇列中移除訊息。 需求降低時,目的地元件會趕上速度,佇列就會縮小。

佇列無須將資源新增至系統即可因應高度需求。 但如果需要快速處理訊息,則為目的地元件建立更多執行個體可讓它們共同分擔負載。 每個訊息只由一個執行個體處理。 這樣能有效縮放整個應用程式,只有真正需要資源的元件才要增加資源。

什麼是主題?

服務匯流排主題與佇列類似,但主題可以有多個訂用帳戶。 這表示多個目的地元件可以訂閱特定主題,以便將每個訊息傳遞給多個接收者。 訂用帳戶也可以篩選主題中的訊息,只接收相關的訊息。 訂用帳戶提供像佇列一樣的分離通訊,並以相同方式因應高需求。 如果希望每個訊息傳遞給多個目的地元件,請使用主題。

注意

基本定價層不支援主題。

此圖表顯示了一位傳送者透過包含三個訂用帳戶的主題向多位接收者傳送訊息。三位接收者會使用這些訂用帳戶來擷取相關的訊息。

服務匯流排佇列和儲存體佇列

兩個 Azure 服務包含訊息佇列:服務匯流排和 Azure 儲存體。 一般而言,儲存體佇列較容易使用,但精密度和彈性不如服務匯流排佇列。

服務匯流排佇列的主要優點包括:

  • 支援較大的訊息,每個訊息為 256 KB (標準層) 或 100 MB (進階層),而 Azure 儲存體佇列訊息只有 64 KB。
  • 支援最多一次和至少一次傳遞。 可選擇幾乎不遺失訊息或幾乎不處理兩次。
  • 保證先進先出 (FIFO) 順序。 依新增訊息的順序處理訊息。 雖然 FIFO 是佇列的正常作業,但如果組織設定循序或排程的訊息,或在中斷期間 (例如系統損毀),就會改變預設 FIFO 模式。 如需詳細資訊,請參閱比較 Azure 儲存體佇列與 Azure 服務匯流排佇列
  • 可以將多個訊息組合成一筆交易。 如果交易中有一個訊息無法傳遞,則交易中的所有訊息都不會傳遞。
  • 支援角色型安全性。
  • 目的地元件不需要持續輪詢佇列。

儲存體佇列的優點:

  • 支援無限制的佇列大小 (服務匯流排佇列有 80 GB 限制)
  • 維護所有訊息的記錄

如何選擇通訊技術

您已了解 Azure 提供的不同概念和實作。 接下來,請看您對每個通訊的決策過程。

考量

當您選擇傳送和接收訊息的方法時,請考量下列問題:

  • 通訊是事件嗎? 如果是的話,請考慮使用事件方格或事件中樞。

  • 要將單一訊息傳遞至多個目的地嗎? 如果是的話,請使用服務匯流排主題。 否則,請使用服務匯流排佇列。

佇列:服務匯流排與儲存體

如果您決定需要佇列,請進一步縮小選擇範圍。

在下列情況下,請選擇服務匯流排佇列:

  • 您需要最多一次傳遞保證。
  • 您需要 FIFO 保證 (如果沒有其他設定優先於預設 FIFO 順序)。
  • 您需要將訊息分組成交易。
  • 您想要接收訊息但不要輪詢佇列。
  • 您需要將角色型存取提供給佇列。
  • 您需要處理的訊息大於 64 KB,但小於標準層的 256 KB 或進階層的 100 MB。
  • 您的佇列大小不會增長到 80 GB 以上。
  • 您希望能夠分批發佈及取用訊息。

在下列情況下,請選擇儲存體佇列:

  • 您只需要簡單的佇列,無特定的額外需求。
  • 您需要通過佇列之所有訊息的稽核線索。
  • 您預期佇列的大小超過 80 GB。
  • 您想要追蹤佇列內處理訊息的進度。

雖然分散式應用程式的元件可以直接通訊,但您通常可以使用中繼通訊平台 (例如 Azure 事件中樞或 Azure 事件方格) 來提高該通訊的可靠性。

事件中樞和事件方格專用於事件,只向接收者告知事件,而不含該事件相關聯的未經處理資料。 Azure 事件中樞是專為高流量的分析類型事件而設計的。

Azure 服務匯流排和儲存體佇列用於訊息,可供您用來繫結任何應用程式工作流程的核心部分。

如果需求很簡單、如果要將每個訊息只傳送給一個目的地,或如果要盡快撰寫程式碼,則儲存體佇列可能是最佳選擇。 否則,服務匯流排佇列提供更多選項和彈性。

如果您想要將訊息傳送給多個訂閱者,您可以使用服務匯流排主題。