使用消息中间件时,如何保证消息仅仅被消费一次?

消息中间件使用广泛,常用来削峰填谷、系统解耦、异步处理。异步处理可能是使用的最多的场景了,比如现在的技术博客网站,都采用积分制,用户发表一篇文章后,可以获取想要的积分,为了提升系统的性能,给用户加积分的操作可以异步处理,并不需要放在同步流程中。

我们可以把用户ID,需要增加的积分封装成一条消息投递到消息系统中,异步处理加积分操作,由于这是发生在不同服务器之间,消息有可能投递失败、处理失败等问题,从而导致用户加积分失败,还有一种可能是消息重复投递,那么用户就有可能重复加积分,不管出现那种情况,都是不正常的情况。

要避免上面的两种情况,就需要我们尽量保证消息不丢失和消息只被消费一次,这篇文章抛开具体的消息中间件,从消息系统的通用层面上,谈谈如何避免这两种情况。

1、保证消息不丢失

一条消息从生产到消费这条链路中,有三个地方可能会造成消息丢失,分别如下:

  • 消息从生产者写入到消息队列的过程投递失败。
  • 消息在消息队列中,持久化失败。
  • 消息被消费者消费的过程出现异常。

1.1 在消息生产的过程中投递失败

消息生产者和消息系统一般都是独立部署在不同的服务器上,两台服务器之间要通信就要通过网络来完成,网络是不稳定,可能会发生抖动,那么数据就有可能丢失。网络发生抖动会有以下两种情况。

在消息生产的过程中丢失消息

情景一:消息在传送给消息系统的过程中发生网络抖动,数据直接丢失。
情景二:消息已经到达消息系统,但是在消息系统给生产者服务器返回信息时,网络发生抖动,此时的数据不一定真正的丢失,很可能只是生产者认为数据丢失。

针对消息在消息生产时丢失,可以采取重投机制,当程序检测到网络异常时,将消息再次投递到消息系统。但是重新投递在情景二情况下,可能造成数据重复,如何解决这个问题,在后面会提到。

</

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值