首页 > 其他分享 >RocketMQ的3种消息发送模式是什么?如何确保消息不丢失?

RocketMQ的3种消息发送模式是什么?如何确保消息不丢失?

时间:2023-10-25 18:04:16浏览次数:37  
标签:重试 场景 异步 模式 发送 消息 RocketMQ 丢失


RocketMQ发送消息的三种模式分别是:同步发送异步发送单向发送

1、同步发送模式(Sync)

发送方发送消息后会等待消息被成功发送到消息队列服务器并收到确认消息后才返回发送结果给调用方。这种模式下,发送方会阻塞等待Broker返回发送结果,直到收到确认消息或者超时。

  • 应用场景:对消息的可靠性和顺序性要求较高的场景。
  • 典型应用:订单支付、账单生成、库存扣减等涉及到重要业务操作的场景,需要确保消息被成功发送和持久化,并等待确认消息来保证可靠性。

2、异步发送模式(Async)

发送方发送消息后不会阻塞等待,而是立即返回一个 Future 对象给调用方。发送方在后台线程中异步等待消息发送结果,并通过回调函数处理发送结果。

  • 应用场景:对响应时间有要求的场景,通常用于提高发送吞吐量。
  • 典型应用:日志收集、用户行为追踪、实时数据采集等需要高吞吐量的场景,通过异步发送模式可以尽快发送消息并在后台线程中处理发送结果。

3、单向发送模式(Oneway)

单向发送是消息发送完之后就不管了,不管发送成功没成功,是最不可靠的一种方式。

  • 应用场景:对消息的可靠性要求较低,不需要等待确认消息的场景。
  • 典型应用:日志记录、广播通知、通知类消息等不需要关注发送结果,只需发送而无需等待响应的场景。

4、模式的选择

需要根据具体的业务需求和场景来选择合适的发送模式。例如,对于需要确保消息的可靠性和顺序性的关键业务操作,同步发送模式是一个较好的选择。而对于日志收集等高吞吐量场景,异步发送模式可以提高消息发送的效率。对于不需要关注发送结果的通知类消息,可以使用单向发送模式。

5、确保消息不丢失的几种措施

  • 消息持久化:RocketMQ支持将消息持久化到磁盘,即使发生服务器故障或重启,消息也能够得到保留。消息持久化可以通过设置消息的持久化级别来实现,包括同步刷盘(SYNC_FLUSH)和异步刷盘(ASYNC_FLUSH)等。
  • 高可用部署:通过在RocketMQ集群中使用多个Broker节点,实现高可用性部署。当某个Broker节点发生故障时,其他节点可以接管消息的处理,确保消息的可靠传输。
  • 冗余备份:可以通过设置消息的冗余备份数量,将消息在多个Broker节点上进行备份存储。即使某个节点发生故障,仍然可以从其他节点中获取备份消息,确保消息不丢失。
  • 合理的重试机制:在发送消息时,可以设置合理的重试次数和重试间隔,以应对发送失败的情况。在发送失败后,可以选择重新发送消息,直到消息成功发送为止。MQ为生产者提供了失败重试机制,同步发送和异步发送默认都是失败重试两次当然可以修改重试次数,如果多次还是失败,那么可以采取记录这条信息,然后人工采取补偿机制。
  • 监控和报警:建议设置监控和报警系统,及时监测RocketMQ集群的状态和性能指标。通过监控系统可以发现异常情况并及时采取措施来确保消息的可靠性。

综上所述,为了确保消息不丢失,可以采取消息持久化、高可用部署、冗余备份、合理的重试机制以及监控和报警等措施。这些方法可以提高消息的可靠性和系统的稳定性。

标签:重试,场景,异步,模式,发送,消息,RocketMQ,丢失
From: https://blog.51cto.com/u_13946099/8023606

