中间件之RocketMQ

server/2024/9/23 5:49:22/

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发送和接收消息:

java">// 生产者发送消息  
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将继续为分布式系统提供稳定可靠的消息传递服务。


http://www.ppmy.cn/server/120035.html

相关文章

视频转音频,分享这六种转换操作

视频转音频&#xff0c;随着多媒体技术的发展&#xff0c;人们越来越频繁地需要将视频中的音频部分提取出来单独使用。无论是为了制作播客、获取音乐片段还是其他需求&#xff0c;视频转音频都是一项非常实用的技能。为了让你轻松应对各种场合的需求&#xff0c;下文将为你详细…

[数据集][目标检测]不同颜色的安全帽检测数据集VOC+YOLO格式7574张5类别

重要说明&#xff1a;数据集里面有2/3是增强数据集&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求在下载&#xff0c;分辨率均为640x640 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件…

sql日期函数-日期格式要完整(容易出错)

常用记录&#xff1a;日期字符串完整&#xff0c;所以没有发现细节点 <if test"beginTime ! null and beginTime ! ">and date_format(baw.create_time,%Y%m%d) > date_format(#{beginTime},%Y%m%d)</if><if test"endTime ! null and endTime…

微信小程序04-常用API上

零、文章目录 微信小程序04-常用API上 1、案例&#xff1a;音乐播放器 &#xff08;1&#xff09;案例分析 需求&#xff1a;“音乐播放器”微信小程序可以让用户随时随地享受音乐&#xff0c;给用户带来了便捷的音乐体验&#xff0c;且支持后台播放&#xff0c;用户可以在…

低级编程语言和高级编程语言

一.区分低级编程语言和高级编程语言的方法 1.低级编程语言 低级编程语言,并不是简单的编程语言,而是写起来很费事的编程语言,如所有编程语言的"祖宗":汇编语言,写起来极其麻烦,说不定一个 int a1; 它就得写好几行,甚至十几行 这样麻烦的编程语言为什么还没消失那,因…

【RabbitMQ】⾼级特性

RabbitMQ ⾼级特性 1. 消息确认1.1 消息确认机制1.2 代码示例 2. 持久化2.1 交换机持久化2.2 队列持久化2.3 消息持久化 3. 发送⽅确认3.1 confirm确认模式3.2 return退回模式3.3 问题: 如何保证RabbitMQ消息的可靠传输? 4. 重试机制5. TTL5.1 设置消息的TTL5.2 设置队列的TTL…

通过Java设计模式提高业务流程灵活性的策略

引言 在软件开发中&#xff0c;随着业务需求的不断变化&#xff0c;系统的灵活性成为了一个重要的考量因素。Java设计模式作为一种经过验证的解决方案&#xff0c;可以有效地提高系统的可维护性、扩展性和灵活性。本文将探讨几种关键的设计模式&#xff0c;以及它们如何帮助我…

stack和queue的模拟实现

stack和queue的模拟实现 1. 容器适配器1.1 什么是适配器1.2 STL标准库中stack和queue的底层结构 2 deque的简单介绍(了解)2.1 deque的原理介绍2.2 deque的缺陷2.3 为什么选择deque作为stack和queue的底层默认容器 2. stack的介绍和使用2.1 stack的介绍2.2 stack的模拟实现 3. q…