RocketMQ:写一个生产者程序要注意些什么

RocketMQ(二)RocketMQ实战 RocketMQ的实际使用 阅读详情

背景

消息队列是我们日常工作中最长用到的中间件之一,那么写一个生产者程序要注意什么,这里已 RocketMQ 为示例,简单总结下。

关键字:RocketMQ,消息中间件,生产者,

选择合适的发送消息的方式

RocketMQ 支持同步发送、异步发送、延迟投递、单向投递(Oneway),我们看下各自的适用场景。

同步发送

如果要立即知道消息发送的结果,等待消息发送完成后才能继续下一步动作,就应该采用同步发送。

同步发送的代码如下:

    public static void test02() throws UnsupportedEncodingException, MQClientException, RemotingException, InterruptedException, MQBrokerException {

        // 1\. 指定 group、nameserver
        DefaultMQProducer producer = new DefaultMQProducer("test_topic01_group001");
        producer.setNamesrvAddr("localhost:9876");

        // 2\. 启动生产者
        producer.start();

        // 3\. 构造消息
        Message message = new Message("test_topic01", ("hello world" + System.currentTimeMillis()).getBytes(RemotingHelper.DEFAULT_CHARSET));

        // 4\. 同步发送,第一个参数是要发送的消息,第二个参数是超时时间
        producer.send(message, 10);

        System.out.println("消息发送成功");
        producer.shutdown();
    }

异步发送

如果不需要立即感知消息发送的结果,或者对性能有一定要求的话,就可以采用异步方式。采用异步发送,RocketMQ 会起一个线程,异步执行消息发送逻辑,不影响主流程。消息发送完成后,会有个回调函数,业务代码基于回调结果做后续的操作。

    public static void test01() throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException {
        // 1\. 指定 group、nameserver
        DefaultMQProducer producer = new DefaultMQProducer("test_topic01_group001");
        producer.setNamesrvAddr("localhost:9876");

        // 2.启动 producer //
        producer.start();

        // 3\. 构造消息
        Message m = new Message("test_topic01", null, ("hello world" + System.currentTimeMillis()).getBytes(RemotingHelper.DEFAULT_CHARSET));

        // 4\. 异步发送,一个参数是要发送的消息,第二个参数是消息发送完成后(可能成功,可能失败)的回调接口
        producer.send(m, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println(String.format("sendResult = %s, sendStatus = %s", sendResult, sendResult.getSendStatus()));
            }

            @Override
            public void onException(Throwable e) {
                e.printStackTrace();
            }
        }, 1);

        System.out.println("消息发送成功");
        producer.shutdown();

    }

异步发送完成后,会回调我们指定的回调函数。发送结果有四种状态:

  • SEND_OK:大吉大利,发送成功
  • FLUSH_DISK_TIMEOUT:表示消息发给了 Broker,但是 Broker 机器存储消息的时候,没有在规定时间内 flush 到硬盘上
  • FLUSH_SLAVE_TIMEOUT:表示消息发给了 Broker,但是 Broker 做主从同步的时候,没有在规定时间内同步给 slave 机器
  • SLAVE_NOT_AVAILABLE:表示消息发给了 Broker,但是 Broker 做主从同步的时候,没有找到 slave 机器

延迟投递

我们在外卖平台上点外卖,下单后会跳到一个界面,告诉我们,说是要在15分钟内付款,不然就自动取消订单,这个该怎么实现呢?

用延迟投递就可以简单的实现,用户下单成功后,发一个延迟15分钟的MQ消息,消费者收到消息,再校验下有没有付款,没付款的话,就取消订单即可。

代码实现起来很简单,构造好消息后,调用 setDelayTimeLevel() 方法,设置好延迟时间,再发送即可

Message message = new Message("test_topic01", ("hello world" + System.currentTimeMillis()).getBytes(RemotingHelper.DEFAULT_CHARSET));

message.setDelayTimeLevel(2);

producer.send(message, 10);

单向投递(Oneway)

如果面对一些追求吞吐量,对稳定要求不高的场景,比如日志收集,用户行为收集等场景,单向投递就是一个不错的选择。

当采用单向投递方式,RocketMQ 只负责把消息写入 broker 的 socket 缓冲区就返回,不等待对方的处理结果。这种消息发送方式,可以达到微秒级。

代码实现如下,调用producer 的 sendOneway() 方法即可:

Message message = new Message("test_topic01", ("hello world" + System.currentTimeMillis()).getBytes(RemotingHelper.DEFAULT_CHARSET));

producer.sendOneway(message);

思考是否要使用消息 tag

分享一个日常工作中实际遇到的 case。

