专栏首页关忆北.(二)RocketMQ订阅与发布

(二)RocketMQ订阅与发布

RocketMQ保证消息可靠性

至少一次

At least Once:指每个消息必须投递一次。Consumer先Pull消息到本地,消费完成后,才向服务器返回ack,如果没有消费一定不会ack消息。

回溯消息

Consumer已经消费成功的消息,由于业务需求需要重新消费。RocketMQ可根据时间维度来回退消费进度。

事务消息

本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。

定时消息

定时消息(延迟队列)是指消息发送到broker后,不会立即被消费,等待特定时间投递给真正的topic。 暂存消息的Topic:SCHEDULE_TOPIC_XXXX

消息重试

Consumer消费消息失败后,要提供一种重试机制,令消息再消费一次。

Consumer在消费消息时出现运行时异常(下游应用服务不可用,例如db连接不可用,外系统网络不可达等、业务异常、反序列化失败等)导致消费失败的问题,RocketMQ可以暂时跳过该消息,再消费其他消息,过特定时间后再次重试。

消息重投

生产者在发送消息时,同步消息失败会重投,异步消息有重试,oneway没有任何保证。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在RocketMQ中是无法避免的问题。消息重复在一般情况下不会发生,当出现消息量大、网络抖动,消息重复就会是大概率事件。

死信队列

死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 不会立刻将消息丢弃,而是将其发送到该消费者对应的死信队列。在控制台可以对死信进行再次消费。

人为保证RocketMQ消息可靠性

生产者发送消息

一个应用尽量使用一个Topic,不同类型的消息使用不同的tag标识。

每个消息在业务层面的唯一标识码设置到唯一Keys字段,方便定位消息丢失问题。

消息发送成功或失败都需要打印日志,只要不抛异常则说明发送成功,解析sendResult不同的成功状态。

  • SEND_OK 发送成功
  • FLUSH_DISK_TIMEOUT 刷盘超时
  • FLUSH_SLAVE_TIMEOUT 发送成功,服务器同步到Slave时超时
  • SLAVE_NOT_AVAILABLE 发送成功,Slave不可用

消息发送失败的异常处理

同步模式发送两次均失败后轮转到下一个Broker,10S后使用异步发送,超时异常不再发送

选择oneway方式发送

消费者

消费过程幂等

RocketMQ无法避免消息重复(Exactly-Once),所以业务对消费重复非常敏感,务必要在业务层进行去重处理。可以使用关系型数据库进行去重,首先保证消息的唯一键,(如msgId),在消费前判断关系型数据库中是否已存在,存在则跳过,不存在插入并消费。

如果同时接收大量消息时,可以先将数据保存在关系型数据库中,到达一定量后批量插入关系型数据库。

消费速度慢

  1. (提高消费并行度)消息消费属于IO密集型(操作数据库、RPC调用),这种场景取决于后端处理速度,同时优化消费过程。方案如下:
    • 同一个ConsumerGroup下,通过增加Consumer实例数量来提高并行度。
    • 通过修改参数 consumeThreadMin、consumeThreadMax实现消费者并行线程。
  2. (批量方式消费)
  3. (跳过非重要消息) 发生消息堆积时,如果消费速度一直追不上发送速度,如果业务对数据要求不高的话,可以选择丢弃不重要的消息。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/weixin_42313773复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • (一)RocketMQ订阅与发布

    订阅与发布时指某个生产者向某个Topic发送消息,消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据。

    关忆北.
  • RocketMQ学习-消息发布和订阅

    前面一篇文章分析了broker的启动过程,浏览了broker的基本功能。接下来的几篇文章,准备按照十分钟入门RocketMQ一文中提到的一系列特性,依次进行学习...

    阿杜
  • Spring Cloud Bus中的事件的订阅与发布(二)

    在之前的文章Spring Cloud Bus中的事件的订阅与发布(一)介绍了消息总线的相关事件。本文主要介绍消息总线的事件监听器以及消息的订阅与发布。 事件监听...

    aoho求索
  • Spring Cloud Bus中的事件的订阅与发布(二)

    在之前的文章Spring Cloud Bus中的事件的订阅与发布(一)介绍了消息总线的相关事件。 本文主要介绍消息总线的事件监听器以及消息的订阅与发布。

    全栈程序员站长
  • Redis-2.发布与订阅

    悠扬前奏
  • Redis(8)——发布/订阅与Stream

    发布/ 订阅系统 是 Web 系统中比较常用的一个功能。简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张...

    我没有三颗心脏
  • ROS2与Arduino发布订阅

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    zhangrelay
  • 补习系列(13)-springboot redis 与发布订阅

    消息发布者是消息载体的生产者,其通过某些主题来向调度中心发送消息; 而消息订阅者会事先向调度中心订阅其"感兴趣"的主题,随后会获得新消息。

    美码师
  • 干货 | Redis 实现发布订阅原理与实践

    Redis 是完全开源的,高性能的 key-value 数据库,受到越来越多的业务场景应用。对于"发布/订阅"的消息模式,大家也许都比较了解,但是其实现原理及应...

    架构精进之路
  • 通过python实现Redis的订阅与发布

    Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为...

    SEian.G
  • 发布订阅模式与观察者模式

    在开始敲代码之后,设计模式已经听了很多,总有一个感觉,这是很高大上的东西。其实设计模式不只是代码开发在使用,设计模式是一种思想,适用与任何方面。

    wade
  • 发布订阅模式与观察者模式

    设计模式的定义是:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。通俗一点说,设计模式是在某种场合下对某个问题的一种解决方案。如果再通俗一点说,设计...

    ConardLi
  • RabbitMQ在php中的使用----发布与订阅

    安装教程 rabbitmq和php的amqp扩展教程网上有很多,大家可以自行查询,例如:Linux系统安装RabbitMQ及PHP安装amqp拓展库详细教程

    美团骑手
  • MS SQL Server 2008发布与订阅

    本文转载:http://chaoyouzhuo.blog.163.com/blog/static/126376001201173092514498/

    跟着阿笨一起玩NET
  • 消息队列两种模式:点对点与发布订阅

    来源:和大黄 blog.csdn.net/HEYUTAO007/article/details/50131089

    芋道源码
  • Redis入坟(二)高级特性,发布订阅、事务、Lua脚本

    前面我们说通过队列的 rpush 和 lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用 lpop 查看 List 中是否有等待处理的消息(比...

    源码之路
  • RabbitMQ实战4.发布与订阅交换机临时队列发布与订阅功能实现执行结果流程总结参考文档

    RabbitMQ并非直接将消息投递到队列中,而是要经过交换机,交换机再与队列绑定。那么,什么是交换机? 如何通过交换机与队列的绑定实现发布与订阅功能?

    章鱼喵
  • Vue之全局事件总线和消息订阅与发布

    之前我们实现了子组件向父组件传递数据,很明显,这是不够的,看完这篇博客,无论哪两个组件之间传递和接收数据都没有问题!

    美食江湖

扫码关注腾讯云开发者

领取腾讯云代金券