来源:尚硅谷,Seven对其进行了补充完善
Kafka 生产者
生产者消息发送流程
发送原理

-
在消息发送的过程中,涉及到两个线程,main线程和sender线程,
-
main线程是消息的生产线程
-
sender线程是jvm单例的线程,专门用于消息的发送。
-
在jvm的内存中开辟了一块缓存空间叫RecordAccumulator(消息累加器),用于将多条消息合并成一个批次,然后由sender线程发送给kafka集群。
来源:尚硅谷,Seven对其进行了补充完善
在消息发送的过程中,涉及到两个线程,main线程和sender线程,
main线程是消息的生产线程
sender线程是jvm单例的线程,专门用于消息的发送。
在jvm的内存中开辟了一块缓存空间叫RecordAccumulator(消息累加器),用于将多条消息合并成一个批次,然后由sender线程发送给kafka集群。
来源:尚硅谷,Seven对其进行了补充完善
在Kafka2.8版本前,Zookeeper的Consumer文件中存放消息被消费的记录(offset)
在Kafka2.8版本走,消息被消费的记录(offset)存放在Kafka中。
RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,在阿里内部,RocketMQ承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。
RocketMQ 下载地址
来源:黑马程序员
RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:
Messaging that just works — RabbitMQ
接下来,我们就学习它的基本概念和基础用法。
在安装命令中有两个映射的端口:
来源:稀土掘金社区
RocketMQ基本架构图如下
从这个架构图上我们可以知道,RocketMQ有4块核心部分:
NameServer:管理Broker的信息,让使用MQ的系统感知到集群里面的broker
Broker:主从架构实现数据多副本存储和高可用
producer:生产者
consumer:消费者
来源:黑马程序员
在支付场景中,支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单状态却显示未支付,数据出现了不一致。此时前端发送请求查询支付状态时,肯定是查询交易服务状态,会发现业务订单未支付,而用户自己知道已经支付成功,这就导致用户体验不一致。
因此,这里必须尽可能确保MQ消息的可靠性,即:消息应该至少被消费者处理1次
那么问题来了:
分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。
依赖工具
从官方仓库 https://github.com/apache/rocketmq clone
或者download
源码。
源码目录结构: