中间件之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问题。在一个强化学习过程中,一个智能体只能通过和它所处的环境互动学习最优策略。特别地,智能体首先观察自己当前的状态…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
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 …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
