求阙厅

春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是人间好时节。

MQ 系列 消息顺序

刨析rocketMQ的底层实现

消息有序 指的是一类消息消费时,能按照发送的顺序来消费。例如:一个订单产生了三条消息分别是订单创建、订单付款、订单完成。消费时要按照这个顺序消费才有意义,但是同时订单之间是可以并行消费的。 顺序消息分为全局顺序消息与分区顺序消息,全局顺序是指某个 Topic 下的所有消息都要保证顺序;分区顺序消息只要保证每一组消息被顺序消费即可。 三种消息的类型介绍如下: 普通消息:消息是无序的,...

MQ 系列 消息重复

刨析rocketMQ的底层实现

在 MQTT 协议中,给出了三种传递消息时能够提供的服务质量标准,这三种服务质量从低到高依次是:At most once、At least once、Exactly once。我们现在常用的绝大部分消息队列提供的服务质量都是 At least once,包括 RocketMQ、RabbitMQ 和 Kafka 都是这样。也就是说,消息队列很难保证消息不重复。 At most once 至多...

MQ 系列 消息过滤

刨析rocketMQ的底层实现

消息过滤 目前业界流行的消息过滤方案有以下几种: 基于 tag 的消息过滤: 一种常用的方案是基于 tag 进行消息过滤,tag 相当于对 topic 中消息再次进行逻辑分类 基于 sql 的消息过滤: 消息 Message 对象中添加一些自定义用户属性,消费方在消息时,可以指定一个 sql 过滤表达式 基于动态脚本过滤,以下两种方式,本质上都是动态脚本过滤,只不过实现策略...

MQ 系列 消息优先级

刨析rocketMQ的底层实现

消息优先级是指在一个消息队列中,每条消息都有不同的优先级,一般用整数来描述,优先级高的消息先投递,如果消息完全在一个内存队列中,那么在投递前可以按照优先级排序,令优先级高的先投递。对于优先级问题,可以归纳为两类: 只要达到优先级目的即可,不是严格意义上的优先级,通常将优先级划分为高、中、低,或者再多几个级别。每个优先级用不同的 topic 表示,发消息时指定不同的 topic 来表示...

MQ 系列 消息不丢

刨析rocketMQ的底层实现

消息重投 对于普通消息,消息发送默认采用 round-robin 机制来选择发送到哪一个队列,如果发送失败,默认重试 2 次。对于普通有序消息,RocketMQ 是不会进行重试的。如果需要重试,那么业务 RD 同学需要自己编写重试代码,例如通过一个 for 循环,最多重试几次。对于严格有序消息,由于直接指定了一个 MessageQueue。如果这个 MessageQueue 所在的 Bro...

MQ 系列 定时消息

刨析rocketMQ的底层实现

定时消息 Kafka 不支持定时消息; RocketMQ 支持两类定时消息; 开源版本 RocketMQ 仅支持定时级别,定时级用户可定制; 阿里云MQ指定的毫秒级别的延时时间 定时消息(延迟队列)是指消息发送到 broker 后,不会立即被消费,等待特定时间投递给真正的 topic。 broker 有配置项 messageD...

MQ 系列 事务

刨析rocketMQ的底层实现

消息队列中的“事务”,主要解决的是消息生产者和消息消费者的数据一致性问题。 事务消息需要消息队列提供相应的功能才能实现,Kafka 和 RocketMQ 都提供了事务相关功能。 首先,订单系统在消息队列上开启一个事务。然后订单系统给消息服务器发送一个 “半消息”,这个半消息不是说消息内容不完整,它包含的内容就是完整的消息内容,半消息和普通消息的唯一区别是,在事务提交之前,对于...

RocketMQ 系列 NameServer

刨析 RocketMQ 的底层实现

本文主要介绍 RocketMQ 路由管理、服务注册及服务发现的机制。RocketMQ 的架构设计决定了只需要一个轻量级的元数据服务器就足够了,只需要保持最终一致,而不需要 Zookeeper这样的强一致性解决方案,不需要再依赖另一个中间件,从而减少整体维护成本。 NameServer 主要作用是为消息生产者和消息消费者提供关于 Topic 的路由信息,那么 NameServer 需...

IO 系列 NIO

NIO(Non-block I/O) NIO 提供了 SocketChannel 和 ServerSocketChannel 两种不同的的套接字通道实现。这两种通道都支持阻塞和非阻塞两种模式。 Selector Open JDK 中 Selector 的实现是 SelectorImpl,然后 SelectorImpl 又将职责委托给了具体的平台,比如图中框出的 Linux 2.6 以后...

IO 系列 BIO

BIO BIO 的服务器通信模型: 由一个独立的 Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。 InputStream 是Java标准库提供的最基本的输入流。它位于java.io这个包里。java.io包提供了所有同步IO的功能,它是所有输入流的超类。这个抽象类定义...