Rocket MQ系列五 - 发送消息实践

数据库1:数据库创建与管理(头歌云课) 在 Windows 系统中,可以直接通过 SQLServer 的应用程序连接数据库,不过很多时候在生产环境下,我们需要通过命令行来连接数据库。两个数据库,数据库名分别为 TestDb 和 MyDb 的数据库,注意先后顺序。为了完成本关任务,你需要掌握:1.如何在 Linux 系统中连接 SQLServer 数据库,2.如何创建数据库。连接的数据库是本地数据库,用户名是 sa ,密码是 ' 阅读详情

发送普通消息

        普通消息,也叫并发消息,是发送效率最高、使用场景最多的一类消息。发送普通消息的代码如下:

    public static void main(String[] args) throws MQClientException, InterruptedException {

        // 创建默认的生产者
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.start();
  
        for (int i = 0; i < 128; i++)
            try {
                {
                    // 创建消息对象
                    Message msg = new Message("TopicTest",
                        "TagA",
                        "OrderID188",
                        "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                    SendResult sendResult = producer.send(msg);
                    System.out.printf("%s%n", sendResult);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        // 关闭
        producer.shutdown();
    }

发送顺序消息

        同步发送消息是,根据HashKey将消息发送到指定的分区中,每个分区中的消息都是按照发送顺序保存的,即分区有序。如果Topic的分区被设置为1,这个Topic的消息就是全局有序的。注意,顺序消息的发送必须是单线程,多线程将不再有序。顺序消息的消费和普通消息的消费方式不同。代码如下:

        // 第一步 初始化生产者,配置生产者参数,启动生产者
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");

        producer.start();
        
        // 初始化消息体
        Message msg = new Message("TopicTest",
                "TagA",
                "Hello RocketMQ ".getBytes(RemotingHelper.DEFAULT_CHARSET));

        Integer hashKey = 123;

        // 核心操作 MessageQueueSelector ,根据 hashKey选择当前消息发送到那个分区中
        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);
            }
        }, hashKey);
        
        producer.shutdown();

发送延迟消息

        生产者发送消息后,消费者在指定时间才能消费消息,这类消息被称为延迟消息或定时消息。生产者发送延迟消息前需要设置延迟级别,目前开源版本支持18个延迟级别。

private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";

        Broker 在接收用户发送的消息后,首先将消息保存到名为 CHEDULE_TOPIC_XXXX的Topic中。此时,消费者无法消费该延迟消息。然后,由Broker端的定时投递任务定时投递给消费者。

        保存延迟消息的实现逻辑 见类chduleMessageService。按照配置的延迟级别初始化多个任务,每秒执行一次。如果消息投递满足时间条件,那么将消息投递到原始Topic中。消费者此时可以消费该延迟消息。

发送事务消息

        事务消息的发送、消费流程和延迟消息类似,都是先发送到对消费者不可见的Topic中。当事务消息被生产者提交后,会被二次投递到原始Topic中,此时消费者正常消费。事务消息的发送具体分为以下两步:

        第一步:用户发送一个half消息到Broker,Broker设置 queueOffset = 0,即对消费者不可见。

        第二步:用户本地事务处理成功,发送一个commit,消息到Broker,Broker修改queueOffset为正常值,达到重新投递的目的,此时消费者可以正常消费;如果本地事务处理失败,那么将发送一个RollBack消息给Broker,Broker删除half消息。


        // 第一步 初始化事务消息生产者
        TransactionMQProducer producer = new TransactionMQProducer("please_rename_unique_group_name");
        // 第二步 配置生产者的各个参数和Broker回调,检查本地事务处理并启动生产者
        producer.setCheckThreadPoolMaxSize(2);
        producer.setCheckThreadPoolMinSize(2);
        producer.setCheckRequestHoldMax(2000);
        producer.setTransactionCheckListener(new TransactionCheckListener() {
            private AtomicInteger transactionIndex = new AtomicInteger(0);

            @Override
            public LocalTransactionState checkLocalTransactionState(MessageExt msg) {
                int value = transactionIndex.getAndIncrement();
                if (value % 6 == 0) {
                    throw new RuntimeException("Cloud not find db");
                } else if (value % 5 == 0) {
                    return LocalTransactionState.ROLLBACK_MESSAGE;
                } else if (value % 4 == 0) {
                    return LocalTransactionState.COMMIT_MESSAGE;
                }
                return LocalTransactionState.UNKNOW;
            }
        });

        producer.start();

        // 第三步 设置本地事务处理器,发送消息
        Message msg = new Message("TopicTest",
                "tags",
                "KEY",
                ("Hello EocketMQ " + System.currentTimeMillis()).getBytes(RemotingHelper.DEFAULT_CHARSET));

        SendResult sendResult = producer.sendMessageInTransaction(msg, new LocalTransactionExecuter() {
            private AtomicInteger transactionIndex = new AtomicInteger(1);

            @Override
            public LocalTransactionState executeLocalTransactionBranch(Message msg, Object arg) {
                int value = transactionIndex.getAndIncrement();
                if (value == 0) {
                    throw new RuntimeException("Cloud not find db");
                } else if (value % 5 == 0) {
                    return LocalTransactionState.ROLLBACK_MESSAGE;
                } else if (value % 4 == 0) {
                    return LocalTransactionState.COMMIT_MESSAGE;
                }
                return LocalTransactionState.UNKNOW;
            }
        }, null);

        System.out.printf("%s%n", sendResult);

