Stream 消息驅動

一、什麼是 Spring Cloud Stream?

二、Stream 的設計思想

1、標準 MQ

2、爲什麼用 Cloud Stream?

比方說我們用到了 RabbitMQ 和 Kafka,由於這兩個消息中間件的架構上的不同,像 RabbitMQ 有 exchange,kafka 有 Topic 和 Partitions 分區。

這些中間件的差異性導致我們實際項目開發給我們造成了一定的困擾,我們如果用了兩個消息隊列的其中一種,後面的業務需求,我想往另外一種消息隊列進行遷移,這時候無疑就是一個災難性的,一大堆東西都要重新推倒重新做,因爲它跟我們的系統耦合了,這時候 Spring Cloud Stream 給我們提供了—種解耦合的方式。

3、Stream 憑什麼可以統一底層差異?

在沒有綁定器這個概念的情況下,我們的 SpringBoot 應用要直接與消息中間件進行信息交互的時候,由於各消息中間件構建的初衷不同,它們的實現細節上會有較大的差異性通過定義綁定器作爲中間層,完美地實現了應用程序與消息中間件細節之間的隔離。通過嚮應用程序暴露統一的 Channel 通道,使得應用程序不需要再考慮各種不同的消息中間件實現。

4、通過定義綁定器 Binder 作爲中間層,實現了應用程序與消息中間件細節之間的隔離

Binder

Stream 中的消息通信方式遵循了發佈 - 訂閱模式

Topic 主題進行廣播

三、Stream 編碼常用註解簡介

1. Spring Cloud Stream 標準流程套路

2. 編碼 API 和常用註解

四、Stream 之消息重複消費

運行後有兩個問題

  1. 有重複消費問題

  2. 消息持久化問題

消費

生產實際案例

比如在如下場景中,訂單系統我們做集羣部署,都會從 RabbitMQ 中獲取訂單信息,那如果一個訂單同時被兩個服務獲取到,那麼就會造成數據錯誤,我們得避免這種情況。這時我們就可以使用 Stream 中的消息分組來解決

注意在 Stream 中處於同一個 group 中的多個消費者是競爭關係,就能夠保證消息只會被其中一個應用消費一次。不同組是可以全面消費的 (重複消費)。

五、Stream 之 group 解決消息重複消費

1. 原理

微服務應用放置於同一個 group 中,就能夠保證消息只會被其中一個應用消費一次。

不同的組是可以重複消費的,同一個組內會發生競爭關係,只有其中一個可以消費。

8802/8803 都變成不同組,group 兩個不同

group: A_Group、B_Group

六、Stream 之消息持久化

source:https://www.yuque.com/yanzipang-wf7ur/hkyrfw/vbkxz8

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/l0_xVXt2uHEda05gDA52SQ