高手问答第 222 期 —— RocketMQ 架构设计与实现原理

局长 发布于 01/01 23:59
阅读 3K+
收藏 43

OSCHINA 本期高手问答(2019年1月2日 — 2019年1月8日)我们请来了丁威老师为大家解答关于 RocketMQ 的问题。

丁威,Java、分布式服务架构、中间件等多个领域的技术专家,擅长高并发编程、Netty 网络编程、RocketMQ 等技术,国内知名开源数据库中间件 MyCAT 的志愿者和技术顾问。目前担任上海优速物流的技术专家和经营支撑部门的架构师。对 RocketMQ 有非常深入的研究,是 RocketMQ 社区的布道师,不仅实践经验丰富,而且对其源代码有深入且系统的研究。

随着互联网技术蓬勃发展,微服务架构思想的兴起,系统架构开始追求小型化、轻量化,原有的大型集中式的 IT 系统通常需要进行垂直拆分,孵化出颗粒度更小的众多小型系统,因此对系统间松耦合的要求越来越高,目前 RPC、服务治理、消息中间件几乎成为互联网架构的标配。

引入消息中间件,服务之间可以通过可靠的异步调用,降低系统之间的耦合度,提高系统的可用性。消息中间件的另一个重要应用场景是解决系统之间数据的一致性(最终一致性)。

RocketMQ 作为阿里开源的一款高性能、高吞吐量的消息中间件,承载了阿里“双11”大部分业务,可以说是一名久经战场的“精英”、值得信任的“伙伴”。同时它的开发语言为 Java,自然而然地得到了广大互联网架构师们的青睐,成为互联网行业首选的消息中间件。 

本期问答内容

1.RocketMQ 的设计理念和目标
2.RocketMQ 消息发送
3.RocketMQ 消息存储
4.RocketMQ 消息消费
5.RocketMQ 实战

或有其它 RocketMQ 相关的问题,也欢迎大家积极提问!

为了鼓励踊跃提问,@华章 会在问答结束后从提问者中抽取 5 名幸运会员赠予《RocketMQ技术内幕:RocketMQ架构设计与实现原理》一书。

购买链接:京东

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就关于 RocketMQ 的问题向丁威老师提问,请直接回帖提问。

加载中
1
杨威12138
杨威12138
RocketMQ应用在大数据处理方面和Kafka相比而言有什么优势,RocketMQ的低延迟方面做的怎么样
杨威12138
杨威12138
多谢前辈指点,已受教
唯有坚持不懈
这里有RocketMQ与Kafaka在实现原理上的18项差异:http://jm.taobao.org/2016/03/24/rmq-vs-kafka/ 个人觉得RocketMQ首先追求的是其可靠性,然后才追求性能。RocketMQ在低延迟下做的优化,在消息发送时使用了磁盘顺序写,也就是消息服务器在处理消息发送时,所有主题的消息都会顺序追加在同一个文件中。RocketMQ更加时候业务处理。
0
温安适
温安适

丁威老师您好,有几个问题,请您指点。  1.与springboot,springcloud如何集成? 2.如何使用rocketmq实现异步rpc 3.如何使用rocketmq解决数据一致性问题? 期待老师解答,谢谢

温安适
温安适
感谢丁老师热心的解答
唯有坚持不懈
4.如何使用rocketmq解决数据一致性问题 通常使用消息中间件来解耦模块,实现最终一致性。 1、消息发送时,可以使用事务消息进行发送,消息发送时宁愿重复发送消息,也不要丢失消息。 2、消息消费时,通常需要实现幂等,并结合RocketMQ的重试机制,实现数据的最终一致性。
唯有坚持不懈
3.如何使用rocketmq实现异步rpc RocketMQ在消息发送时,提供了3种消息发送模式:同步、异步、oneway,其具体API:public void send(Message msg, SendCallback sendCallback, long timeout),其核心实现就时提供一个回调接口。
唯有坚持不懈
2、springboot,springcloud如何集成 RocketMQ提供了rocketmq-client包,封装了Rocket客户端的相关API,例如消息消息、消息消费。Springboot的核心思想是通过配置约定方式,将配置从XML转换为注解。spring-boot仓库:https://github.com/maihaoche/rocketmq-spring-boot-starter
0
NotFound403
NotFound403

@唯有坚持不懈    同样的场景下 rabbitmq 与rocketmq 如何做技术选型 ,入门难度相比较 而言哪个更为容易

唯有坚持不懈
这个要看团队的技术栈,如果团队的成员都是以JAVA为主的话,我建议选用RocketMQ,因为是使用JAVA语言编写的,更具掌控性。
0
momisabuilder
momisabuilder

@唯有坚持不懈 请教一个问题,分布式下微服务之间的接口调用数据一致性(事务)有没有好的解决方案?