发送单向消息

        单向消息的生产者只管发送过程,不管发送结果。单向消息主要用于日志传输等消息允许丢失的场景。

        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("127.0.0.1:9876;127.0.0.2:9876;");
        producer.setInstanceName("instanceName");
        producer.start();

        Message msg = new Message("TopicTest", "TagA", "OrderID1", "Hello World".getBytes(RemotingHelper.DEFAULT_CHARSET));
        producer.sendOneway(msg);

批量发送消息

        批量发送消息能提高发送效率,提升系统吞吐量。批量消息发送有一以下3点注意事项:

        (1)消息最好小于1MB

        (2)同一批批量消息的Topic、waitStoreMsgOK属性必须一致

        (3)批量消息不支持延迟消息

    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("BatchProducerGroupName");
        producer.start();

        //If you just send messages of no more than 1MiB at a time, it is easy to use batch
        //Messages of the same batch should have: same topic, same waitStoreMsgOK and no schedule support
        String topic = "BatchTest";
        List<Message> messages = new ArrayList<>();
        messages.add(new Message(topic, "Tag", "OrderID001", "Hello world 0".getBytes()));
        messages.add(new Message(topic, "Tag", "OrderID002", "Hello world 1".getBytes()));
        messages.add(new Message(topic, "Tag", "OrderID003", "Hello world 2".getBytes()));

        producer.send(messages);
    }

        相对消费者而言,生产者的使用更加简单,一般主要关注消息类型、消息发送方法和方法参数。

        常用的消息类型如下:

消息类型优点缺点备注
普通消息(并发消息)性能最好,单机TPS级别为100 000消息的生产和消费都是无序的大部分场景使用
分区有序消息单分区中消息有序,单机发送TPS万级别单点问题,如果Broker宕机,则会导致发送失败大部分有序消息场景适用
全局有序消息类似传统的Queue,全部消息有序,单机发送TPS千级别单点问题,如果Broker宕机,则会导致发送失败极少场景使用
延迟消息RocketMQ自身支持,不需要额外使用组件,支持延迟特性不能根据任意时间延迟,使用范围受限。Broker随着延迟级别增大支持越多,CPU压力越大,延迟时间不准确非精确,延迟级别不多的场景,非常方便使用
事务消息RocketMQ自身支持,不需要额外使用组件支持事务特性RocketMQ事务是生产者事务,只有生产者参与,如果消费者处理失败则事务失效简单事务处理可以使用

构建OneService:打造高效、安全、灵活的企业级数据服务平台 数据服务(OneService)作为统一的数据服务出口,实现了数据的统一市场化管理,有效地降低数据开放门槛的同时,保障了数据开放的安全。 阅读详情

相关推荐

SAP IDOC实战:如何用EDI实现跨公司采购订单自动生成销售订单(附完整配置步骤)

