成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RocketMQ 5.0 時代,6 張圖帶你理解 Proxy!

開發 架構
RocketMQ 5.0 跟之前的版本相比,改動很大,更加地擁抱云原生。學習 RocketMQ 5.0,首先要理解 Proxy,希望本文能對您理解 Proxy 有所幫助。

大家好,我是君哥。今天來聊一聊 RocketMQ 5.0 中的 Proxy。

RocketMQ 5.0 為了更好地擁抱云原生,引入了無狀態的 Proxy 模塊,新的架構圖如下:

圖片

引入 Proxy 模塊后,Proxy 承擔了協議適配、權限管理、消息管理等計算功能,Broker 則更加專注于存儲。這樣存儲和計算相分離,在云原生環境下可以更好地進行資源調度。

1、Proxy 介紹

RocketMQ 5.0 把客戶端的部分功能下沉到 Proxy,Proxy 承接了之前 客戶端的計算能力,客戶端變得更加輕量級。

(1)NameServer

從上面的架構圖可以看到,Producer/Consumer 不再需要注冊到 NameServer,這一部分功能下移到了 Proxy,由 Proxy 跟 NameServer 進行交互,比如查詢 TopicRouteData。代碼如下:

public CompletableFuture<QueryRouteResponse> queryRoute(ProxyContext ctx, QueryRouteRequest request) {
CompletableFuture<QueryRouteResponse> future = new CompletableFuture<>();
try {
//省略部分代碼
ProxyTopicRouteData proxyTopicRouteData = this.messagingProcessor.getTopicRouteDataForProxy(
ctx, addressList, topicName);

List<MessageQueue> messageQueueList = new ArrayList<>();
Map<String, Map<Long, Broker>> brokerMap = buildBrokerMap(proxyTopicRouteData.getBrokerDatas());

TopicMessageType topicMessageType = messagingProcessor.getMetadataService().getTopicMessageType(topicName);
for (QueueData queueData : proxyTopicRouteData.getQueueDatas()) {
String brokerName = queueData.getBrokerName();
Map<Long, Broker> brokerIdMap = brokerMap.get(brokerName);
if (brokerIdMap == null) {
break;
}
for (Broker broker : brokerIdMap.values()) {
messageQueueList.addAll(this.genMessageQueueFromQueueData(queueData, request.getTopic(), topicMessageType, broker));
}
}

QueryRouteResponse response = QueryRouteResponse.newBuilder()
.setStatus(ResponseBuilder.getInstance().buildStatus(Code.OK, Code.OK.name()))
.addAllMessageQueues(messageQueueList)
.build();
future.complete(response);
} catch (Throwable t) {
future.completeExceptionally(t);
}
return future;
}

Proxy 適配多種協議,比如 HTTP、gRPC、remoting 等,不同協議的客戶端跟 Proxy 建立連接后,Proxy 統一使用 remoting 協議跟 Broker、NameServer 進行通信。

(2)流量控制

客戶端所有的請求都要經過 Proxy,Proxy 將流量分發到 Broker。這樣在 Proxy 可以進行流量控制和流量治理。

(3)POP 模式

我們知道,PUSH 消費模式下,Broker 中的每個 MessageQueue 只能被同一個 Consumer Group 中的一個消費者消費,如下圖:

圖片

PUSH 模式存在下面幾個問題:

  1. 消費者最大數量只能等于 MessageQueue 的數量,消費者數量等于 MessageQueue 的數量后,再增加消費者,也不能提高消費能力了;
  2. 客戶端的處理邏輯比較多,比如負載均衡、offset 管理、消費失敗后的處理(比如失敗消息發送回 Broker)。
  3. 如果一個消費者機器故障,比如上圖中 Consumer0 這個消費者 hang 住了,Topic1 下的兩個 MessageQueue 就不能被消費了,導致消息積壓,最終只能是重啟或下線 Consumer0,Consumer 做重平衡。
  4. 客戶端很重,如果要用其他語言編寫,工作量很大。

基于 PUSH 模式的不足,RocketMQ 5.0 引入了 POP 消費模式,如下圖:

圖片

跟 PUSH 模式消費者相比,POP 模式客戶端有如下優勢:

  1. POP 模式消費者可以拉取所有的 MessageQueue,這樣即使某個消費者 hang 住,也不會影響某一個 MessageQueue 的消費;
  2. POP 模式消費者不再會重平衡,因為每個消費者默認會去所有的 MessageQueue 拉取消息。
  3. 因為消費者可以拉取所有的 MessageQueue 消息,所以,增加消費者數量,是可以提高消費能力的。
  4. 消費者減少了很多邏輯,變得戶端輕量化了,可以方便多語言實現。
  5. 消費者不再維護 offset(offset 由 Broker 維護),變成了無狀態組件。

