Microservice Patterns - 3.3 Microservice 架構中的行程間通訊 - 使用非同步 Messaging 溝通 - 2
參考資料
使用 Message Broker
- 基於 broker 的架構
- 基於 brokerless 的 messaging 架構

BROKERLESS MESSAGING
- ZeroMQ:http:// zeromq.org
- 優點
- 更輕量的網路流量和更低的延遲,因為沒有中間的 broker
- 不會有 broker 成為瓶頸
- 較少的營運複雜度,因為沒有 broker
- 缺點
- 服務需要知道彼此的位置
- 可用性降低,因為發送者和接收者都必須可用(跟使用同步 request/response 一樣)
- 很難實作保證送達
基於 BROKER 的 MESSAGING 概觀
- 範例
- ActiveMQ(http://activemq.apache.org)
- RabbitMQ(https://www.rabbitmq.com)
- Apache Kafka(http://kafka.apache.org)
- AWS Kinesis(https://aws.amazon .com/kinesis/)
- AWS SQS(https://aws.amazon.com/sqs/
- 優點
- 發送者不需要知道消費者的位置
- Broker 會緩衝訊息直到消費者可用
- 選擇 MQ 的考量
- 支援的程式語言
- 支援的 messaging 標準,如 AMQP 或 STOMP
- 訊息排序(低延遲的 broker 可能不支援排序)
- 送達保證(高延遲)
- 持久化(高延遲)
- 耐久性:斷線時 broker 的行為是什麼?
- 可擴展性
- 延遲
- 競爭消費者:broker 是否支援?
使用 MESSAGE BROKER 實作 MESSAGE CHANNEL

基於 BROKER 的 MESSAGING 的優缺點
- 優點
- 鬆耦合
- 訊息緩衝
- 靈活的溝通方式
- 明確的行程間通訊
- 缺點
- 潛在的效能瓶頸
- 潛在的單點故障
- 額外的營運複雜度
競爭接收者與訊息排序
- 如何在維持訊息排序的同時擴展訊息接收者 => 在 Kafka 中使用 sharded(partitioned)channel

處理重複訊息
- 撰寫冪等的 message handler
- 重複的訊息是無害的
- 追蹤訊息並丟棄重複的。

交易式 Messaging
- 分散式交易對現代應用程式來說不是好的選擇
使用資料庫表格作為 MESSAGE QUEUE

使用 POLLING PUBLISHER PATTERN 發佈事件
透過輪詢資料庫中的 outbox 來發佈訊息。參見 http://microservices.io/patterns/data/polling-publisher.html。
套用 TRANSACTION LOG TAILING PATTERN 發佈事件
Pattern: Transaction log tailing 透過追蹤 transaction log 來發佈對資料庫所做的變更。參見 http://microservices.io/patterns/data/transaction-log-tailing.html。
