当前位置:首页 > 科技  > 软件

如何实现一个简单易用的 RocketMQ SDK

来源: 责编: 时间:2024-05-08 09:21:15 228观看
导读2018 年,做为架构负责人,接到一个架构需求:实现一个简单易用的 RocketMQ SDK 。因为各个团队 RocketMQ 原生客户端配置起来千奇百怪,有的配置存在风险,各团队负责人都需要一个简洁易用的 RocketMQ SDK 。我立马调研相关开

2018 年,做为架构负责人,接到一个架构需求:实现一个简单易用的 RocketMQ SDK 。hPp28资讯网——每日最新资讯28at.com

因为各个团队 RocketMQ 原生客户端配置起来千奇百怪,有的配置存在风险,各团队负责人都需要一个简洁易用的 RocketMQ SDK 。hPp28资讯网——每日最新资讯28at.com

我立马调研相关开源的方案,当时 RocketMQ-Spring 项目并没有开源,而阿里云的 ONS SDK 是开源的,我只能讲目标转向 阿里云 ONS 。hPp28资讯网——每日最新资讯28at.com

通过学习 ONS 的设计方式,我对于 RocketMQ 的客户端原理有了进一步了解,也实现了公司内部使用的 RocketMQ  SDK 。hPp28资讯网——每日最新资讯28at.com

图片图片hPp28资讯网——每日最新资讯28at.com

项目地址:https://github.com/makemyownlife/platform-rocketmqhPp28资讯网——每日最新资讯28at.com

之所以说简单,就是让用户(开发者)使用 SDK 时,减少心智负担。hPp28资讯网——每日最新资讯28at.com

举三个例子:hPp28资讯网——每日最新资讯28at.com

1 发送顺序消息

使用原生代码发送消息时,会使用如下的代码:hPp28资讯网——每日最新资讯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 简化为:hPp28资讯网——每日最新资讯28at.com

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

开发者不需要定义队列选择器,只需要传递分片键 orderId 即可。hPp28资讯网——每日最新资讯28at.com

2 单条消息消费

使用原来代码定义消费监听器时,使用如下的代码:hPp28资讯网——每日最新资讯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 ,很多开发同学想只操作一条消息。hPp28资讯网——每日最新资讯28at.com

于是,我们可以将 SDK API 简化为:hPp28资讯网——每日最新资讯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;    }});

开发者在消费时,可以一条一条操作,代码简洁了不少。hPp28资讯网——每日最新资讯28at.com

同时,很多开发者在使用普通消费、顺序消费时,需要返回延时消费的状态码时,两种消费模式定义的枚举也不相同。我们将枚举做了统一:hPp28资讯网——每日最新资讯28at.com

/** * 消费消息的返回结果 */public enum ConsumerAction {    /**     * 消费成功,继续消费下一条消息     */    CommitMessage,        /**     * 消费失败,告知服务器稍后再投递这条消息,继续消费其他消息     */    ReconsumeLater;}

3 订阅关系一致

实际场景里,订阅关系不一致是极容易发生的事情,就算是高级别的架构师也会翻车,每次翻车现场都是惨不忍睹。hPp28资讯网——每日最新资讯28at.com

正确的订阅关系见下图:hPp28资讯网——每日最新资讯28at.com

图片图片hPp28资讯网——每日最新资讯28at.com

正确的订阅关系hPp28资讯网——每日最新资讯28at.com

代码逻辑角度来看,每个消费者实例内订阅方法的主题、 TAG、监听逻辑都需要保持一致。hPp28资讯网——每日最新资讯28at.com

图片图片hPp28资讯网——每日最新资讯28at.com

当订阅关系不一致时,在 Broker 端同一个消费组内的各个消费者客户端的订阅信息相互被覆盖,从而导致某个消费者客户端无法拉取到新的消息。hPp28资讯网——每日最新资讯28at.com

怎么解决呢 ?hPp28资讯网——每日最新资讯28at.com

我当时想起了阿里技术专家沈询的一句话:hPp28资讯网——每日最新资讯28at.com

世界上解决一个计算机问题最简单的方法:“恰好”不需要解决它 !hPp28资讯网——每日最新资讯28at.com

公司内部出现订阅关系一致99%的问题是:消费者组一致的前提下,主题相同,但 TAG 不相同。hPp28资讯网——每日最新资讯28at.com

基于此,我的设计思路就明确了:不开放订阅 TAG 的权限!hPp28资讯网——每日最新资讯28at.com

没想到吧,我就是这么粗暴。hPp28资讯网——每日最新资讯28at.com

按照这种设计思路,虽然开始有的程序员会有质疑,但你和他梳理好消费者组的定义,以及做好领域划分,对业务来讲,反而清晰了。hPp28资讯网——每日最新资讯28at.com


hPp28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-87267-0.html如何实现一个简单易用的 RocketMQ SDK

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Tailwind 4.0 即将到来:前端开发的“速度与激情”

下一篇: Python Queue模块全攻略

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
Top