相关文章

  • SpringBoot内容协商(Content Negotiation)二 —— 自定义消息转换器(MessageConverter)
    SpringBoot内置的消息转换器SpringBoot没有处理返回yaml格式的数据,这里需要手动添加处理这种返回格式的支持。导入依赖<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId></dependency>添加配......
  • Chromium 消息循环和线程池详解
    Chromium中的多线程机制由base库提供,要理解Chromium中的多线程机制,首先要理解的概念就是 base::MessageLoop 和 base::TaskScheduler ,它们两个是Chromium多线程的基础1. MessageLoop详解base::MessageLoop 代表消息循环,它不会主动创建新的线程,默认情况下它使用当前......
  • 内存中的消息队列-disruptor
    一、介绍工作中遇到项目使用Disruptor做消息队列,对你没看错,不是Kafka,也不是rabbitmq;Disruptor有个最大的优点就是快,还有一点它是开源的。Disruptor是英国外汇交易公司LMAX开发的一个高性能队列。Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-cons......
  • 找回丢失的硬盘数据:一个简单易懂的步骤指南
    当意识到硬盘或是其他存储设备丢失了重要数据时,首先要做的就是保持冷静。紧张和焦虑可能会导致误操作,进一步损坏数据。在找到好用的方法之前,可以先明确具体想要恢复哪些数据,以及这些数据位于原来的什么位置。其次,在执行硬盘数据恢复之前,还可以先检查下备份。如果平时有定期备份数据......
  • 找回丢失的硬盘数据:一个简单易懂的步骤指南
    现代社会中,数据的重要性不言而喻,我们习惯依赖电脑来存储数据,例如,工作文件、照片、视频、学习资料等。有时候,存储在硬盘上的数据会不可避免的丢失,一旦丢失了重要数据,要面对的将是不可估量的损失。本文将提供一个简单易懂的恢复指南,帮你轻松恢复丢失的硬盘数据,冷静应对数据丢失问题。......
  • 【RocketMQ】数据的清理机制
    Broker在启动的时候会注册定时任务,定时清理过期的数据,默认是每10s执行一次,分别清理CommitLog文件和ConsumeQueue文件:publicclassDefaultMessageStoreimplementsMessageStore{//CommitLog清理类privatefinalCleanCommitLogServicecleanCommitLogService;......
  • 2023-10-21:用go语言,一共有三个服务A、B、C,网络延时分别为a、b、c 并且一定有:1 <= a <= b
    2023-10-21:用go语言,一共有三个服务A、B、C,网络延时分别为a、b、c并且一定有:1<=a<=b<=c<=10^9但是具体的延时数字丢失了,只有单次调用的时间一次调用不可能重复使用相同的服务,一次调用可能使用了三个服务中的某1个、某2个或者全部3个服务比如一个调用的时间,T=100100的延时......
  • 2023-10-21:用go语言,一共有三个服务A、B、C,网络延时分别为a、b、c 并且一定有:1 <= a <= b
    2023-10-21:用go语言,一共有三个服务A、B、C,网络延时分别为a、b、c并且一定有:1<=a<=b<=c<=10^9但是具体的延时数字丢失了,只有单次调用的时间一次调用不可能重复使用相同的服务,一次调用可能使用了三个服务中的某1个、某2个或者全部3个服务比如一个调用的时间,T=100100......
  • RocketMQ5.0 搭建 Name Server And Broker+Proxy 同进程部署、搭建RocketMQ控制台图形
    前言RocketMQ5.0中的几个角色NameServer、Broker和Proxy,它们的作用如下:NameServer:NameServer是RocketMQ的名称服务器,负责管理消息队列和消费者组。Broker:Broker是RocketMQ的消息代理服务器,负责接收、处理和存储消息。Proxy:Proxy是RocketMQ的代理服务器,用于扩展消息......
  • 编译 Spartacus 6.0 时遇到的错误消息
    错误消息如下:CompilingwithAngularsourcesinIvypartialcompilationmode.projects/storefrontlib/shared/components/generic-link/generic-link.component.html:22:6-errorTS2322:Type'string|null'isnotassignabletotype'string|undefine......