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

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

開發 前端
通過學習 ONS 的設計方式,我對于 RocketMQ 的客戶端原理有了進一步了解,也實現了公司內部使用的 RocketMQ SDK 。

2018 年,做為架構負責人,接到一個架構需求:實現一個簡單易用的 RocketMQ SDK 。

因為各個團隊 RocketMQ 原生客戶端配置起來千奇百怪,有的配置存在風險,各團隊負責人都需要一個簡潔易用的 RocketMQ SDK 。

我立馬調研相關開源的方案,當時 RocketMQ-Spring 項目并沒有開源,而阿里云的 ONS SDK 是開源的,我只能講目標轉向 阿里云 ONS 。

通過學習 ONS 的設計方式,我對于 RocketMQ 的客戶端原理有了進一步了解,也實現了公司內部使用的 RocketMQ  SDK 。

圖片圖片

項目地址:https://github.com/makemyownlife/platform-rocketmq

之所以說簡單,就是讓用戶(開發者)使用 SDK 時,減少心智負擔。

舉三個例子:

1 發送順序消息

使用原生代碼發送消息時,會使用如下的代碼:

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 簡化為:

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

開發者不需要定義隊列選擇器,只需要傳遞分片鍵 orderId 即可。

2 單條消息消費

使用原來代碼定義消費監聽器時,使用如下的代碼:

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 ,很多開發同學想只操作一條消息。

于是,我們可以將 SDK API 簡化為:

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;
    }
});

開發者在消費時,可以一條一條操作,代碼簡潔了不少。

同時,很多開發者在使用普通消費、順序消費時,需要返回延時消費的狀態碼時,兩種消費模式定義的枚舉也不相同。我們將枚舉做了統一:

/**
 * 消費消息的返回結果
 */
public enum ConsumerAction {

    /**
     * 消費成功,繼續消費下一條消息
     */
    CommitMessage,
    
    /**
     * 消費失敗,告知服務器稍后再投遞這條消息,繼續消費其他消息
     */
    ReconsumeLater;
}

3 訂閱關系一致

實際場景里,訂閱關系不一致是極容易發生的事情,就算是高級別的架構師也會翻車,每次翻車現場都是慘不忍睹。

正確的訂閱關系見下圖:

圖片圖片

正確的訂閱關系

代碼邏輯角度來看,每個消費者實例內訂閱方法的主題、 TAG、監聽邏輯都需要保持一致。

圖片圖片

當訂閱關系不一致時,在 Broker 端同一個消費組內的各個消費者客戶端的訂閱信息相互被覆蓋,從而導致某個消費者客戶端無法拉取到新的消息。

怎么解決呢 ?

我當時想起了阿里技術專家沈詢的一句話:

世界上解決一個計算機問題最簡單的方法:“恰好”不需要解決它 !

公司內部出現訂閱關系一致99%的問題是:消費者組一致的前提下,主題相同,但 TAG 不相同。

基于此,我的設計思路就明確了:不開放訂閱 TAG 的權限!

沒想到吧,我就是這么粗暴。

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


責任編輯:武曉燕 來源: 勇哥Java實戰
相關推薦

2025-05-23 10:20:00

2013-12-17 11:35:16

2011-01-11 12:43:00

2019-07-24 14:49:48

SQL開源庫BI軟件

2018-09-18 10:11:21

前端vue.jsjavascript

2021-07-20 10:30:46

Golanghttp語言

2016-11-08 18:53:08

編譯器

2015-09-09 13:29:17

FISHShellLinux

2022-11-29 17:34:43

虛擬形象系統

2016-09-21 12:54:10

CAAS系統鏡像

2012-10-25 11:08:57

2020-06-04 12:55:44

PyTorch分類器神經網絡

2017-04-27 10:07:52

框架設計實現

2021-05-20 07:56:35

Bean容器Spring

2019-12-11 10:45:08

Python 開發編程語言

2011-03-24 09:34:41

SPRING

2017-12-12 15:24:32

Web Server單線程實現

2016-09-28 17:34:27

JavaScriptvueWeb

2022-03-24 14:58:02

Java散列表編程語言

2021-11-10 11:40:42

數據加解密算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线一区二区三区 | 在线看av网址| 国产精品欧美一区二区三区 | 日韩精品免费一区二区在线观看 | 亚洲国产精品激情在线观看 | 国产三级一区二区 | 国产精品日韩欧美一区二区三区 | 亚洲免费在线 | 亚洲视频免费观看 | 亚洲国产精品第一区二区 | 国产成人在线一区二区 | 国产精品自产拍 | 国产97视频在线观看 | 国产欧美一区二区三区在线看 | 精品乱码一区二区 | 91精品国产美女在线观看 | 亚洲国产精品久久久久秋霞不卡 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 国产精品久久久久久久久久久久 | 99精品国产在热久久 | 精品国产乱码一区二区三区a | 人人人人干 | 在线看黄免费 | 欧美福利久久 | 色综合国产 | 欧产日产国产精品视频 | 久久精品亚洲精品国产欧美 | 日本不卡一区 | 亚州无限乱码 | 久久精品久久精品久久精品 | 91社区在线观看高清 | 精品丝袜在线 | 国产91在线 | 亚洲 | 小h片免费观看久久久久 | 国产一区不卡 | 日本黄视频在线观看 | 黄色av大片 | 蜜桃视频在线观看免费视频网站www | 日批日韩在线观看 | 国产一区二区三区 | h在线 |