本文详细解析了如何利用SAP IDOC与EDI技术,实现跨公司采购订单自动生成销售订单的完整流程。通过实战案例,从业务蓝图设计、输出条件配置、伙伴参数设定到IDOC消息类型处理,提供了清晰的配置步骤与故障排查指南,帮助企业打通内部业务流,构建高效的自动化闭环。

weixin_29215815的博客 727

RocketMQ入门学习(六)发消息的时候选择queue的算法有哪些?

一、说明 分为两种,一种是直接发消息,client内部有选择queue的算法,不允许外界改变。还有一种是可以自定义queue的选择算法(内置了三种算法,不喜欢的话可以自定义算法实现)。 publicclassorg.apache.rocketmq.client.producer.DefaultMQProducer{ //只发送消息,queue的选择由默认的算法来实现 @Override publicSendResultsend(Collection<Messa...

My_SweetXue的博客 949

Labview_DQMH框架学习1--浅析

本文主要结合一个相对容易理解的例子,阐述 DQMH 框架的工作原理,希望对初学者有一定的帮助。

hrbeuxn的博客 3049

Snowflake数据共享本质:存储、计算与控制权的三方解耦

数据共享在现代云数据平台中已超越传统ETL的数据搬运概念,演进为一种基于元数据指针、零拷贝传输的协作范式。其核心原理在于解耦存储所有权、计算使用权和访问控制权三大维度,从而实现毫秒级实时性、精细化权限治理与可审计的跨组织协作。这种架构不仅支撑安全合规的数据流通,更成为构建数据产品、赋能业务实时决策与推动数据商业化(如Marketplace上架、第三方征信服务)的技术底座。本文深入剖析Snowflake数据共享的底层机制与生产级落地要点,覆盖direct share、data exchange、secure

weixin_30470643的博客 691

华为云HCS解决方案笔记HUAWEI CLOUD Stack【面试篇】

华为云解决方案介绍、华为云服务介绍,华为云网络平面规划等

weixin_48375618的博客 1万+

Qt入门教程【Core篇】singal and slot信号与槽

Qt中信号与槽singal and slot

小鱼酱的博客 2449

rocketMQ架构(集群)流程,及顺序消费等问题

RocketMQ架构图 RocketMQ 四种集群部署方式 单个Master节点, 缺点就是如果宕机之后可能整个服务不可用; 多个Master节点,分摊存放我们的消息,缺点:没有Slave节点,主的Master节点宕机之后消息数据可能会丢失的; 多个Master和Slave节点,之间数据同步采用异步形式,效率非常高,数据可能短暂产生延迟(毫秒级别的) 多个Master和Slave节点,采用同步形式,效率比较低、数据不会产生延迟。 broker如果配置集群: 多个broker(master).

祁_z 4494

基于VisionMaster实现数据实时存储至MySQL (二)

摘要:之前的分享主要聚焦于简单的一维数据实时存储。但在做缺陷检测项目时,情况往往更加复杂:一张检测图像中可能同时存在多个缺陷,每个缺陷都有一组独立的核心参数(如质心、长短轴、面积等)。如何在 MySQL 中记录这些成组出现的缺陷数据,而不只是简单的单条记录?

haier123888的博客 226

和面试官吹吹RocketMQ消息发送MessgQueue选择及高可用机制源码

文章目录源码版本消息发送源码源码入口消息发送核心源码Product发送消息的重试机制Broker故障转移机制选择MessageQueue源码总结关于我 源码版本 4.8.0 消息发送源码源码入口 最简单的消息发送代码 DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); producer.setNamesrvAddr("127.0.0.1:9876");

念念不忘,必有回响 2275

Qt | 开发过程中总结的经验

关于如何判断自己的Qt库是多少位,有个误区就是很多人要么看成了QtCreator的关于信息中列出的位数,要么以为自己是64位的系统就认为是64位的Qt,最终要在Qt构建套件中查看具体位数,大概从Qt5.14开始基本上很少提供32位的库,尤其是Qt6.0以后基本上默认就是只有64位的库了,这也是顺应时代潮流,毕竟不久的将来(个人预计2030年以前)基本上32位的系统占比不超过1%,放心大胆的用64位的库吧,抛弃烦人的32位以及XP系统。Qt常用类的头文件的函数看完学完使用一遍并加以融会贯通,月薪30K起步。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 490

