-
谈谈 RocketMQ 消息存储的设计与实现
作为一款高性能的消息中间件,RocketMQ 基于互联网的生产要求对多 Topic 场景做了诸多针对性优化。根据中间件团队提供的 压测报告,在 Producer 和 Consumer 共存的情况下,相比于 Kafka,RocketMQ 的性能指标(TPS 和 RT)随着 Topic 数量的上升表现稳定。本文从消息存储的角度谈谈 RocketMQ 高性能的原因,重点包括四个方面:消息文件存储的结构设计、消息从 Broker 接收到持久化磁盘的流程、刷盘策略和内存映射优化机制。消息文件存储结构...
-
码出高效码出质量
本文是在作者阅读阿里巴巴 Java 开发手册后做的一些整理。在阅读过程中,作者发现有些错误是自己明确知道要去规避的,有些错误是自己已经犯过的,而有些错误是自己还不知道并且可能会在未来犯的。在此记录,做个警戒。在开发过程中,每一行代码都需要存在的理由,多反思,多总结,多怀疑自己。编程规约命名风格 POJO 类中布尔类型变量都不要加 is 前缀,否则部分框架解析会引起序列化错误。注意,在 MySQL 规约中,表达是与否的值采用 is_xxx 的命名方式,所以,需要在 resultMap 设置...
-
谈谈 RocketMQ NameServer 的设计与实现
NameServer 作为消息中间件 RocketMQ 的核心组件之一,承担着路由注册中心的作用。本文以结合源码的方式解答三个问题:一是作为路由注册中心,有哪些路由信息注册到了 NameServer?二是 NameServer 通常以集群部署,且集群中的各个节点互相不通信,当 NameServer 集群中各节点路由信息不一致时,RocketMQ 如何保证可用性?三是当 Broker 不可用后,NameServer 并不会立即将变更后的注册信息推送至 Client(Producer/Cons...
-
RocketMQ - 初探
五月,我回到杭州实习,做了一点微小的工作,为接下来的正式入职做了一定程度的预热。期间对公司内部的中间件有了些许实践,但也仅仅是浅尝辄止,想想有些心悸,所以决定针对 RocketMQ 做点源码剖析的工作。为什么选择 RocketMQ?理由有五:(1)RocketMQ 是公司开源的一款高性能、高吞吐量的分布式消息中间件(内部代号 MetaQ),方便写文章;(2)理解 Message Queue,知其然知其所以然;(3)理解分布式消息中间件如何实现高性能的网络通信及异常处理(网络传输存在第三种状...
-
Why wait/notify must be called in a synchronized block
在 Java 并发编程中,调用 Object wait/notify 方法的代码段必须要被包含在 synchronized 块中,接着即是耳熟能详的:调用 wait 方法时,先释放锁,然后线程进入阻塞状态,直至被 notify,然后重新尝试获得锁。看似一气呵成的一顿猛如虎的操作,其个中缘由到底是什么?有些我们看起来理所当然的东西,难道真的是理所当然的吗?本篇文章即谈谈,为什么调用 wait/notify 方法的代码段必须要被包含在 synchronized 块中。先从 官方文档 入手,官方...
-
我对Raft的理解 - Two
我们已对 Raft Leader 选举进行了理解,Leader 一旦被选举出来,对外提供服务,对内协调日志复制。日志复制是 Raft 共识算法最核心的部分,我们逐步递进的去理解 Raft 是如何通过添加限制条件来保证日志能够被正确的复制。Slide 11每个节点都维护了一份私有的日志的拷贝,节点存在宕机的风险,为了保证宕机后能够恢复日志,日志需要持久化存储在类似磁盘等介质中。日志由一组日志项组成,每个日志项(Log Entry)包含三部分:Index、Term 和 Command。Inde...
-
我对Raft的理解 - One
重新阅读了 Raft 论文,结合 John Ousterhout 在斯坦福大学的课程视频,对 Raft 重新梳理了一遍,并决定用文字记录下来。Raft 是一个共识算法,何为共识算法?通俗的说,共识算法的目的就是要实现分布式环境下各个节点上数据达成一致。那么节点的数据为什么会出现不一致?原因有很多,例如节点宕机、网络延迟、数据包乱序等等。但是要注意的是,Raft 并不考虑存在恶意的节点的情况,也就是说,不存在主动篡改数据的节点。所以可以理解为:允许节点宕机,但是只要节点没有宕机,那么它就是正...
-
2017年度总结与2018年度计划
今年事情比较多,重要的事情有两件,一是还有 6 个月就要毕业,这意味着留给我在学校里纯粹打磨技术的时间已经不多了;二是确定了自己的职业生涯将会从阿里开始,这意味着什么我暂时还不确定。去年此时,我认为自己一定会去试水一大堆公司,但是实际上我只投了寥寥几个,整个过程比我预想的要顺利,我想究其原因自然离不开这几年几乎不间断的积累,但是也有运气的成分在。上半年读了不少 paper 和技术书籍。在阅读的过程中,我喜欢在学习到一个新的知识点后,尽可能的通过一段程序去验证,那么理解的程度很可能会从「 意...