RocketMQ

消息中间件的作用:异步解耦、挡住前段数据洪峰(保证后端系统稳定性)
RocketMQ 通信组件使用了Netty-4.0.9.Final,在之上做了简单的协议封装
单机支持1 万以上持久化队列

MQ面临哪些问题?
1、最基本功能:发布和订阅
2、优先级问题:一个队列中,消息按优先级排序,优先级高的消息优先投递;
rocketMQ中的所有消息都是持久化的,排序会带来性能损耗,所以暂不支持优先级,但是可以建立多个不同队列,每个队列代表不同优先级。
4、消息的顺序:按照消息的发送顺序来消费,rocketMQ与两个不同的顺序级别解决该问题
5、消息过滤:Broker端和Consumer端消息过滤两种,前者可以减少对consumer无用消息的网络传输
6、持久化:有多种持久化方式,如数据库,文件系统,对内存的镜像等。rocketMQ采用文件系统kafka
7、消息的可靠性:
(1). BrokerBroker Broker 正常关闭
(2). BrokerBroker Broker 异常Crash
(3). OS Crash
(4). 机器掉电,但是能立即恢复供情况。
(5). 机器无法开(可能是 cpu cpu、主板内存等关键设备损坏)
(6). 磁盘设备损坏。

    1-4:属于硬件资源可以恢复,rocketMQ可以保证数据不丢或者少量丢失(依赖刷盘方式是同步还是异步)
    5-6:属于无法恢复,通过“异步复制“,可以实现99%的消息不会丢失,也可以用“同步双写”来完全避免,但会影响性能(rocketMQ3.0后支持)

8、消息的延迟:在消息不堆积的情况下,消息到达broker后,是否能立刻到达consumer
rocketMQ使用长轮询pull的方式,保证消息的非常实时,实时性不低于push
9、每个消息必须投递一次:
rocketMQ通过pull将消息推送到本地,本地消费完后,向服务器返回ack
10、发送/接收重复数据:
rocketMQ没有严格实现这两点,需要consumer自己去校验
该问题产生的场景:网络调用存在不确定性,即不知道消费者的最终接收状态,所以才产生重复发送/消费
11、broker的buffer满了怎么办
buffer指一个队列的内存大小,这个内存大小通常有大小限制,如果buffer满了怎么办?
规范要求通常情况下两种方案,第一拒绝新来的消息;第二按不同策略丢弃已有消息
rocketMQ没有buffer的概念,队列都是持久化磁盘,数据定期清理
12、回溯消费:
即被consumer消费成功得消息,该消息仍需要保留。一般重新消费是按时间维度,如consumer系统故障,回复后,需要重新消费1小时之前的数据
rocketMQ支持按时间回溯,可以向前,也可以向后
13、消息堆积
14、分布式事务
15、定时消息:
消息不能立刻被消费,需要特点时间点或特定时间后
rocketMQ支持后者
16、消息重试:
两种场景:一、消息非法,导致接收端不能正常处理,可以跳过该消息,10s后重试;二、接收端服务器停掉,此时再怎么重试也不行,此时建议应用停止30s后再发送下一条

