SpringCloud_消息驅動stream 原

stream解決了什麼問題

舉例

pom依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

配置:

spring.rabbitmq.host=192.168.99.100
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

然後就可以直接使用stream的封裝的方式進行消息收發,代碼層面對rabbitmq無感知。

消息分組

默認情況下,sender端綁定的exchange會在rabbitmq上創建一個持久化的exchange,類型是topic,routing key是#.reciver端會自動創建一個臨時的queue(隊列名是自動生成的),綁定到exhange上面。 這樣的話如果有多個消費端節點,那麼一條消息就會被多個消費者同時消費。

因此消息分組無非就是消費端指定固定的queue名稱。這樣多個消費者都會綁定到相同的queque上,那麼一條消息也就只會被一個消費者消費。

消費端配置:

# 指定交換機名稱
spring.cloud.stream.bindings.inputProduct.destination=exchangeProduct
# 指定隊列名稱
spring.cloud.stream.bindings.inputProduct.group=groupProduct
public interface IReceiveService {
    
    String INPUT="inputProduct";
    
    @Input(INPUT)
    SubscribableChannel receive();
}

這樣,Rabbitmq上會創建一個topic類型,routing key爲#,持久化的echange,名稱爲exchangeProduct。 會創建一個持久化的queue,名稱爲exchangeProduct.groupProduct。

消息分區

在rabbitmq中沒有這個概念。 在微服務中,是爲了保證相同的消息被同一個節點接收的問題。 相同消息指的應該是序列化後的內容相同。

問題:將相同消息路由到同一節點的使用場景是什麼?

生產端配置:

# exchange名稱
spring.cloud.stream.bindings.outputProduct.destination=exchangeProduct
#通過該參數指定了分區鍵的表達式規則
spring.cloud.stream.bindings.outputProduct.producer.partitionKeyExpression=payload
#指定了消息分區的數量(也就是消費者數量)
spring.cloud.stream.bindings.outputProduct.producer.partitionCount=2

消費端配置:

# exchange名稱
spring.cloud.stream.bindings.inputProduct.destination=exchangeProduct
# 隊列名稱
spring.cloud.stream.bindings.inputProduct.group=groupProduct

#開啓消費者分區功能
spring.cloud.stream.bindings.inputProduct.consumer.partitioned=true
#指定了當前消費者的總實例數量
spring.cloud.stream.instanceCount=2
#設置當前實例的索引號,從0開始
spring.cloud.stream.instanceIndex=0

這樣配置後,在rabbitmq上,會創建兩個持久化隊列exchangeProduct.groupProduct-0和exchangeProduct.groupProduct-1. 和交換機的routing key分別爲exchangeProduct-0,exchangeProduct-1.

可見,消息分區的功能完全是由stream端實現的。實現大致應該是在生產者端,stream根據序列化後的內容,根據特定的hash算法,將消息路由到特定的routing key,進而發送到對應的queue上面去,從而實現了相同消息會被髮送到相同的節點上。

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