最近接入了这么一个业务场景,商家端因为商家端很多,每天会推送很多消息(百万级),这些消息分为几种类型:营销活动提醒、缴费提醒、日常推送等等。

伟大的PM说,营销活动的提醒如果能让销售也收到,这样销售就知道商家最近都感知到哪些活动,就能及时跟进讲解。所以想着把营销活动类的提醒也转发一份给销售端。

这个伟大的需求,最简单的方式就是申请一个消费者,消费商家端的消息,判断是否是【营销活动提醒】,如果是就进行转发,不是就忽略。

但是每天百万级的消息,仅仅三四台消费者机器去消费肯定不够,会造成消息堆积。再一打听,【营销活动提醒】类型的消息每天很少,就一两条。难道要为这一两条消息投入七八台机器吗,有什么办法吗?

这个时候,使用消息 tag 就能很好的解决。让生成者发消息的时候,把消息类型传到tag里,而我这边消费的时候也只消费【营销活动提醒】类型的消息。这样,从broker拉取的消息,从百万级降低到几条消息,少占用带宽从而提高吞吐。

所以,写生成者程序的时候要思考下业务场景,尤其是消息量级比较大的场景,消费者那边是否会需要关注所有的消息,不需要的话,就要考虑是否使用tag。

代码实例如下,Message 的构造函数,第二个就是 tag 参数。

Message message = 
    new Message("test_topic01", "tag", ("hello world" + System.currentTimeMillis()).getBytes(RemotingHelper.DEFAULT_CHARSET));

重试

现在都是分布式环境了,消息的发送是要经过网络的,而网络又是不稳定的,另外消息中间件本身也可能会出问题(机器宕机,机器迁移等)。

所以需要有合适的重试机制,提高消息发送的成功率。

设置重试次数的时候有一点要注意,就是同步发送和异步发送用的是不同的配置,不要设置错了。

总结

写一个生产者程序要注意基于业务场景,选择合适的发送消息的方式,其次是思考是否要使用消息 tag 和重试。

 

最新 RocketMQ 入门教程 文章目录一. RocketQM简介1.1 功能作用优点1.2 图示1.3 基本概念二. 下载安装与配置1. 下载安装2. RocketMQ 配置2.1 配置环境变量2.2 本地部署2.2.1 启动RocketMQ2.2.2 启动Broker程序2.2.3 部署RocketMQ插件三. springboot整合RocketMQ3.1 创建spring boot项目3.2 配置pom.xml文件3.3... 阅读详情

相关推荐

RocketMQ案例实战

假如是在同一个comsume组(consumeGroup1)里面,且topic定义的和生产者一样,之前订阅过生产者的消息,即已经注册到broker上面了,如上述有两个之前订阅过但是不在线,所以只有当消费者重启后会被消费:如果2个同时上线,则属于集群消费还是会被两个消费者均分,如果上线1个,则未消费消息将会被这一个全部消费掉。假如消费者是在同一个comsume组(consumeGroup1)里面,但是topic和生产者定义不一样,则意味着没订阅,此时即使生产者生产了消息,也不会被消费。

Romantic丶的博客 2131

Java整合RocketMQ实现生产消费

如果由于网络闪断、生产者应用重启等原因,导致某条事务消息的二次确认丢失,Broker 端会通过扫描发现某条消息长期处于“半事务消息”时,需要主动向消息生产者询问该消息的最终状态(Commit或是Rollback)。这样最终保证了本地事务执行成功,下游就能收到消息,本地事务执行失败,下游就收不到消息。Pull是客户端需要主动到服务端取数据,优点是客户端可以依据自己的消费能力进行消费,但拉取的频率也需要用户自己控制,拉取频繁容易造成服务端和客户端的压力,拉取间隔长又容易造成消费不及时。

二蛋的博客 4024

深入解析SPLL单相软件锁相环:从SOGI原理到PI系数调优实践

本文深入解析SPLL单相软件锁相环技术,从SOGI原理到PI系数调优实践,详细介绍了其在数字电源设计中的应用。通过数学推导和实际调试经验,帮助工程师快速掌握锁相环的核心参数计算和优化方法,提升电网相位追踪的精确度和响应速度。

weixin_30316097的博客 384

传统java项目集成rocketmq队列之生产者

文章目录前言一、rocketmq是什么?二、集成步骤1.引入依赖2.读入数据总结 前言 传统java想要集成rocketmq来发送消息,如果改框架,必定耗时耗力,且稳定性无法保障。本文讲讲述非springboot的传统java如果快速集成rocketmq,不分析原理,只讲使用。 提示:以下是本篇文章正文内容,下面案例可供参考 一、rocketmq是什么? RocketMQ 是阿里巴巴开源的分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念..

九二战歌的博客 2664

