【入門教程】Spring Cloud Stream 入門

一、什麼是Spring Cloud Stream?

Spring Cloud Stream is a framework for building highly scalable event-driven microservices connected with shared messaging systems.

The framework provides a flexible programming model built on already established and familiar Spring idioms and best practices, including support for persistent pub/sub semantics, consumer groups, and stateful partitions.

官網:https://spring.io/projects/spring-cloud-stream

簡而言之:其實一款易於擴展的消息驅動框架,用於微服務之間消息的傳遞,遵循發佈訂閱模式、支持分組、分區。

 二、爲什麼學習Spring Cloud Stream?

當下流行的四大MQ(RocketMQ、RabbitMQ、ActiveMQ、Kafka),各有優勢,有時面對複雜且變化的業務需求,可能面臨隨時切換MQ的需求,隨之帶來的是代碼的更改變動,而Spring Cloud Stream就是解決這一問題的,其統一了編程模型,各個MQ均爲該框架的實現層,屏蔽了底層MQ之間的差異,業務代碼與MQ解耦,達到了隨時切換MQ的目的。

三、框架組件

四、踩坑指南

坑1.   需要注意的是,最好不要自定義輸入輸出在同一個類裏面。這樣,如果我們只調用生產者發送消息。會導致提示Dispatcher has no subscribers for channel。並且會讓我們發送消息的次數莫名減少幾次。詳細情況可以查看gihub官方issue,也給出的這種解決方法 官方解決方式

坑2.   stream生成的exchang默認是topic模式。就是按照前綴匹配,發送消息給對應的隊列。

 

*(星號):可以(只能)匹配一個單詞

#(井號):可以匹配多個單詞(或者零個)

fanout:廣播模式,發送到所有的隊列

direct:直傳。完全匹配routingKey的隊列可以收到消息。

坑3.   默認消息異常之後,都會往死消息隊列裏面寫,然而異常是放到一個header裏面去的。默認消息隊列支持的最大frame_max 是128kb,超過這個大小,服務器就主動給你關閉連接,然後把你的消息會不斷的重試。

坑4.   @Output對MessageChannel,@Input對應SubscribableChannel 。

坑5.   stream的destination對應生成rabbitmq的exchange。加上了group後,例如destination:wx-consumer,group:queue。那麼經過stream後隊列名稱會變成wx-consumer.queue。如果使用group對應的是持久化隊列,不會被rabbitmq刪除。


五、高級特性

1、消息分組

       通常在生產環境,我們的每個服務都不會以單節點的方式運行在生產環境,當同一個服務啓動多個實例的時候,這些實例都會綁定到同一個消息通道的目標主題(Topic)上。默認情況下,當生產者發出一條消息到綁定通道上,這條消息會產生多個副本被每個消費者實例接收和處理,但是有些業務場景之下,我們希望生產者產生的消息只被其中一個實例消費,這個時候我們需要爲這些消費者設置消費組來實現這樣的功能。

2、消息分區

       有一些場景需要滿足, 同一個特徵的數據被同一個實例消費, 比如同一個id的傳感器監測數據必須被同一
個實例統計計算分析, 否則可能無法獲取全部的數據。又比如部分異步任務,首次請求啓動task,二次
請求取消task,此場景就必須保證兩次請求至同一實例.

3、死信隊列(DLQ)

      消費失敗的消息存入一個指定的隊列,待程序Bug修復或網絡恢復後,之後再進行消息的處理,這個存儲消費失敗的消息的隊列就叫死信隊列(死掉了的信息)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章