注意:消費者請求 Proxy 時,POP 模式和 PUSH 模式都可以使用,而 Proxy 請求 Broker 時,使用的是 POP 模式,這樣可以避免上面提到的一系列問題。如下圖:

圖片

(4)gRPC

Proxy 基于 gRPC 的標準性、兼容性和多語言傳輸層代碼生成能力,可以輕松構建多語言的輕量級客戶端。

2、部署方式

根據不同的場景,Proxy 有兩種部署方式,LOCAL 模式和 CLUSTER 模式。

(1)LOCAL 模式

RocketMQ 4.x 版本 Client 和 Broker 直接通信,RocketMQ 5.0 引入 Proxy 后,Client 和 Broker 之間的通信多了一道網絡,也增加了一次序列化和反序列化的過程,這勢必增加了延遲,對于延遲敏感的場景可能不能接受。RocketMQ 5.0 引入了 LOCAL 模式部署 Proxy,如下圖:

圖片

Proxy 仍然可以適配多種語言的客戶端,而且 Proxy 和 Broker 部署在一起,通信方式使用進程內通信,這樣可以減少因為多一道網絡帶來的延遲,提高吞吐量。同時運維也變得簡單,運維成本降低。

LOCAL 模式有一個缺點,因為 Proxy 部署在 Broker 端,受網絡環境的限制,對于多網絡接入的情況并不友好,成本高。

(2)CLUSTER 模式

CLUSTER 模式主要用于對延遲不敏感的場景,Proxy 獨立部署,在 Proxy 層適配多網絡的接入,同時 Proxy 和 Broker 可以獨立擴容,互不影響。如下圖:

圖片

(3)總結

LOCAL 模式更適合對延遲敏感、期望運維成本低、網絡接入類型單一的場景。

CLUSTER 模式更適合對延遲要求低、網絡接入類型多樣的場景。

3、總結

RocketMQ 5.0 跟之前的版本相比,改動很大,更加地擁抱云原生。學習 RocketMQ 5.0,首先要理解 Proxy,希望本文能對您理解 Proxy 有所幫助。

責任編輯:姜華 來源: 君哥聊技術
相關推薦

2022-06-13 11:05:35

RocketMQ消費者線程

2022-07-11 11:06:11

RocketMQ函數.消費端

2022-07-04 11:06:02

RocketMQ事務消息實現

2022-06-27 11:04:24

RocketMQ順序消息

2021-11-29 07:47:56

RocketMQ分布式消息

2022-05-09 11:15:05

RocketMQPULL 模式PUSH 模式

2022-02-28 11:10:42

ZGCG1收集器

2024-08-26 08:44:54

2020-11-16 10:50:27

KubernetesIngressLinux

2024-07-03 08:28:44

HWKafkaLEO

2021-04-25 10:45:59

Docker架構Job

2022-06-11 18:15:26

KubernetesDockerLinux

2021-05-18 06:55:07

Java AQS源碼

2022-03-18 13:58:00

RocketMQ消息隊列

2019-07-24 08:49:36

Docker容器鏡像

2020-06-28 07:39:44

Kafka分布式消息

2021-12-06 07:15:47

Pulsar地域復制

2015-07-13 10:23:23

Java圖解

2022-09-22 08:32:30

RocketMQLinuxWindows

2021-08-15 18:59:13

垃圾收集器JDK
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频观看 | 中文字幕1区| 久久免费视频1 | 精品亚洲永久免费精品 | 一区二区日韩 | 精品一二区 | 国产精品国产a级 | 亚洲免费在线 | 欧美久久一区二区 | 久久亚洲综合 | 可以看黄的视频 | 毛片一级片| 亚洲免费精品一区 | 九九在线精品视频 | 中文字幕免费观看 | 国产精品视频一区二区三区不卡 | 日韩成人影院 | 蜜桃在线视频 | 免费观看羞羞视频网站 | 亚洲免费av一区 | 天天看片天天干 | 欧美高清免费 | 亚洲狠狠爱一区二区三区 | av永久 | 欧美三区在线观看 | 久久精品国产一区二区 | 国产成人免费视频网站视频社区 | 羞羞网站免费 | 91亚洲国产成人精品一区二三 | 日韩一区二区久久 | 午夜国产在线 | 日韩日韩日韩日韩日韩日韩日韩 | 免费国产黄网站在线观看视频 | h视频免费观看 | 麻豆精品久久 | 国产激情第一页 | 欧美日韩精品一区 | 国产日韩欧美91 | 伊人春色在线观看 | 国产精品美女久久久免费 | 毛片免费看 |