当前位置:首页 > 科技  > 软件

阿里二面:要保证消息不丢失,又不重复,消息队列怎么选型?

来源: 责编: 时间:2024-01-16 10:14:42 340观看
导读大家好,我是君哥。在使用消息队列时,有两个经常让我们烦恼的问题,消息丢失和消息重复。那我们在做技术选型时,有没有一个消息队列能解决消息丢失和消息重复这两个问题呢?消息丢失如上图,从生产者发送消息,Broker 保存消息,消

6ii28资讯网——每日最新资讯28at.com

大家好,我是君哥。6ii28资讯网——每日最新资讯28at.com

在使用消息队列时,有两个经常让我们烦恼的问题,消息丢失和消息重复。那我们在做技术选型时,有没有一个消息队列能解决消息丢失和消息重复这两个问题呢?6ii28资讯网——每日最新资讯28at.com

消息丢失

6ii28资讯网——每日最新资讯28at.com

如上图,从生产者发送消息,Broker 保存消息,消费者消费消息,每一个环节都有可能丢失消息。6ii28资讯网——每日最新资讯28at.com

发送丢失

生产者发送消息时,如果处理不当,很可能会造成消息丢失。6ii28资讯网——每日最新资讯28at.com

生产者发送消息,主流消息队列都支持同步发送和异步发送。如果使用同步发送,生产者发送消息后,会同步等待 Broker 返回的 ACK,收到 ACK 消息,就认为消息发送成功。如果长时间没有收到,则会认为消息发送失败,需要进行重试。6ii28资讯网——每日最新资讯28at.com

同步发送可以保证消息不丢失,但是会有性能问题,所以多数情况会选择异步发送。异步发送如何保证消息不丢失呢?主流消息队列(比如 Kafka 和 RocketMQ)实现方法基本类似,使用回调函数来实现。下面看一下 Kafka 的异步发送代码:6ii28资讯网——每日最新资讯28at.com

producer.send(record, new Callback() { public void onCompletion(RecordMetadata metadata, Exception exception) { if (exception != null) {  logger.error("发送消息失败:", exception); } if (metadata != null) {     logger.info("消息发送成功");  } }});

消息存储

生产者发送消息成功,也不能保证消息绝对不丢失。因为即使消息发送到 Broker,如果在消费者拉取到消息之前,Broker 宕机了,消息还没有落盘,也会导致消息丢失。6ii28资讯网——每日最新资讯28at.com

在存储阶段要保证消息不丢失,可以考虑几个方面:6ii28资讯网——每日最新资讯28at.com

同步刷盘

采用异步刷盘,如果在消息落盘之前 Broker 宕机了,就会造成消息丢失。而采用同步刷盘,等待消息落盘之后,再给 Sender 返回发送成功,可以从消息发送环节保证消息不丢失。6ii28资讯网——每日最新资讯28at.com

6ii28资讯网——每日最新资讯28at.com

在 RocketMQ 中,把 flushDiskType 参数配置为 SYNC_FLUSH 就可以开启同步刷盘。6ii28资讯网——每日最新资讯28at.com

Broker 集群

如果 Broker 集群中只有一个节点,即使消息落盘成功了,Broker 发送故障,在 Broker 恢复以前消费者也会拉取不到消息。而且如果 Broker 磁盘故障不可恢复,消息也会丢失。6ii28资讯网——每日最新资讯28at.com

采用 Broker 集群可以很好地解决这个问题。见下图:6ii28资讯网——每日最新资讯28at.com

6ii28资讯网——每日最新资讯28at.com

在 Broker 集群时,可以等待 2 个以上的节点同步消息完成后再给 Producer 返回成功。这样即使一个 Broker 挂了,也可以很容易找到替代的 Broker。6ii28资讯网——每日最新资讯28at.com

消息消费

消费者保证不丢失消息,需要消费完成后再给 Broker 返回 ACK。在主流的消息队列中,如果 Broker 收不到 ACK,都会给消费者再次发送这条消息。6ii28资讯网——每日最新资讯28at.com

有时候为了解决消息积压的问题,消费者拉取到消息后会直接返回 ACK,然后再异步执行消息处理逻辑。这样要保证消息不丢失,需要在返回 ACK 之前把消息保存到本地,比如持久化到数据库,后面可以取数据库保存的消息进行处理。6ii28资讯网——每日最新资讯28at.com

消息重复

消息重复一般有两个原因,一个是生产者发送消息后没有收到 ACK,然后进行重复发送,另一个原因是消费者消费完成后 Broker 没有收到 ACK,导致消息重复推送给消费者。6ii28资讯网——每日最新资讯28at.com

重复消息会对业务造成影响,比如电商场景中的重复支付、账务场景中的重复记账,对业务造成的影响都比较严重。6ii28资讯网——每日最新资讯28at.com

从目前主流的消息队列来看,并没有一个消息队列能解决消息重复消费的问题,只能在消费端做幂等处理。下面提供几个思路作为参考。6ii28资讯网——每日最新资讯28at.com

数据库唯一键约束

如果消息会落本地数据库,可以采用消息 ID 作为唯一键。如果消息不落数据库,可以将消息 ID 或者消息中其他唯一能标识消息的属性作为唯一键落业务数据表。6ii28资讯网——每日最新资讯28at.com

保存消费记录

我们也可以将消息 ID 保存 Redis,消费消息前判断消息 ID 是否已存在。6ii28资讯网——每日最新资讯28at.com

ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();Boolean result = valueOperations.setIfAbsent(messageId, messageId);if (result) { //消费逻辑;} else { logger.error("这条消息已经消费,跳过,消息ID:{}", messageId);}

这里有一个注意点,如果消费失败了,需要删除 Redis 中保存的消息 ID。6ii28资讯网——每日最新资讯28at.com

总结

消息不丢失、不重复是消息队列的基本要求,但这个基本要求还是很难满足的。6ii28资讯网——每日最新资讯28at.com

消息丢失这个要求,主流消息队列通过消息重试和消息持久化的方式可以满足。6ii28资讯网——每日最新资讯28at.com

但消息重试也同时带来了消息重复的可能性,主流消息队列在解决重复消息的问题上并没有现成的方案,对不允许重复消费的场景,需要开发人员在消费端做幂等处理。6ii28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-62355-0.html阿里二面:要保证消息不丢失,又不重复,消息队列怎么选型?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 部署过Vue项目吗?遇到404如何解决?

下一篇: Android开发之渐变色,你学会了吗?

标签:
  • 热门焦点
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
Top