范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

18消息投递如何保证消息仅仅被消费一次?

  上节课我们通过在电商系统增加消息组件达到了削峰填谷的作用,对次要业务逻辑做了异步处理,对不同的系统模块做了解耦。因为业务逻辑从队列中移除了,所以我们要有响应的队列处理逻辑了,这时 系统架构就变成了 如下:
  今天 再来讨论一个非主流程的业务逻辑,比如客户购买了一个商品之后,会给用户发红包,但是发红包这个流程是非必要的业务关键流程,所以可以通过消息队列来异步处理。但是这里面容易出现一个问题,如果红包消息重复处理了就会导致公司利益损失,这个问题怎么解决呢?这个就是我们今天的话题:消息的重复消费问题。
  那么我们如何来保证产生的消息一定会被消费并且只被消费一次呢?  消息为什么会丢失
  如果消息只被消费一次,首先保证消息不丢失。那么消息从被写入消息队列到被消费者完成,这个链路会有哪些丢失消息的可能,三个方面  消息从生产者写入消息队列的过程  消息在消息队列中的存储场景  消息被消费者消费的过程
  1、在消息生产的过程中丢失消息
  首先消息生产者是我们的业务服务器,消息队列服务器为单独部署的。虽然是内网,但这个过程也有可能出现网络抖动导致消息丢失的可能。
  针对这种情况,建议采用消息重发机制,但是也不能无限制的重发,如果不是因为消息队列发生故障或是网络断开,一般重试 2~3次即可解决。而重发机制,也是大多数消息队列本身提供的功能。
  消息重发存在的问题就是消息的重复消费,现实的意义就是你收到了两个红包,公司就亏损了。
  那么消息发送到了消息队列是不是就万无一失了呢?也不是,消息队列中仍然有丢失的可能。  2、在消息队列中丢失消息
  已kafka 为例,消息在kafka中是存在本地磁盘上的,而为了减少消息存储对磁盘的随机IO,一般消息会先写入到操作系统的page cache 中,然后再找合适的时间刷新到磁盘上。
  比如,卡夫卡可以设置一定的时间或者消息累积到一定量时候再刷盘,也就是所说的异步刷盘。
  不过如果发生机器断电或者机器重启,page cache 中还没来得及刷盘消息就会丢失,那怎么解决呢?
  你可以设置把刷盘时间设置很短或者消息累计很少就刷,但是这样频繁刷盘对性能也有很大影响,经验来看,出现机器宕机或者掉电的几率也不高,所以不建议这么做。
  如果系统对消息丢失容忍度很低,可以考虑集群部署消息服务,通过部署多个副本保证消息尽量不丢失。
  kafka集群中还有一个Leader负责消息的写入和消费,还有多个follower负责消息的数据备份,Follower中还有一个特殊的集合 ISR(in-sync replicas)当Leader故障时,新的Leader会从ISR中选择,默认Leader的数据会异步的复制给Follower,这样在 Leader 发生掉电或者宕机时,Kafka 会从 Follower 中消费消息,减少消息丢失的可能。
  由于消息默认是从 Leader复制到Follower的,所以一旦Leader宕机,那么没来得及复制的消息还是会丢失,为了解决这个问题,Kafka提供了一种机制 :  acks  ,  当这个选项被设置为"all"时,生产者发送的每一条消息除了发给 Leader 外还会发给所有的 ISR,并且必须得到 Leader 和所有 ISR 的确认后才被认为发送成功。  这样,只有 Leader 和所有的 ISR 都挂了消息才会丢失。
  从上面这张图来看,当设置"acks=all"时,需要同步执行 1、3、4 三个步骤,对于消息生产的性能来说也是有比较大的影响的,所以你在实际应用中需要仔细地权衡考量。我给你的建议是:  如果你的消息一条不能丢失,建议不要开启同步刷盘,而是用集群方式解决,可以配置当所有ISR Follower都接收到消息才返回成功  如果对消息丢失有一定容忍度,不建议使用集群,或者即使是集群也配置一个Follower同步成功即返回成功。  上面我们发红包的业务就有一定容忍度,如果消息丢失可以通过补发来实现。  3、在消费的过程中存在消息丢失的可能
  一个消息消费的进度是记录在消息队列群里的,消费的过程分为三步:接收消息、处理消息、更新消费进度。
  接受消息和处理消息都有可能发生失败,比如接收消息发生网络抖动,导致消息没有正确接收到,处理消息可能发生一些异常,这是入股更新了消费进度,那么这条消息就永远不会被处理了。
  所以你这里需要注意了,一定要等到消息正确处理完成再正确提交,这时也有一个问题就是,加入消息已经正确处理,但是由于网络问题没有正确提交消费进度,这个时候就会导致消息会重复的消费。  如何保证消息只被消费一次
  从上面分析可以得出,为了避免消息丢失,我们做了两方面的努力:一是需要牺牲一部分性能,而是可能造成消息的重复消费。
  性能损耗还可以,一般业务系统只有写操作才会发送消息队列,一般系统的写请求并发量不高,但是消息一旦被重复消费就会造成业务逻辑的错误。那么如何避免呢?
  完全的做到不消费重复消息 很难做到,所以我们转换思路,只要保证即使消费到了重复消息,从消费结果来看,跟只消费一次的等同就好了。也就是保证 生产和消费的过程 幂等!!!
  说白了,就是一件事无论做了多少次,产生的结果都是一样的,这个就是幂等了。  在生产、消费过程中增加消息幂等性的保证
  消息的生产和消费过程都有可能产生重复,所以要做的就是生产和消费的过程中增加消息的幂等性,这样就可以认为从结果上看实际只消费了一次。
  在消息生产过程中,  在 Kafka0.11 版本和 Pulsar 中都支持"producer idempotency"的特性,翻译过来就是生产过程的幂等性,这种特性保证消息虽然可能在生产端产生重复,但是最终在消息队列存储时只会存储一份
  它的做法是给每一个生产者一个唯一的 ID,并且为生产的每一条消息赋予一个唯一 ID,消息队列的服务端会存储 < 生产者 ID,最后一条消息 ID> 的映射。当某一个生产者产生新的消息时,消息队列服务端会比对消息 ID 是否与存储的最后一条 ID 一致,如果一致就认为是重复的消息,服务端会自动丢弃。
  而在消费端,幂等性的保证会稍微复杂一些,  你可以从通用层和业务层两个层面来考虑。
  通用层面,你可以在消息被生产的时候使用发号器给生成一个唯一id,消息被处理后,把这个id存储在数据库中,在处理下一条消息之前从数据库查询这个id 消息是否被消费过,如果被消费就放弃消费。
  你可以看到,无论是生产端的幂等性保证方式还是消费端通用的幂等性保证方式,它们的共同特点都是为  每一个消息生成一个唯一的 ID,然后在使用这个消息的时候,先比对这个 ID 是否已经存在,如果存在则认为消息已经被使用过。  所以这种方式是一种标准的实现幂等的方式,  你在项目之中可以拿来直接使用,  它在逻辑上的伪代码就像下面这样:  boolean isIDExisted = selectByID(ID); // 判断ID是否存在 if(isIDExisted) {   return; //存在则直接返回 } else {   process(message); //不存在,则处理消息   saveID(ID);   //存储ID }
  这样存在一个问题,如果消息处理完成之后,还没来得及写入数据库,消费者宕机了,重启之后发现数据库没有,还是会重复消费消息,这个时候就考虑引入事务机制,保证消息的消费跟数据库的写入必须同时成功或者失败,但是这样的成本会很高,所以如果要求不是很严格,可以直接使用这种通用的方案,不要考虑引入事务。
  在业务层面怎么处理呢?  这里有很多种处理方式,其中有一种是增加乐观锁的方式。比如你的消息处理程序需要给一个人的账号加钱,那么你可以通过乐观锁的方式来解决。
  具体的操作方式是这样的:  你给每个人的账号数据中增加一个版本号的字段,在生产消息时先查询这个账户的版本号,并且将版本号连同消息一起发送给消息队列。消费端在拿到消息和版本号后,在执行更新账户金额 SQL 的时候带上版本号,类似于执行:
  你看,我们在更新数据时给数据加了乐观锁,这样在消费第一条消息时,version 值为 1,SQL 可以执行成功,并且同时把 version 值改为了 2;在执行第二条相同的消息时,由于 version 值不再是 1,所以这条 SQL 不能执行成功,也就保证了消息的幂等性。

