日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何實現一個簡單易用的 RocketMQ SDK

來源: 責編: 時間:2024-05-08 09:21:15 185觀看
導讀2018 年,做為架構負責人,接到一個架構需求:實現一個簡單易用的 RocketMQ SDK 。因為各個團隊 RocketMQ 原生客戶端配置起來千奇百怪,有的配置存在風險,各團隊負責人都需要一個簡潔易用的 RocketMQ SDK 。我立馬調研相關開

2018 年,做為架構負責人,接到一個架構需求:實現一個簡單易用的 RocketMQ SDK 。BI728資訊網——每日最新資訊28at.com

因為各個團隊 RocketMQ 原生客戶端配置起來千奇百怪,有的配置存在風險,各團隊負責人都需要一個簡潔易用的 RocketMQ SDK 。BI728資訊網——每日最新資訊28at.com

我立馬調研相關開源的方案,當時 RocketMQ-Spring 項目并沒有開源,而阿里云的 ONS SDK 是開源的,我只能講目標轉向 阿里云 ONS 。BI728資訊網——每日最新資訊28at.com

通過學習 ONS 的設計方式,我對于 RocketMQ 的客戶端原理有了進一步了解,也實現了公司內部使用的 RocketMQ  SDK 。BI728資訊網——每日最新資訊28at.com

圖片圖片BI728資訊網——每日最新資訊28at.com

項目地址:https://github.com/makemyownlife/platform-rocketmqBI728資訊網——每日最新資訊28at.com

之所以說簡單,就是讓用戶(開發者)使用 SDK 時,減少心智負擔。BI728資訊網——每日最新資訊28at.com

舉三個例子:BI728資訊網——每日最新資訊28at.com

1 發送順序消息

使用原生代碼發送消息時,會使用如下的代碼:BI728資訊網——每日最新資訊28at.com

SendResult sendResult = producer.send(msg, new MessageQueueSelector() {    @Override    public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {        Integer id = (Integer) arg;        int index = id % mqs.size();        return mqs.get(index);    }}, orderId);

我們可以將 SDK API 簡化為:BI728資訊網——每日最新資訊28at.com

SendResult send(final ProducerMessage message, final String shardingKey);

開發者不需要定義隊列選擇器,只需要傳遞分片鍵 orderId 即可。BI728資訊網——每日最新資訊28at.com

2 單條消息消費

使用原來代碼定義消費監聽器時,使用如下的代碼:BI728資訊網——每日最新資訊28at.com

consumer.registerMessageListener(new MessageListenerConcurrently() {    @Override    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {        System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);        // 返回消息消費狀態,ConsumeConcurrentlyStatus.CONSUME_SUCCESS為消費成功        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;    }});

監聽器內部,對于開發者操作的對象是消息列表 msgs ,很多開發同學想只操作一條消息。BI728資訊網——每日最新資訊28at.com

于是,我們可以將 SDK API 簡化為:BI728資訊網——每日最新資訊28at.com

consumer.subscribe("mytest", new ConsumerListener() {    @Override    public ConsumerAction consumer(ConsumerMessage msg) {        byte[] body = msg.getBody();        System.out.println("msg:" + new String(body));        return ConsumerAction.CommitMessage;    }});

開發者在消費時,可以一條一條操作,代碼簡潔了不少。BI728資訊網——每日最新資訊28at.com

同時,很多開發者在使用普通消費、順序消費時,需要返回延時消費的狀態碼時,兩種消費模式定義的枚舉也不相同。我們將枚舉做了統一:BI728資訊網——每日最新資訊28at.com

/** * 消費消息的返回結果 */public enum ConsumerAction {    /**     * 消費成功,繼續消費下一條消息     */    CommitMessage,        /**     * 消費失敗,告知服務器稍后再投遞這條消息,繼續消費其他消息     */    ReconsumeLater;}

3 訂閱關系一致

實際場景里,訂閱關系不一致是極容易發生的事情,就算是高級別的架構師也會翻車,每次翻車現場都是慘不忍睹。BI728資訊網——每日最新資訊28at.com

正確的訂閱關系見下圖:BI728資訊網——每日最新資訊28at.com

圖片圖片BI728資訊網——每日最新資訊28at.com

正確的訂閱關系BI728資訊網——每日最新資訊28at.com

代碼邏輯角度來看,每個消費者實例內訂閱方法的主題、 TAG、監聽邏輯都需要保持一致。BI728資訊網——每日最新資訊28at.com

圖片圖片BI728資訊網——每日最新資訊28at.com

當訂閱關系不一致時,在 Broker 端同一個消費組內的各個消費者客戶端的訂閱信息相互被覆蓋,從而導致某個消費者客戶端無法拉取到新的消息。BI728資訊網——每日最新資訊28at.com

怎么解決呢 ?BI728資訊網——每日最新資訊28at.com

我當時想起了阿里技術專家沈詢的一句話:BI728資訊網——每日最新資訊28at.com

世界上解決一個計算機問題最簡單的方法:“恰好”不需要解決它 !BI728資訊網——每日最新資訊28at.com

公司內部出現訂閱關系一致99%的問題是:消費者組一致的前提下,主題相同,但 TAG 不相同。BI728資訊網——每日最新資訊28at.com

基于此,我的設計思路就明確了:不開放訂閱 TAG 的權限!BI728資訊網——每日最新資訊28at.com

沒想到吧,我就是這么粗暴。BI728資訊網——每日最新資訊28at.com

按照這種設計思路,雖然開始有的程序員會有質疑,但你和他梳理好消費者組的定義,以及做好領域劃分,對業務來講,反而清晰了。BI728資訊網——每日最新資訊28at.com


BI728資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87267-0.html如何實現一個簡單易用的 RocketMQ SDK

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Tailwind 4.0 即將到來:前端開發的“速度與激情”

下一篇: Python Queue模塊全攻略

標簽:
  • 熱門焦點
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產品是什么?——是智能音箱。 手機在執行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯網品牌官01 擦邊少女空降熱搜,幕后推手曝光被網友譽為&ldquo;純欲天花板&rdquo;的女網紅井川里予,近期因為一組哥特風照片登上熱搜,引發了一場互聯網世界關于
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創 作者|程心 羅輯2023年之前,對于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新業務到 2022 年底還是 0,希望 2023 年出來一個 1。&rdquo;這是2022年底,李彥宏
  • 華為發布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發者大會2023(HDC.Together)大會上,HarmonyOS 4正式發布。自2019年發布以來,HarmonyOS一直以用戶為中心,經歷四年多的發展HarmonyOS已
  • iQOO Neo8系列新品發布會

    旗艦雙芯 更強更Pro
Top 主站蜘蛛池模板: 内乡县| 青州市| 新乐市| 金平| 静安区| 莱西市| 宜宾市| 南陵县| 志丹县| 丽水市| 沿河| 夏邑县| 镇坪县| 阿拉尔市| 余干县| 云浮市| 蒲城县| 棋牌| 苏尼特右旗| 通河县| 杨浦区| 阿拉善右旗| 汝城县| 古蔺县| 武鸣县| 云和县| 吉木乃县| 荔波县| 平果县| 徐州市| 邢台县| 茂名市| 盱眙县| 吉木萨尔县| 静宁县| 安徽省| 宣威市| 南宫市| 安图县| 内黄县| 巫溪县|