数据结构:所有数据单独存储到一个Commit Log,完全顺序写,随机读;
对最终用户展现的队列实际只存储消息在Commit Log 的位置信息,并且串行方式刷盘
这样做的好处如下:
队列轻量化,单个数据非常少。
对磁盘的访问串行化,避免磁盘竞争
缺点
读一条消息要先读consumer queue,再度commit log
刷盘策略:
RocketMQ 的所有消息都是持丽化的,先写入系统PAGECACHE,然后刷盘,可以保证内存不磁盘都有一份数据,
访问时,直接从内存读叏。
不会出现内存溢出!!!
两种策略:一、异步,消息写入pagecache,异步线程同步内存数据到磁盘;二、同步,消息写入pagechache后,通知写磁盘线程执行,执行完后,通知前端等待线程向用户返回成功
长轮询Pull:
RocketMQ 的Consumer 都是从Broker 拉消息来消费,但是为了能做到【实时收消息】,RocketMQ 使用长轮询方
式,可以保证消息实时性同Push 方式一致。返种长轮询方式类似亍Web QQ 收収消息机制。
顺序消息缺陷
事务消息
发送消息负载均衡
订阅消息负载均衡
同步双写\异步复制:
异步复制的实现思路非常简单,Slave 启劢一个线程,丌断从Master 拉叏Commit Log 中的数据,然后在异步
build 出Consume Queue 数据结构。整个实现过程基本同Mysql 主从同步类似。同步性能低于异步10%左右
RocketMQ消息过滤:
consumer.subscribe(“TopicTest1”, “TagA || TagC || TagD”);
如以上代码所示,简单消息过滤通过挃定多个Tag 来过滤消息,过滤劢作在服务器迕行
高级过滤:
1、Broker 所在的机器会启劢多个FilterServer 过滤迕程
2. Consumer 启劢后,会向FilterServer 上传一个过滤的Java 类
3. Consumer 从FilterServer 拉消息,FilterServer 将请求转収给Broker,FilterServer 从Broker 收到消息后,挄照
4、Consumer 上传的Java 过滤程序做过滤,过滤完成后迒回给Consumer。

### RocketMQ 消息队列使用指南与最新版本下载 RocketMQ 是一款高性能、高可靠的分布式消息中间件,广泛应用于大规模数据处理高并发场景中。它支持多种消息类型,包括普通消息、顺序消息、事务消息等,并提供了灵活的消息过滤机制强大的消息堆积能力。 在使用 RocketMQ 时,首先需要根据业务需求选择合适的消息类型通信模式。例如,生产者可以通过 `DefaultMQProducer` 类发送消息,而消费者则通过 `DefaultMQPushConsumer` 类订阅并消费消息。此外,RocketMQ 支持广播集群两种消费模式,适用于不同的应用场景[^3]。 以下是一个简单的 RocketMQ 生产者代码示例: ```java import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message; public class Producer { public static void main(String[] args) throws MQClientException, InterruptedException { // 实例化一个生产者组 DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); // 设置NameServer地址 producer.setNamesrvAddr("localhost:9876"); // 启动生产者实例 producer.start(); for (int i = 0; i < 10; i++) { try { Message msg = new Message("TopicTest", "TagA", "OrderID188".getBytes()); producer.send(msg); } catch (Exception e) { e.printStackTrace(); } } // 关闭生产者实例 producer.shutdown(); } } ``` 对于消费者的实现,可以参考如下代码片段: ```java import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.*; import org.apache.rocketmq.common.message.MessageExt; public class Consumer { public static void main(String[] args) throws MQClientException { // 实例化消费者组 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName"); // 设置NameServer地址 consumer.setNamesrvAddr("localhost:9876"); // 订阅主题及标签 consumer.subscribe("TopicTest", "*"); // 注册监听器处理消息 consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> { for (MessageExt msg : msgs) { System.out.println("收到消息:" + new String(msg.getBody())); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; }); // 启动消费者 consumer.start(); System.out.println("消费者已启动"); } } ``` 关于 RocketMQ 的安装与配置,可以从官方网站或 GitHub 仓库获取最新的源码或二进制文件。当前最新稳定版本为 **4.9.4**(截至2023年),可以通过访问 [RocketMQ GitHub Releases 页面](https://github.com/apache/rocketmq/releases) 下载所需的版本。安装完成后,还需配置 NameServer Broker 服务以构建完整的消息队列环境[^1]。 为了更好地管理监控 RocketMQ 集群,推荐安装 RocketMQ 控制台(RocketMQ Dashboard)。该图形界面工具可以帮助开发者直观地查看队列状态、管理主题以及跟踪消息轨迹。控制台的安装通常涉及克隆项目仓库、修改配置文件中的 NameServer 地址,并运行应用服务器(如 Tomcat)来部署 WAR 文件[^1]。 最后,在实际开发过程中,建议将 RocketMQ 的操作封装成独立的服务组件,以便于维护扩展。例如,在 ASP.NET Core 应用程序中,可以通过依赖注入的方式创建 RocketMQ 服务类,从而实现更优雅的消息处理逻辑[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值