3个PPT技巧,每一个都超实用为大家带来三个PPT小技巧,便利大家的工作和生活。增加PPT能撤回的步数PPT默认的撤销步数是20步,而20步往往不够用,在我们撤着撤着,就会发现,没到我想要的那一步呢?其实你知道国货之光,鸿星尔克近日,河南省遭受洪灾,在举国关注的同时,很多明星和企业也大手笔送去了救援物资听河南的朋友提到,这些日子的确受灾严重,家里和公司已经一连好几日停水停电了,好在社会各界送去了救灾物资,U盘有必要安全弹出吗?怎样选择好U盘?U盘大家都不陌生,相信我们在使用或者购买时也会遇到不少的问题。比如传完文件后点页面下面的安全弹出到底有没有必要,要买到靠谱的U盘又该怎么选择?平时用完U盘有必要安全弹出吗?大家需要如何劝说女朋友购买台式电脑,而不是选择超薄笔记本?导读老程昨天看到一个问题,如何让自己的女朋友选择台式电脑,而不是花钱买一个超薄的笔记本,其实这个问题看起来很难,毕竟女人对于颜值的渴求度要远远大于对于电脑性能的渴求程度,如果你想让小米注册小爱女友商标,网友直呼年轻人第一个女朋友?雷军有一句名言,大概意思是说,一个公司或者一个项目的名字,一定要有商标有域名,含义不错朗朗上口,这样才算得上是一个好名字。有了雷总发话,小米公司在商标布局方面一直尽心尽力。近期,我aigoUSBC多功能扩展坞己悦H9S上手女朋友终于不说我乱花钱了就算是买数码产品,女朋友也要颜值与功能兼顾,所以每次给她选产品的时候,就特费时间,不过好在现在厂商也在努力为我们男同胞解决这一问题,新出的产品都非常奈斯,比如给女朋友最新入手aig追女朋友送代步车,我终于把这款买菜车的动力榨干了5个月前,在深圳初见了零跑T03试装车,时间有限,匆匆忙忙,只在楼下兜了一圈,上周末,厂家在大鹏半岛的七星湾做了一场试驾会,我终于把这款买菜车的动力给榨干了。试驾是在一个平整封闭的崩溃在路上,电动车的出行焦虑仍未根治如今,十一国庆长假已成中国人民出游的最好时候,而随着私家车的普及,尤其是电动车的发展,人们开始以电动车作为自驾的主要工具。可以说,今年的十一黄金周,是电动车续航里程的一次集中考验。兵马未动,粮草先行,传统车企身上,新势力学到了这点理想汽车北京工厂开工10月16日,理想汽车北京绿色智能工厂在北京市顺义区正式开工建设。据了解,理想汽车北京绿色智能工厂是在原北京现代一工厂现有厂区上进行改造,总投资60亿元,占地面海信2021营销聚焦冠军因为疫情关系,原计划在2020年举办的奥运会欧洲杯纷纷顺延,将2021年这个原本没有体育大赛的年份,变成了一个极其特殊的计划外运动大年,运动这个核心元素,更是成为了众多商家今年最为凌宝汽车网红小店遭遇女神疯抢,掀起汽车零售新模式传统4S店的销售模式因沟通成本高,市场需求反应效率低的弊端,越来越难以满足用户的购买和售后体验。凌宝汽车颠覆传统模式,首创女神网红小店,线上线下融合,让消费者充分感受到凌宝汽车的品
特斯拉的单踏板模式到底安全吗?利益相关交了ModelY订金且订金马上过期还没提车的准车主。为啥不提车?因为ModelY竟然把这个动能回收强度的设置直接砍了直接砍了目前的打算是就算订金过期,只要系统没改,也不提车4月少卖近1万辆车特斯拉副总裁支招称需加强消费者教育据乘联会公布的数据显示,特斯拉中国4月销售量为25845辆,与3月的35478辆相比,下降了近1万辆。而就在一天前,特斯拉副总裁称需加强消费者教育,比方说我们现在其实需要去跟驾校交投票结束,78。2的网友希望特斯拉接受狗狗币支付IT之家5月12日消息特斯拉CEO马斯克昨日在推特发起投票,询问用户是否希望特斯拉接受狗狗币作为新的支付方式,限时24小时。目前投票已经结束,在逾392万次投票中,有78。2的网友新能源技术突破前夜,我们准备好了吗来源光明日报新能源技术突破前夜,我们准备好了吗能源,不仅是现代工业的血液,也是正常生活得以维持的基石。千百年来,人类主要依靠化石能源维系,目前也是如此。但化石能源总有耗尽的一天。那欧盟韩国相继对苹果出手!1777亿后再出天价罚单,中国为何不敢了解更多科技资讯尽在圈聊科技。今天跟大家聊一聊欧盟韩国相继对苹果出手!1777亿之后再出天价罚单,中国为何不敢?我们可以不爽苹果公司的做法,但又不得不承认很多人都喜欢用苹果的产品,阿里巴巴副总裁程咬金离职,正式开启退休生活距离其调入阿里巴巴文娱事业部不足一年时间5月12日消息,阿里巴巴副总裁范驰(花名程咬金)离职引起圈内骚动,而距离其调入阿里巴巴文娱事业部不足一年时间。据启信宝信息显示,范驰2021荣耀50系列最早6月发布,新配色渲染图曝光自独立以来,荣耀先后发布了荣耀V40V40轻奢等几款产品,但因为有限的产品力与高昂的售价,荣耀独立后的几款产品市场表现平平。因此荣耀急需一款能够重返高端市场的实力产品赢回市场与粉丝如何将微信和支付宝收款二维码二合一呢?现在完全是移动支付的时代,不管是一线二线还是三四线五六线十八线城市乡村,扫码支付成为主流,便利店超市个体户小商店摆地摊的等等都在用二维码收款。对于一些商家来说,同时贴上支付宝和微信6400万双主摄,中兴Axon30Pro镜头下的城市光影手机的影像系统在如今的重要性已经不言而喻,人们习惯于它小巧便携的体积和从拍照修图到社交平台上发布的一站式便利性。这也督促着各大品牌在每年旗舰机上的影像部分上寻求突破,就目前来看效果iOS14。6Beta3修复性能下降BUG,iOS15升级名单汇总,该换机了吗苹果的iOS14。5正式版,以及iOS14。6Beta版算是同时进行的版本。前几天,苹果发布了iOS14。5。1正式版,修复了两大安全漏洞,同时也修复了一些用户无法打开App跟踪透手机处理器到底怎么挑选?全面为你分析手机处理器到底怎么挑选?我们常说买手机先看处理器,但是很多朋友不知道到底该怎么挑选?今天我就来全面地跟大家介绍一下手机芯片该怎么挑选。旗舰芯片苹果A13A14性能强劲几乎无敌,A1