RocketMQ:消息发送机制
来聊聊这个老掉牙的话题,从自己的角度说下他们的概况和使用,同时也巩固下自己的八股文。根据 RocketMQ 的常见分类,通常分为同步消息、异步消息和单向消息。同步消息指的是消息发送后等待 Broker 的响应。异步消息指的是发送后不等待 Broker 的响应,而是通过回调函数来处理发送结果。单向消息就更为简单,消息发出去就不管了,不管响应也不管回调。
使用说明
在消息的生产者如何发送这三类消息,请看如下代码:
同步消息发送和单向消息发送都比较简单,异步消息发送也比较简单,只是在 send 方法加了一个待实现的接口 SendCallback,实现 onSuccess 方法即可。
源码实现
那在源码层面是如何实现的呢?请看方法 MQClientAPIImpl.sendMessage。
RocketMQ 的底层网络通信完全依赖 Netty,在这个三个方法调用中,均是是将调用数据封装为 RemotingCommand 对象,并通过 channel.writeAndFlush 方法将数据发送至 broker,这也是 RocketMQ 的核心网络通信机制,心跳、路由信息同步都是相同的方式。
实际项目使用情况
本文的中是想和大家分享下在实际项目中的使用情况。当然,在很多项目中很多人并不在乎使用的那种消息方式,因为本身的流量和项目严谨的要求并不是很高,容错性也比较强。同步消息:适用于强一致性的业务场景,比如我所在的金融交易、订单支付,确保消息一定要投递成功才能进行下一步操作。我所在的信贷行业以及保险行业,订单数据并不会产生极高并发的情况。异步消息:秒杀、大促等营销场景、说白了就是丢掉几个也无所谓的情况,不要设计交易、金额这块的业务场景。单向发送:日志收集或者监控类,广播数据方式,追求极致性能。但其实这样的场景下我建议用 Kafka,我也并未用过单向发送方式。
原文链接:RocketMQ:消息发送机制
评论