【keil5和STC-ISP】保姆级下载安装教程

点击下载中的产品下载。然后就会看到如下界面:可以看到,提供了针对不同芯片架构的四套独立开发工具。:你使用的51单片机,其核心就是。C51套件里的编译器是专门为这个架构优化的。:如果安装了MDK-Arm,你在创建新项目时将像“AT89C51”这样的51系列芯片型号,无法进行开发。进入如下界面:双击下载 → 双击运行安装 → 同意协议并下一步 → 使用默认安装路径 → 完成安装。

深耕CV 1641

RocketMQ 11种消息类型,你知道几种?

RocketMQ事务消息的实现主要是先将消息存到这个中间Topic,有些资料会把这个消息称为半消息(half消息),这是因为这个消息不能被消费之后会执行本地的事务,提交本地事务的执行状态RocketMQ会根据事务的执行状态去判断commit或者是rollback消息,也就是是不是可以让消费者消费这条消息的意思在一些异常情况下,生产者无法及时正确提交事务执行状态RocketMQ会向生产者发送消息,让生产者去检查本地的事务,之后再提交事务状态。

Reische的博客 4170

基于数字图像处理方法的迷宫问题图解 : 基于骨架提取、四邻域

问题是,这条红色的线是人为标记出来的能通的路线,对计算机来看,黑色和红色的线没有任何差异,所以之前的想法压根不起作用。对应于数字图像的表达,就是从远离主干的分支端点出发,如果4邻域中只有一个可以通的道路,那么这个点在分支上。闪电划过,有一道连接了天空和大地,就是迷宫的解,其余的分支就是迷宫中对应的死路。类似这个闪电图,假设图中最粗的主干(迷宫解的路线)是最先形成的,其余的细小的分支是慢慢从主干上形成的。因此,只要在端点的4邻域中,找到可以走的道路,那么一定就是分支,也就是要移除的路线。

Henry的博客 2073

Rocket MQ 从入门到实践

生产者将消息推送到队列之后,如果有消费者去消费这个主题上的消息,在队列上记录下不同消费者互不干扰不同的消费位置,它就可享有同一份消息。生产者将消息发送给Exchange交换机,交换机路由到不同的队列,不同的消费者针对不同的队列进行消费,实现简单、但是消息存储冗余。是否一致:如果消息的量级规模存在巨大差异,或者说消息的链路重要程度存在差异,则应该使用不同的主题进行隔离拆分。是否一致:不同类型的消息,如顺序消息和普通消息需要使用不同的主题进行拆分,无法通过tag标签进行分类。即不丢消息,但也有少量重复。

hukehukehukehuke的博客 1045

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Rocket MQ系列四 - 消息发送流程

RocketMQ客户端的消息发送通常分为以下3层: 业务层:通常指直接调用RocketMQ Client发送API的业务代码。 消息处理层:指RocketMQ Client获取业务发送的消息对象后,一系列的参数检查、消息发送准备、参数包装等操作。 通信层:指RocketMQ基于Netty封装的一个RPC通信服务,RocketMQ 的各个组件之间的通信全部使用该通信层。 总体上讲,消息发送流程首先是RocketMQ客户端接...

javaJasonjava的博客 1873

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Rocket MQ 详解

开这个专栏主要之前实习的时候经常用到Rocket MQ,大厂使用的也比较多,主要讲解一些关键原理和概念。 介绍 定义:分布式消息中间件。MQ是消息队列的意思。 特点:低延迟、高并发、高可用、高可靠。 解释一下“高可用”:通常是指,通过设计减少系统不能提供服务的时间。 假设系统一直能够提供服务,我们说系统的可用性是100%。 如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。 核心概念 Topic:消息主题,我理解为与特定主题任务相关的一类消息。 生产者:生产消息.

strive for the best 的博客 1983

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Rocket MQ

Broker 在收到消息后,通过 MessageStore 将消息存储到 commitLog 中,但是 consumer 在消费消息的时候是按照 topic+queue 的维度来拉取消息的。Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的Broker Name,不同的Broker Id来定义,BrokerId为0表示Master,非0表示Slave。

