中间件之RocketMQ
RocketMQ是一个开源的分布式消息队列系统,起源于阿里巴巴集团内部。最初,RocketMQ(前身为Metaq)被设计为满足阿里巴巴集团内部大规模分布式系统下的高吞吐量、低延迟和高可靠性的消息传递需求。随着其在阿里巴巴内部的广泛应用和不断优化,RocketMQ逐渐成为一个成熟且功能丰富的消息中间件解决方案。
在经历了一段时间的内部发展和测试之后,阿里巴巴将RocketMQ作为开源项目捐赠给了Apache软件基金会。随后,RocketMQ进入Apache孵化器,并于2016年成功成为Apache顶级项目。这一举措不仅体现了RocketMQ的技术实力和社区认可度,也为其后续的发展注入了新的动力。
一、功能
RocketMQ提供了多种强大的功能,以满足不同场景下的消息传递需求。以下是一些主要的功能特点:
1、高可用性和高可靠性:
RocketMQ支持多Master多Slave的同步双写以及异步复制模式,确保消息在传输和存储过程中的高可用性和高可靠性。此外,RocketMQ还提供了多种消息发送和存储策略,如同步发送、异步发送、同步刷盘和异步刷盘等,以进一步提高消息的可靠性和性能。
2、高性能和低延迟:
RocketMQ采用高效的消息传输和存储机制,能够实现高吞吐量和低延迟的消息处理。这使得RocketMQ非常适合处理大规模的消息传递任务,如实时计算、日志采集等。
3、异步解耦:
RocketMQ通过异步消息传递机制,将消息的发送和接收过程进行解耦,降低了系统的耦合性,提高了系统的稳定性和可伸缩性。
4、流量削峰:
在高并发场景下,RocketMQ能够将请求转换为消息,并通过消息队列平滑地削峰填谷,保证后端服务的稳定性和响应速度。
5、顺序消息:
RocketMQ支持顺序消息,可以确保消息按照发送的顺序被消费。这对于一些对消息顺序有严格要求的场景非常重要,如订单处理、流程审批等。
6、消息过滤和标签:
RocketMQ支持根据消息的Tag进行过滤,使得消费者可以只关注自己感兴趣的消息。此外,RocketMQ还提供了SQL92标准的消息过滤机制,允许消费者根据消息的属性进行更复杂的过滤操作。
7、分布式事务消息:
RocketMQ支持分布式事务消息,通过半消息确认和消息回查机制来保证分布式事务的一致性。这使得RocketMQ非常适合在分布式系统中处理复杂的业务逻辑。
8、丰富的监控和管理功能:
RocketMQ提供了丰富的监控和管理功能,帮助用户监视系统状态、消息流和性能指标。这有助于用户及时发现并解决问题,保证系统的稳定运行。
二、使用场景
RocketMQ因其强大的功能和灵活的配置,被广泛应用于各种场景中。以下是一些常见的使用场景:
1、异步解耦:
在微服务架构中,各个服务之间往往需要异步通信以解耦服务间的依赖关系。RocketMQ作为消息中间件,可以很好地实现这一需求。
2、流量削峰:
在秒杀、抢购等高并发场景下,直接请求后端服务可能会导致服务过载。通过使用RocketMQ将请求转换为消息并存储在队列中,可以平滑地削峰填谷,保证后端服务的稳定性。
3、日志采集:
在分布式系统中,日志采集是一个常见的需求。RocketMQ支持高吞吐量和低延迟的消息处理,非常适合用于日志采集场景。
4、实时计算:
在实时计算场景中,数据需要实时地从一个系统传输到另一个系统进行处理。RocketMQ提供了高效的消息传输机制,可以确保数据的实时性和准确性。
5、分布式模式缓存同步:
在分布式系统中,多个节点之间需要保持数据的一致性。通过使用RocketMQ的广播消费模式,可以将数据变化通知到所有节点,实现缓存的同步更新。
6、分布式定时/延时调度:
RocketMQ提供了精确的分布式定时消息能力,可以应用于订单超时处理、分布式延时调度等场景。
三、历史版本介绍
RocketMQ经历了多个版本的迭代和优化,以下是其主要版本的历史介绍:
1、Metaq 1.x:
由开源社区killme2008维护,此时Metaq还处于初步发展阶段,但已经展现出了其作为消息中间件的潜力。
2、Metaq 2.x:
于2012年10月份上线,在淘宝内部被广泛使用。这一版本的Metaq在功能和性能上都有了较大的提升,为RocketMQ的后续发展奠定了基础。
3、RocketMQ 3.x:
基于公司内部开源共建原则,RocketMQ项目只维护核心功能,并去除了所有其他运行时依赖。这一版本的RocketMQ更加精简和高效,为大规模分布式系统提供了更好的支持。
随着版本的迭代和升级,RocketMQ在功能、性能和稳定性方面都有了显著的提升。目前,RocketMQ已经成为Apache顶级项目之一,并被广泛应用于各种分布式系统中。
四、使用示例
以下是一个简单的Java代码示例,展示了如何使用RocketMQ发送和接收消息:
// 生产者发送消息
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message; public class Producer { public static void main(String[] args) throws Exception { // 实例化消息生产者Producer DefaultMQProducer producer = new DefaultMQProducer("example_group_name"); // 设置NameServer的地址 producer.setNamesrvAddr("localhost:9876"); // 启动Producer实例 producer.start(); // 创建消息实例,指定topic,tag和消息体 Message msg = new Message("TopicTest", "TagA", ("Hello RocketMQ").getBytes()); // 发送消息到一个Broker producer.send(msg); // 如果不再发送消息,关闭Producer实例。 producer.shutdown(); }
} // 消费者接收消息
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt; import java.util.List; public class Consumer { public static void main(String[] args) throws Exception { // 实例化消费者 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("example_group_name"); // 设置NameServer的地址 consumer.setNamesrvAddr("localhost:9876"); // 订阅一个或多个Topic,以及Tag来过滤需要消费的消息 consumer.subscribe("TopicTest", "*"); // 注册回调以在消息到达时执行一些操作 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); // 标记该消息已经被成功消费 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); // 启动消费者实例 consumer.start(); System.out.printf("Consumer Started.%n"); }
}
在上述示例中,我们分别创建了生产者和消费者来发送和接收消息。生产者通过DefaultMQProducer类实例化,并设置NameServer地址和Topic等信息后,调用send方法发送消息。消费者则通过DefaultMQPushConsumer类实例化,并设置相应的配置后,注册一个消息监听器来接收并处理消息。
五、总结
RocketMQ作为一款高性能、高可靠、高可用的分布式消息队列系统,在微服务架构、大数据处理、实时计算等领域具有广泛的应用前景。其强大的功能和灵活的配置使得它能够满足不同场景下的消息传递需求。随着技术的不断发展和社区的不断壮大,RocketMQ将继续为分布式系统提供稳定可靠的消息传递服务。
相关文章:
中间件之RocketMQ
RocketMQ是一个开源的分布式消息队列系统,起源于阿里巴巴集团内部。最初,RocketMQ(前身为Metaq)被设计为满足阿里巴巴集团内部大规模分布式系统下的高吞吐量、低延迟和高可靠性的消息传递需求。随着其在阿里巴巴内部的广泛应用和不…...
linux第二课(docker的安装使用)
目录 一.关于docker (1)背景引入 (2)docker介绍 (3)功能 (4)Docker架构 二.docker的安装及相关的命令 (1)docker的安装 (2)docker的配置 (3)docker镜像命令 (4)容器命令 三.docker安装myaql 编辑 四.数据卷挂载 1.数据卷挂载引入 2.数据卷挂载图解 3.数据卷的安装…...
Java数据存储结构——二叉查找树
文章目录 22.1.2二叉查找树22.1.2.1 概述22.1.2.1二叉查找树添加节点22.1.2.2二叉查找树查找节点22.1.2.3 二叉树遍历22.1.2.4 二叉查找树的弊端 22.1.2二叉查找树 22.1.2.1 概述 二叉查找树,又称二叉排序树或者二叉搜索树 二叉查找树的特点: 每一个节点上最多有…...
JavaScript 事件处理
一、简介 事件:发生在HTML元素上的事情,可以是用户的行为,也可以是浏览器的行为,如 用户点击了某个HTML元素用户将鼠标移动到某个HTML元素上用户输入数据时光标离开页面加载完成 事件源:事件触发的源头…...
容器技术--Docker应用部署
应用部署 容器部署mysql 搜索并拉取镜像;基于镜像启动容器,注意端口映射、目录映射启动后即可连接# 搜索镜像 docker search mysql # 拉取镜像 docker pull mysql:5.7 # docker pull mysql 默认拉取最新的# 创建mysql容器, -p端口映射(宿主端口:容器端口) -e 环境变量,镜…...
医院管理|基于java的医院管理系统小程序(源码+数据库+文档)
医院管理系统小程序 目录 基于java的医院管理系统小程序 一、前言 二、系统设计 三、系统功能设计 医生信息管理 排班信息管理 科室信息管理 科室预约 病历信息 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取:…...
golang学习笔记21——golang协程管理及sync.WaitGroup的使用
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
C++初阶大全
目录 一.命名空间 1.命名空间定义 2.命名空间使用 二.C输入&输出 三.缺省参数 四. 函数重载 五.引用 1.常引用 2.传值、传引用效率比较 3.引用和指针的区别 4.引用和指针的不同点: 小知识点: 六.内联函数 七.auto关键字(C11) 1.auto的使用细则 八.基于范围…...
使用Redis实现用户关注博客的推模式
目录 一、思路 二、实现代码: 一、思路 发布者: 这里采用redis的zset结构,将键设置为被推送用户id,值设置为博客id,score设置为时间戳 推送之前先查到当前发布博客用户的粉丝有哪些,然后去循环挨个推送…...
python常用模块之time、datetime、randow(14)
文章目录 前言1、time模块1.1 导入模块1.2 使用方法1.2.1 时间戳1.2.2 程序休眠1.2.3 扩展:按某种格式显示当前时间1.2.4 结构化时间 2、datetime模块2.1 导入模块2.2 使用方法2.2.1 得到当前系统的时间2.2.2 拓展:编写一个时钟小程序 3、random模块3.1 …...
根据NVeloDocx Word模板引擎生成Word(六-结束)
前面几篇已经把E6开发平台配套的Word模版隐藏NVeloDocx的基础用法介绍了一遍,这些基础用法基本上可以完全覆盖实际业务的绝大部分需求。所以我们这一篇就介绍一些边边角角的内容,给本系列来一个首尾。 本篇的主要内容有: 1、汇总计算&#…...
Android架构组件:MVVM模式的实战应用与数据绑定技巧
目录 引言 一、MVVM模式概述 1.1 MVVM模式简介 1.2 MVVM模式的优势 二、MVVM模式的实现 2.1 项目环境配置 2.2 创建MVVM组件 2.2.1 创建数据模型 2.2.2 创建数据仓库 2.2.3 创建ViewModel 2.2.4 创建布局文件 2.2.5 创建RecyclerView适配器 2.3 在Activity中绑定V…...
调用系统的录音设备提示:line with format PCM_SIGNED 16000.0 Hz
javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 16000.0 Hz, 8 bit, mono, 1 bytes/frame, not supported. 打开 设置->隐私->麦克风->允许应用访问你的麦克风 与 16000Hz没关系 与 16000Hz没关系 与 16000Hz没关系...
android BLE 蓝牙的连接(二)
下面是基于实际的项目得到的具体步骤及核心代码 1、权限问题 先判断手机是否满足android4.3以上版本,再判断手机是否开启蓝牙 主要涉及蓝牙权限和位置权限,注意不同android版本之间权限申请的差异,以及android权限动态申请和静态申请的区别 …...
改编pikachu的打靶经历(题目不全)
前言 题目很少,只做了一些。正常版本的,完整的pikachu可参考下面这个师傅写的 https://www.cnblogs.com/henry666/p/16947270.html xss (get)反射xss 先尝试 1 这里有长度限制,而且,我改了长度…...
Linux进阶 修改文件所有者
修改文件所属组群——chgrp 修改文件所属组群很简单-chgrp命令,就是change group的缩写(我们可以利用这些来记忆命令) 语法:chgrp 组群 文件名/目录 举例: [root@redhat ~]# groupadd groupa[root@redhat ~]# groupadd groupb[root@redhat ~]# useradd -g groupa zgz[r…...
第312题|二重积分求旋转体体积(二)|武忠祥老师每日一题
解题思路:先画出图像,再利用旋转体体积计算公式进行解题。 1. 旋转体体积计算公式: 2.点到直线计算公式: 有了上面两条知识储备之后我们开始计算。 第一步:先计算出点到直线的距离: ymx,y-mx…...
redis基本数据结构-set
文章目录 1. set的基本介绍1.1. set底层结构之hash表的简单介绍1.2. 常用命令 2. 常见的业务场景2.1. 标签系统2.2. 社交网络好友关系 1. set的基本介绍 参考链接:https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A redis 的 set 数据结构是一个无序的集合&#…...
Android 应用安装-提交阶段
经过前面准备、浏览、协调这些步骤,马上要进入提交阶段了。所谓提交,就是把这些安装应用的相关信息和状态都放到系统中。对于已安装普通应用,它其实分为两个步骤,先卸载旧包,再安装新包。当然,如果是新安装…...
强化学习Reinforcement Learning|Q-Learning|SARSA|DQN以及改进算法
一、强化学习RL 强化学习是机器学习的一个重要的分支,是一种有效的工具,在文献中被广泛用于解决MDP问题。在一个强化学习过程中,一个智能体只能通过和它所处的环境互动学习最优策略。特别地,智能体首先观察自己当前的状态…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
