RocketMQ调研笔记

RocketMQ调研笔记

毫无疑问,RocketMQ是目前最受欢迎的消息中间件之一,由淘宝中间件团队研发,目前已经广泛应用于淘宝,天猫,蚂蚁金服,口碑等各式各样的复杂业务。

为什么选择RocketMQ?

  • 消息不丢失【重点】
  • 稳定性高,吞吐量高,性能好
  • 强大的技术团队,健壮的社区力量
  • 架构主轻量,组件无状态
  • 采用Java语言编写,技术体系上更加契合

概念

Producer

消息生产者。生产者将业务应用系统产生的消息投递到Broker机器上,投递方式有同步,异步,单向等。

Producer Group:

消息生产者组。多个相同的生产者事例集群为一组。同一个生产者组的不同生产者实例可以被Broker处理以提交或者回滚(事务保证)。生产者组只允许一个实例存在,即不支持生产者组的集群处理。

Consumer

从Broker集群上拉取消息进行处理。并且提供了两种模型:

  • 拉模型,consumer集群主动从broker拉去数据
  • 推模型,在拉模型的基础上进行处理

Consumer Group

消息者组,支持负载均衡,容错系统。消费者组的消费者实例必须具有完全相同的topic订阅。

Topic

topic是producer与consumer投递消息与拉取消息的区分点,但是topic与producer与consumer之间的关系非常松散。具体而言,一个topic可能有零个,一个或多个向其发送消息的producer; 相反,producer可以发送不同topic的信息。从consumer的角度来看,一个subject可能由零个,一个或多个consumer群体订阅。同样,一个consumer群体可以订阅一个或多个topic,只要这个群体的实例保持其订阅的一致性。

Broker

它接收producer发送的消息,存储消息并准备处理来自consumer的请求(consumer拉模型)。它还存储消息相关的元数据,包括消费者组,消费进度偏移和topic队列信息。

Name Server

用来保存topic的路由信息。

  • NameServer用来保存活跃的broker列表,包括Master和Slave。
  • NameServer用来保存所有topic和该topic所有队列的列表。
  • NameServer用来保存所有broker的Filter列表。

消息模型

集群、广播

消息顺序

有序:费消息有序意味着消息被消费者按照消息队列发送的顺序进行消费。如果您正在处理强制使用全局顺序的情况,请确保您使用的topic只有一个消息队列。警告:如果指定消耗有序,则消费消息的最大并发度是消费者组订阅的消息队列的数量。
无序:同时使用消息时,消息消息的最大并发性仅受限于为每个客户端指定的线程池。警告:在此模式下不再保证消息顺序。

RocketMQ架构设计

架构上分为四个部分,由producer,consumer,namesrv以及broker组成。

rocketmq架构图.png

生产者

SendStatus,包含于SendResult中,表示消息的投递状态

  • FLUSH_DISK_TIMEOUT:表示如果Broker配置了FlushDiskType(刷盘策略)为SYNC_FLUSH(同步刷盘),并且Broker在默认时间(syncFlushTimeout刷盘超时时间)内没有完成刷新磁盘则返回该状态。
  • FLUSH_SLAVE_TIMEOUT:表示如果Broker配置了SYNC_MASTER,没有在默认时间(syncFlushTimeout刷盘超时时间)内与主Broker完成同步,则返回该状态。
  • SLAVE_NOT_AVAILABLE:表示Broker配置了SYNC_MASTER,但是没有配置从库,则返回该状态。
  • SEND_OK:表示成功。但是它不代表这可靠,为了确保不会丢失任何消息,您还应该启用SYNC_MASTER或SYNC_FLUSH(指刷盘策略)。

Duplication or Missing

如果投递消息失败,返回状态为:FLUSH_DISK_TIMEOUT 或者 FLUSH_SLAVE_TIMEOUT

  • 如果选择继续执行程序,则消息丢失。
  • 否则选择重发该消息,但是可能会导致消息重复。建议重发,因为可以通过其他手段来规避消息重复消费问题。

producer工作机制

producer定期从namesrv获取可用的topic路由信息,包括可用的broker列表,并缓存在本地。producer发送消息时通过轮训的方式从namesrv上拉取的路由信息中选择一个可用的broker,根据某种策略把消息发送到该broker。如果namesrv挂掉,producer就使用本地的topic路由信息,如果此时producer重启了,那就没有topic路由信息了,也就无法发送消息。

消费者

Consumer Group and Subscriptions

不同的Consumer Group可以独立消费相同的topic,并且在消费失败之后都可以有各自的消费补偿(重试机制)。
请确保同一个Consumer Group中的每个consumer实例订阅相同的topic。

MessageListener

  • Orderly 可以保证消息顺序地被消费,因为它会将锁住每一个消息队列并依次消费。如果不是对顺序消息有极强的要求,不建议使用。异常请使用ConsumeConcurrentlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT
  • Concurrently 不保证消息的顺序问题,consumer同时拉取消息并消费。异常请使用:ConsumeConcurrentlyStatus.RECONSUME_LATER

ConsumeFromWhere 如果新建一个consumer group ,需要确认是否消费broker保存的历史数据

  • CONSUME_FROM_LAST_OFFSET将忽略历史消息,并消耗之后产生的任何东西。
  • CONSUME_FROM_FIRST_OFFSET将消耗Broker中存在的所有消息。
  • CONSUME_FROM_TIMESTAMP消费在指定的时间戳之后产生的消息。

Duplication 重复消费

建议通过业务上的其他手段来保证消息的不重复消费,因为在消息队列在消费体系中有非常多的情况会出现消息重复消费的问题。

服务注册与发现

服务注册与发现是一个无状态的组件,即namesrv与namesrv相互隔离,没有心跳检查,没有主从复制,没有主从选举等问题。

broker

brokerRole

  • ASYNC_MASTER
  • SYNC_MASTER
  • SLAVE

如果用户无法容忍消息丢失,那么建议用户部署一个同步主库并配上一个从库来处理。如果用户可以容忍消息缺失但是一定要保证Broker的高可用状态,那么建议用户部署一个异步主库配置一个从库来处理。如果用户只想要简单上手使用(不谈高可用,零容错等问题),建议用户只需要配置一个异步主库即可处理。

FlushDiskType

  • ASYNC_FLUSH
  • SYNC_FLUSH

推荐使用ASYNC_FLUSH,因为SYNC_FLUSH代价昂贵,会造成太多的性能损失。如果你想要可靠性,我们建议你使用SYNC_MASTERSLAVE

broker工作机制

broker负责存储消息,存储队列信息,维护消费进度,定时向namesrv上报topic路由信息。如果一台broker挂掉,那producer不会马上感知到,namesrv也不会立即把这个broker从它维护的可用broker列表摘除,而是要等到broker心跳超时后才会摘除。摘除后,producer下次从namesrv获取最新的可用的broker列表时,才会发现此broker不存在了,然后也就不会再发送消息到此broker。在此之前broker挂掉的这段时间内,producer还是会发消息到这个已经挂掉的broker的,但是producer内部有重试机制,如果发送到某个broker失败几次,那就会选择其他可用broker来发送。所以,对于用户而言,最终发送消息都是成功的。brokernamesrv的心跳超时时间,以及producernamesrv定时拉取topic路由信息的时间,都可配置。

弊端

  • 主从复制不支持master选举,master宕机后消息服务近乎不可用(slave可继续消费旧的消息)
  • 无法做到真正意义上的读写分离,只有当master消费性能太低时(由RocketMQ决定)才会将读请求分摊到slave
  • 主从数据不一致,有可能造成数据重复消费
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342