前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RocketMQ实战(3)-消息的有序性

RocketMQ实战(3)-消息的有序性

作者头像
JavaEdge
发布2022-11-30 15:20:42
4300
发布2022-11-30 15:20:42
举报
文章被收录于专栏:JavaEdgeJavaEdge

1 为什么需要消息有序

996一辈子了,准备去银行存取款,对应两个异步短信消息,要保证先存后取:

  • M1 存钱
  • M2 取钱

而MQ默认发消息到不同Q显然是行不通的,会乱序。 因此,需发往同一Q,依赖队列的先进先出机制。

2 基本概念

有序消息,又叫顺序消息(FIFO消息),指消息的消费顺序和产生顺序相同。

如订单的生成、付款、发货,这串消息必须按序处理。顺序消息又可分为:

2.1 全局顺序

一个Topic内所有的消息都发布到同一Q,按FIFO顺序进行发布和消费:

适用场景

性能要求不高,所有消息严格按照FIFO进行消息发布和消费的场景。

2.2 分区顺序

对于指定的一个Topic,所有消息按sharding key进行区块(queue)分区,同一Q内的消息严格按FIFO发布和消费。

  • Sharding key是顺序消息中用来区分不同分区的关键字段,和普通消息的Key完全不同。

适用场景

性能要求高,根据消息中的sharding key去决定消息发送到哪个queue。

2.3 对比

  • 发送方式对比

3 如何保证消息顺序?

在MQ模型中,顺序需由3个阶段去保障

  1. 消息被发送时保持顺序
  2. 消息被存储时保持和发送的顺序一致
  3. 消息被消费时保持和存储的顺序一致

4 RocketMQ 有序消息实现原理

RocketMQ消费端有两种类型:

  • MQPullConsumer
  • MQPushConsumer

底层都是通过pull机制实现,pushConsumer是一种API封装而已。

  • MQPullConsumer 由用户控制线程,主动从服务端获取消息,每次获取到的是一个MessageQueue中的消息。
    • PullResult中的 List<MessageExt> msgFoundList
  • MQPushConsumer由用户注册MessageListener来消费消息,在客户端中需要保证调用MessageListener时消息的顺序性

看源码

  • 拉取生产端消息
  • 判断是并发的还是有序的,对应不同服务实现类

5 有序消息的缺陷

发送顺序消息无法利用集群的Failover特性,因为不能更换MessageQueue进行重试。

因为发送的路由策略导致的热点问题,可能某一些MessageQueue的数据量特别大

  • 消费的并行读依赖于queue数量
  • 消费失败时无法跳过
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 为什么需要消息有序
  • 2 基本概念
    • 2.1 全局顺序
      • 适用场景
    • 2.2 分区顺序
      • 适用场景
    • 2.3 对比
    • 3 如何保证消息顺序?
    • 4 RocketMQ 有序消息实现原理
    • 5 有序消息的缺陷
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档