CANoe软件之离线报文回放与分析实战

本文详细介绍了如何使用CANoe软件进行离线报文回放与分析,帮助工程师将现场故障数据转化为可反复研究的实验室资源。通过实战步骤,指导如何搭建分析工程、加载DBC文件解码信号,并利用Trace和Graphics窗口进行深度数据筛选与图形化分析,从而高效定位汽车电子故障,是提升诊断效率的关键技能。

weixin_29227585的博客 530

Android14到Android16源码移植中的Bluetooth模块规范适配指南

本文详细解析了从Android14到Android16源码移植过程中Bluetooth模块的规范适配挑战,重点介绍了Android.bp配置差异及常见编译报错解决方案。针对代码规范检查、final字段声明、静态方法优化等核心问题提供实用修复方法,帮助开发者高效完成版本升级适配工作。

fire9的博客 254

rocketMQ —— 03(Java应用rocketmq)

目录标题一、普通消息1、消息生产者Producer1.1、同步生产1.1、异步生产1.2、单向发送2、消息消费者Consumer2.1、消费者pull主动拉取2.2、broker向消费者push推送二、顺序消息 一、普通消息 1、消息生产者Producer 1.1、同步生产 package com.lihua.rocketmq.producer; import org.apache.rocketmq.client.exception.MQClientException; import org.apache

a123123sdf的博客 4238

LAMMPS实操系列(一): 大量FCC-CoCrCuFeNi高熵合金建模与最稳定结构筛选

高熵合金(High-entropy alloys,HEA),是由五种或五种以上等量或大约等量金属形成的合金。由于高熵合金可能具有许多优秀的物理化学性质,因此在材料科学领域受到广泛关注

Ceshigo_CD的博客 3259

JAVA开发(RocketMq工作原理以及和其他MQ比较)

​​​​​​​使用消息的场景一般是为了错峰流量控制,解耦系统消息处理机制,以一种延迟的方式达到数据的一致性,保护好系统性能。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 2629

生成自定义工具栏

我们生成了和VBA时代几乎一样的常用的工具栏。用WPF也可以完成以后的插件开发,界面控件编写基本靠自己绘画,还有用代码去控制,代码结构像HTML,做过网站的应该可以很快入手。其它后台C#代码除了对控件代码的控制外,和WinForm基本相同,但目前来看用WPF是生成自定义工具栏的较好的办法。当然,你也可以在工具栏命令中调用WinForm程序,对Coreldraw进行操作,这也应该是比较高效的办法,下次会讨论。资源的加入是本次调试的难点之一,我们的目标是让图片资源嵌入到程序中去,不必去电脑文件目录去调用;

力先生C#程序开发 1378

分子动力学仿真软件:LAMMPS_(16).应用案例分析

通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。

kkchenjj的博客 838

RocketMQ - 零基础学:第一个生产者/消费者Demo

本文介绍了如何使用Apache RocketMQ实现基础的生产者-消费者Demo。首先讲解了RocketMQ作为分布式消息中间件的作用和应用场景,如电商系统中的异步处理。接着详细说明了环境准备工作,包括JDK安装和RocketMQ服务的两种启动方式(直接下载或Docker)。然后指导读者创建Maven项目并添加RocketMQ客户端依赖。文章采用循序渐进的方式,帮助开发者快速上手RocketMQ的基本使用,适合零基础学习者入门消息队列技术。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【RT-DETR实战】112、NCNN模型转换与层实现支持:从模型文件到推理引擎的硬核实战

本文详细记录了将RT-DETR模型部署到NCNN框架的全过程及关键要点。作者首先遇到MultiHeadAttention等算子不支持的问题,通过ONNX中间转换和自定义层实现解决。文章具体介绍了PyTorch到NCNN的权重转换技巧、模型优化方法(包括量化和线程优化)以及调试经验,强调逐层对比输出、预处理检查和边界情况测试的重要性。最后分享了保持转换流程可复现性的实用建议,指出手动调试虽然耗时但能加深对模型的理解,体现了工程师在解决技术难题时的专业精神与成就感。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 44

RocketMQ的消费者消息重试和生产者消息重投

详细介绍了RocketMQ的消息重试机制,RocketMQ的消息重试可以分为生产者重试和消费者重试两个部分。

终生学习践行者 1万+

100天精通Python(可视化篇)——第89天:Bokeh库绘图可视化基础入门(参数说明+案例实战)

专栏导读 一、Bokeh是什么? 二、安装与导入 三、Bokeh接口介绍 四、创建图表 五、添加自定义渲染器 切换主题 添加图例 图例位置 图例方向 图例背景和边界 图例文本的外观 行列布局 网格布局

