共用方式為


設定磁碟支援的訊息緩衝區行為

重要

此設定會要求您修改 Broker 資源。 它只會在初始部署時使用 Azure CLI 或 Azure 入口網站 進行設定。 如果需要訊息代理程式設定變更,則需要新的部署。 若要深入瞭解,請參閱 自定義預設 Broker

磁碟支援的訊息緩衝區功能可用來有效率地管理分散式 MQTT 訊息代理程式內的消息佇列。 這些好處包括:

  • 有效率的佇列管理:在 MQTT 訊息代理程式中,每個訂閱者都會與訊息佇列相關聯。 訂閱者的訊息處理速度直接影響佇列的大小。 如果訂閱者處理訊息的速度緩慢,或如果訊息中斷連線,但要求 MQTT 持續工作階段,佇列可能會成長為大於可用記憶體。
  • 持續性會話的數據保留:磁碟支援的訊息緩衝區功能可確保當佇列超過可用的記憶體時,它會順暢地緩衝處理至磁碟。 這項功能可防止數據遺失,並支援 MQTT 持續性會話,讓訂閱者在重新連線時以訊息佇列保持不變地繼續其會話。 磁碟會作為暫時儲存體使用,並做為記憶體溢出。 寫入磁碟的數據並不持久,而且會在Pod結束時遺失。 如果每個後端鏈結中至少有一個 Pod 運作正常,整個訊息代理程式不會遺失任何數據。
  • 處理連線挑戰:雲端連接器會被視為具有持續性會話的訂閱者,因為網路中斷連線而無法與外部系統通訊,例如 Azure 事件方格 MQTT 訊息代理程式。 在這種情況下,訊息 (PUBLISHes) 會累積。 MQTT 訊息代理程式會以智慧方式將這些訊息緩衝處理至記憶體或磁碟,直到還原連線,以確保訊息完整性。

根據預設,磁碟支援的訊息緩衝區功能會停用。 在此情況下,訊息會保留在記憶體中,當讀取器集區或臨時集區達到訂閱者佇列限制所 定義的限制時,會將回壓套用至用戶端。

設定磁碟支援的訊息緩衝區對於維護健全且可靠的消息佇列系統至關重要,特別是在訊息處理速度和連線能力十分重要的情況下。

注意

MQTT 訊息代理程式會將數據與從用戶端接收的數據完全一樣寫入磁碟,而不需要新增加密。 保護磁碟對於保護訊息代理程式所儲存的數據至關重要。

設定選項

若要設定磁碟支援的訊息緩衝區,請編輯 diskBackedMessageBuffer Broker 資源中的 區段。 目前,只有在您使用 命令部署 Azure IoT 作業az iot ops create時,才--broker-config-file支援此設定。

若要開始使用,請遵循 DiskBackedMessageBuffer API 參考來準備 Broker 配置檔。

例如,最簡單的設定只涉及指定大小上限。 在此情況下,emptyDir會掛接磁碟區。 值 maxSize 會當做磁碟區的大小限制 emptyDir 使用。 但此選項是最不慣用的選項,因為磁碟區的限制 emptyDir

{
  "diskBackedMessageBuffer": {
    "maxSize": "<SIZE>"
  }
}

若要取得更好的磁碟備份訊息緩衝區組態,請指定暫時磁碟區或永續性磁碟區宣告,以掛接訊息緩衝區的專用記憶體磁碟區。 例如:

{
  "diskBackedMessageBuffer": {
    "maxSize": "<SIZE>",
    "ephemeralVolumeClaimSpec": {
      "storageClassName": "<NAME>",
      "accessModes": [
        "<MODE>"
      ]
    }
  }
}
{
  "persistentVolumeClaimSpec": {
    "maxSize": "<SIZE>",
    "ephemeralVolumeClaimSpec": {
      "storageClassName": "<NAME>",
      "accessModes": [
        "<MODE>"
      ]
    }
  }
}

藉由調整下列設定來量身打造訊息緩衝區選項:

  • 設定磁碟區:指定磁碟區宣告範本,為您的訊息緩衝區掛接專用記憶體磁碟區。
  • 選取記憶體類別:使用 storageClassName 屬性定義所需的儲存類別。
  • 定義存取模式:決定磁碟區所需的存取模式。 如需詳細資訊,請參閱 永續性磁碟區存取模式