2401_84881237的博客 1309

20、Rocket MQ集群⾼级特性

⼆、主从节点切换的⾼可⽤集群⼀。

srrsheng的博客 1211

基于Rocket MQ扩展的无限延迟消息队列

延迟队列固定时间间隔的基础上, 通过多次发送延迟消息, 达到任意延时时间组合计算. 通过反射的方式, 实现延迟业务逻辑的调用.简单而言, 就是在Rocket。

IT枫斗者的博客 2186

18、Rocket MQ核⼼编程模型

这—章节,我们就来看下,在这两张图的基础上,如何编写合适的客户端代码,让我们在项⽬中⽤好。⽣产者要发送的消息⽐较多时,可以将多条消息合并成—个批量消息,—次性发送出去。因此,如果要重新发送消息,最好要带上唯—的系统标识,这样在消费者端,才能⾃⾏做幂等判断。⽽消息安全有两⽅⾯的要求,和⽤户⾃定义的属性,都是随着消息—起传递的,所以,消费者端是可以拿到消息的。的作⽤是可以在服务重启时,按照上—次消费的进度,处理后⾯没有消费过的消息。的机制,我们就可以在消息⽣产者发送完消息后,对发送失败的消息进⾏补救。

srrsheng的博客 1034

启动rocketmq_Linux下搭建Rocket MQ服务

本文介绍如何在Linux环境下搭建Rocket MQ服务,内容包含安装需要的环境,安装步骤,启动服务,模拟消息发送和接收,停止服务以及在安装过程中遇到的问题。还是老规矩,先跟着操作,操作完之后就基本都会了,如果还有疑问,请在留言区评论,我会及时回复ps:文中插入了命令,某些地方排版看起来会比较乱,但是操作还是很方便的依赖的环境Rocket MQ安装需要依赖JDK1.8和maven使用java -v...

weixin_31417135的博客 962

rocket mq 源码分析-Message 发送与接收

1、概述2、Producer 发送消息 DefaultMQProducer#send(Message)DefaultMQProducerImpl#sendDefaultImpl() DefaultMQProducerImpl#tryToFindTopicPublishInfo()MQFaultStrategy MQFaultStrategyLatencyFaultToleranc

七月流星 2646

Rocket MQ发送消息的三种方式初析

前言 MQ 发送消息有三种实现方式:可靠同步发送、可靠异步发送、单向(Oneway)发送。基于版本4.2.0+。注意:顺序消息只支持可靠同步发送。 可靠同步发送 原理:同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式。 场景:此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。 可靠异步发送 原理:异步发送是指发送方发出数...

FeelTouch Labs 5702

Rocket MQ如何保证消息顺序消费

文章参考: https://www.cnblogs.com/hzmark/p/orderly_message.html https://www.zhihu.com/question/30195969 消息中间件中的顺序消息 什么是顺序消息 有了上述的基础之后,我们回到本篇文章的主题中,聊一聊消息中间件中的顺序消息。 顺序消息(FIFO 消息)是 MQ 提供的一种严格按照顺序进行发布和消费的消息类型。顺序消息由两个部分组成:顺序发布和顺序消费。 顺序消息包含两种类型: 分区顺序:一个Part

qq_15045645的博客 3868

17、Rocket MQ快速实战以及核⼼概念详解

Rocket MQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的—个顶级项目。早期阿里使用ActiveMQ ,但是,当消息开始逐渐增多后,ActiveMQ的IO性能很快达到了瓶颈。于是, 阿⾥开始关注Kafka。但是Kafka是针对日志收集场景设计的,他的高级功能并不是很贴合阿里的业务场景。

srrsheng的博客 1012

互联网公司都喜欢的消息队列,阿里Rocket MQ详细介绍

RocketMQ是⼀款阿⾥巴巴开源的消息中间件,在2017年9⽉份成为Apache的顶级项⽬,是国内⾸个互联⽹中间件在 Apache 上的顶级项⽬。

java_beautiful的博客 1092
上一篇: Rocket MQ系列四 - 消息发送流程
下一篇: 什么是设计模式,设计模式的分类和原则
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值