努力让自己发光,对的人才能迎着光而来 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RocketMQ生产者原理及最佳实践

发送消息的一方被称为生产者,它在整个RocketMQ的生产和消费体系中扮演的角色如下图所示。生产者组一个逻辑概念,在使用生产者实例的时候需要指定一个组名。一个生产者组可以生成多个Topic的消息。生产者实例一个生产者组部署了多个进程,每个进程都可以成为一个生产者实例。Topic主题名字,一个Topic由若干个Queue组成。和。前者用户生产普通消息、顺序消息、单向消息、批量消息、延迟消息,后者主要用户生产事务消息。......

带翅膀的猫的博客 3012

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RocketMQ的生产者原理和最佳实践

发送消息的一方被称为生产者,它在整个RocketMQ的生产和消费体系中扮演的角色如图2-1所示。生产者组:一个逻辑概念,在使用生产者实例的时候需要指定一个组名。一个生产者组可以生产多个Topic的消息。生产者实例:一个生产者组部署了多个进程,每个进程都可以称为一个生产者实例。Topic:主题名字,一个Topic由若干Queue组成。RocketMQ 客 户 端 中 的 生 产 者 有 两 个 独 立 实现 类 :

2401_83384536的博客 1089

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RocketMQ第二期:生产者、消费者启动原理

从代码层面解析生产者、消费者启动原理以及消息发送的原理。

徐小陌的博客 1502

RocketMQ生产者组Producer Group介绍

生产者组(Producer Group) 是 RocketMQ 中一个用于逻辑分组的概念,其最核心的价值在于支持事务消息的回查机制,同时也提供了生产端的负载均衡和高可用能力。生产者组(Producer Group) 是一类行为相似的生产者的逻辑集合。· 回查的凭据:Broker 在发起回查时,并不知道具体是哪个生产者实例发送了那条半消息(因为生产者的实例可能很多,且会上下线)。在生产环境中,可以通过生产者组的名称来监控和追踪一组生产者的发送状态、TPS、延迟等 metrics,便于进行统一的运维管理。

学亮编程手记 1380

RocketMQ生产者(二)

生产者 生产者组:一个逻辑概念,在使用生产者实例的时候需要制定一个组名,一个生产者组可以生产多个Topic消息 生产者实例:一个生产者组部署了多个进程,每个进程可以成为一个生产者实例 topic:主题名字,一个topic由若干个Queue组成 消息结构 Topic:主题名字,可以通过RocketMQ Console创建 Flag:目前没用 Properties:消息扩展信息,Tag、keys、延迟级别都保存在这里 Body:消息体,字节数组。需要注意生产者使用什么编码,消费者也必须使用相同编码解码,否则

严文文 Chris 1403

RocketMQ源码解析之消息生产者(启动流程)

文章目录1.消息生产者一些原理1.1 介绍本篇内容2.启动流程3.获取topic4.发送消息流程5.发送模式5.1 同步发送5.2异步发送5.3单向发送4.延时容错 1.消息生产者一些原理 在上篇《RocketMQ源码解析(搭建环境)》我们主要介绍了读源码的一些知识储备与源码环境搭建,在读源码的一些知识储备中介绍了一下RocketMQ的架构,我们知道RocketMQ 分为nameserv 与broker ,再就是客户端 也就是我们说的消息生产者与消息消费者。接下来我们分别来介绍下: nameserv :玩

猿上生活 2141

RocketMQ的生产者——启动流程

异步重试是有条件的重试,并不是每次发送失败后都重试。比如Namesrv地址、生产者组名等,调用start()方法启动生产者实例,start()方法调用了生产者默认实现类的start()方法启动,这里我们主要讲实现类的start()方法内部是怎么实现的。DefaultMQProducer 是 RocketMQ 中 默 认 的 生 产 者 实 现 ,DefaultMQProducer的类之间的继承关系如图2-2所示,可以看到这个生产者在实现时包含生产者的操作和配置属性,这是典型的类对象设计。

2401_83384536的博客 960

rocketmq的生产者源码解读一(启动生产者)

rocketmq源码之生产者启动

简单,快乐,拥抱变化 1815

Spring Boot 集成 RocketMQ

RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ 的原理和核心概念的详细介绍,帮助你快速认识和熟悉 RocketMQ。到官网 下载最新版本的 RocketMQ 二进制包(Binary 下载)。将下载的 ZIP 文件解压到您选择的目录,例如 D:\software\rocketmq-all-5.1.4-bin-release。

sunyanchun的专栏 5233
上一篇: 阿里云数仓MaxCompute存取性能调研报告,内含纯手搓SQL生成器
下一篇: 国内终于有了一本Akka 的专著,助你架构之路一帆风顺,太香了
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值