使用下列各節來瞭解不同的磁碟區模式:

持續性和暫時磁碟區通常由相同的記憶體類別提供。 如果這兩個選項都可用,請選擇暫時性。 暫時磁碟區需要 Kubernetes 1.23 或更高版本。

提示

當您指定暫時磁碟區宣告 (EVC) 或永續性磁碟區宣告 (PV) 範本時,您可以使用您選擇的儲存類別,這會增加某些部署案例的彈性。 例如,使用PVC 範本布建的永續性磁碟區會出現在 之類的 kubectl get pv命令中,這適用於檢查叢集狀態。

如果您的 Kubernetes 節點沒有足夠的本機磁碟空間供訊息緩衝區使用,請使用提供網路記憶體的記憶體類別,例如 Azure Blob 儲存體。 最好使用具有較小 maxSize 值的本機磁碟,因為訊息緩衝區受益於快速存取,而且不需要持久性。

使用磁碟支援的訊息緩衝區部署IoT作業

若要使用磁碟支援的訊息緩衝區,請使用 az iot ops create 命令搭配 --broker-config-file 旗標來部署IoT作業。 請參閱下列命令。 (為了簡潔起見,請省略其他參數。

az iot ops create ... --broker-config-file <FILE>.json

部署之後,就無法變更此設定。 若要變更磁碟支援的訊息緩衝區組態,請重新部署IoT作業實例。

暫時磁碟區

暫時磁碟區是訊息緩衝區的慣用選項。

針對暫時磁碟區,請遵循記憶體提供者考慮一節中的建議。

屬性的值 ephemeralVolumeClaimSpec 會當做 ephemeral.volumeClaimTemplate.spec 後端鏈結規格中 StatefulSet 磁碟區的屬性使用。

例如,若要使用容量為 1 GB 的暫時磁碟區,請在 Broker 資源中指定下列參數:

{
  "diskBackedMessageBuffer": {
    "maxSize": "1G",
    "ephemeralVolumeClaimSpec": {
      "storageClassName": "foo",
      "accessModes": [
        "ReadWriteOnce"
      ]
    }
  }
}

永久性磁碟區

永續性磁碟 區是暫時磁碟區之後訊息緩衝區的下一個慣用選項。

針對永續性磁碟區,請遵循記憶體提供者考慮一節中的建議。

屬性的值 persistentVolumeClaimSpec 會當做 volumeClaimTemplates.spec 後端鏈結規格的 StatefulSet 屬性使用。

例如,若要使用容量為 1 GB 的永續性磁碟區,請在 Broker 資源中指定下列參數:

{
  "diskBackedMessageBuffer": {
    "maxSize": "1G",
    "persistentVolumeClaimSpec": {
      "storageClassName": "foo",
      "accessModes": [
        "ReadWriteOnce"
      ]
    }
  }
}

emptyDir 磁碟區

emptyDir 磁碟區是永續性磁碟區之後最不慣用的選項。

emptyDir只有在您使用具有文件系統配額的叢集時,才使用磁碟區。 如需詳細資訊,請參閱 文件系統專案配額索引標籤。如果未啟用此功能,叢集會定期掃描,不會強制執行任何限制,並允許主機節點填滿磁碟空間,並將整個主機節點標示為狀況不良。

例如,若要使用 emptyDir 容量為 1 GB 的磁碟區,請在 Broker 資源中指定下列參數:

{
  "diskBackedMessageBuffer": {
    "maxSize": "1G"
  }
}

儲存體提供者的考量

例如,當您使用類似 rancher.io/local-path的提供者時,請考慮所選記憶體提供者的行為。 如果提供者不支援限制,填滿磁碟區會耗用節點的磁碟空間。 此行為可能會導致 Kubernetes 將節點和所有相關聯的 Pod 標示為狀況不良。 請務必了解您的記憶體提供者在這類案例中的運作方式。

已停用

如果您不想使用磁碟支援的訊息緩衝區,請勿在 Broker 資源中包含 diskBackedMessageBufferSettings 屬性。 此行為也是預設值。

持續性

請務必瞭解磁碟支援的訊息緩衝區功能與持續性不一致。 在此內容中,持續性是指在 Pod 重新啟動時倖存的資料。 這項功能提供暫存空間,讓數據儲存至磁碟,這可防止 Pod 重新啟動期間的記憶體溢位和數據遺失。