唯有坚持不懈
通常是实现最终一致性,通常使用本地事务表与服务幂等实现。记得上次开源中国2018开源项目的评选项目中,有分布式事务框架:https://www.oschina.net/p/Hmily,您可以参考和调研一下。
0
每周精粹
每周精粹

@唯有坚持不懈 这书都包含了什么内容?目录有吗

唯有坚持不懈
目录在京东购物网站上有:https://item.jd.com/12501140.html NameServer、消息发送、消息存储、消息消费、消息过滤、主从同步HA、事务消息;在实战篇重点介绍了RocketMQ运维管理界面与当前支持的39个运维命令;并在附录部分罗列了RocketMQ几乎所有的配置参数。本书得到了RocketMQ创始人的高度认可并作序推荐,国内第一本成体系介绍RocketMQ书籍
0
哎呦-又忘了
哎呦-又忘了

@唯有坚持不懈

4.3版本事务消息

这是看官方demo 做出来的 demo ,不知道是老师能不能解下疑惑呢

 

唯有坚持不懈
可以看一下我写的博客:https://yq.aliyun.com/articles/684227?spm=a2c4e.11153940.bloghomeflow.4.2b9f291aY4ua5T 从官方Demo中窥探RocketMQ事务实现原理。
0
Li_Peng
Li_Peng

@唯有坚持不懈 您好,想请教一下RocketMQ对分布式事务的支持,未来还会做哪些增强?目前我们有一些异构系统需要进行交互,不想采用ESB的方式,希望通过RocketMQ来实现异构系统之间的消息通讯,不知道是否合适呢?

唯有坚持不懈
Apache RocketMQ4.3.0版本后开始支持事务消息,其主要实现原理类似使用两阶段提交与事务状态回查机制来实现,《RocketMQ技术内幕》中专门使用了一章的篇幅介绍RocketMQ,也可以关注我的源码分析RocketMQ系列:https://blog.csdn.net/prestigeding/article/details/78888290
0
开源中国首席罗纳尔多
开源中国首席罗纳尔多

@唯有坚持不懈 您好,请问rocketmq 和activemq有什么区别?技术选型上哪个更适合一些?

唯有坚持不懈
回复 @开源中国首席罗纳尔多 : RocketMQ可以保证消息队列级别的强顺序性,但当一条消息如果重试次数超过指定次数(默认16次)后,该消息将进入到死信队列,然后消费该队列中的消息,这样做,严格意义上"不是完全顺序了"。
开源中国首席罗纳尔多
开源中国首席罗纳尔多
回复 @唯有坚持不懈 : 您好,请问消息顺序是严格保证一致的吗?
唯有坚持不懈
ActiveMQ主要是严格遵循JMS规范,分布式部署方案为主从,而RocketMQ不按“套路”出牌,也不受任何规范的约束,追求稳定性、高性能,天生的分布式集群。目前RocketMQ官方也在完善其他语言的客户端,例如C++,node.js等,由于性能比ActiveMQ高出许多,除非是RocketMQ无法满足您的使用场景,否则可以毫不犹豫的选择RocketMQ。
0
WilsonHuang
WilsonHuang

@唯有坚持不懈 @华章  RocketMQ在集群方面的部署的机制能否简单说明一下,想了解如何一下背后的原理,谢谢!

唯有坚持不懈
RocketMQ集群方案通常分为2m-noslave(双主)、2m-2s-async(2主2从异步刷盘模式)、2m-2s-sync(2主2从同步刷盘模式),其配置示例其实包含在RocketMQ源码中,具体包为:rocketmq-distribution,其实现原理在《RocketMQ技术内幕》第7章中有详细介绍。
0
empireghost
empireghost

@唯有坚持不懈   RocketMQ 也有队列和主题的区别吗?  一对一订阅    多对一订阅?

唯有坚持不懈
commitlog文件基于topic的索引,其设计为每一个consuemque队列中的条目为固定长度,每个条目20字节。存储消息的物理偏移量、消息的长度、tag的hashcode,这样消费者根据主题进行消费时,可以根据主题、队列id、消息消费进度(consumequeue中的偏移量)来很快定位到消息,如果要直接从commitlog文件中根据主题去查询消息,性能极其低下,不忍直视。
唯有坚持不懈
RocketMQ的主题与队列的关系是一对多,也就是一个主题,可以有多个队列,但在RocketMQ中的队列与其他消息中间件还是有些区别的,首先在RocketMQ中为了消息的顺序写,所有主题的消息都存储在commitlog文件中,该文件存储消息的全量信息,而队列对于RocketMQ来说,更多的是为了消息消费,故其取名为consuemequeue,该队列中并不会存储消息的全量消息,而可以看出是针对
返回顶部
顶部