2024/08/09
bg电子游戏平台bg电子游戏平台bg电子游戏平台消息队列将我们系统从同步调用改成了异步调用,将我们的系统进行解耦,但随之也带来一个问题,那便是如何保证消息使命必达。
举个例子,在电商系统中,用户下单后,我们通常是使用异步消息去通知购物车系统清空对应的购物车物品的bg电子游戏平台。如果我们不能够保证消息使命必达,那么就意味着有些用户下完单之后,他的购物车还有原来这些物品,造成不好的体验。所以,一个可用的消息队列,必须是可靠,那么如何去保证消息生产到消费的过程中,是可靠的呢。
一般来说,消息队列队列有三个重要步骤,分别是生产-存储-消费。这一点很多同学都会没有注意到,甚至很多人调用消息队列的时候都会经常忘记去处理异常。在通常情况下,生产消息都是可以成功的,但是,在一些极端的条件下,例如网络波动,或者机器宕机,往往会造成消息入堆失败,这就要求我们需要处理对应的异常bg电子游戏平台。在消息入队失败的时候,进行重试或者直接回滚相应的事务,并且告诉前端处理失败。
其次,则是消息的存储阶段。虽然我们的消息队列已经经历了非常多场景的考验bg电子游戏平台,但是在生产环境中,应用的重启也是常态。为了避免应用重启带了的数据丢失,我们最好是将数据进行落盘,即便是我们重启应用,也不会造成数据丢失。其次,硬件的损坏不可避免,服务器也是有使用寿命的,也是有可能遭遇到意外,如果我们的数据只存在一台机器上,一旦机器损坏,就有可能会丢失数据,所以,常见的做法是每条消息都会至少在两台机器上写成功才会返回成功。为什么是两台机器呢,因为从概率学的角度上来说,同一个集群在不同机房的两台机器,同时遇到故障的概率几乎为0。
最后则是在消息的消费阶段,很多同学有非常不好的编写代码习惯,就是不处理异常,无论代码执行的结果如何,都会告诉消息队列消息消费成功,这是非常不好的。我们就曾经遇到这样一个例子,每次用户成交之后,我们都会回调给商家,通知商家数据变更,可以来拉取数据。这只是一个非常简单的HTTP GET请求,按道理来说,是很难失败的。但是,有些商家的开发能力差,服务器经常宕机,刚好这个商家今天就成交这一单。因为没有处理HTTP的异常,消息被判断为消费成功,就会造成商家的数据错误。
如果你以为只要做好重试就行了,那就太天真了。在现代分布式系统中,有一种特殊情况特别需要程序员注意的,那就是对于超时的处理,在程序异常中,很多异常我们都可以认为下游系统处理失败了,唯有超时异常,我们很难去判断下游系统是否已经处理成功。这就需要我们对消息队列进行设计,尽量保证我们的系统是幂等的,从而保证消息不会因为重复消费而带来新的问题。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
小牛电动自行车 MT Play 发布:12Ah 铅酸电池,首发价 3999 元
惊呆了!吴艳妮百米栏创奇迹,36年纪录已破,她是新一代飞人?
价格高到离谱!导游怒斥:你们要把游客吓退吗?连锁酒店1晚上千元,当地出手:最高罚500万元!旅游博主:一天就把价格打下来了
金健米业:公司目前用于大米加工的水稻及大米,主要来源地为湖南、湖北、安徽、江西及东北三省
名创优品创始人叶国富:美国员工1小时工资20美元!中国有非常好的用工成本,中国员工是按一个月结工资的
新消费日报 享界S9上市24小时大定超2500台;雅戈尔投资林清轩;罗永浩发文回应被指五宗罪……
与中坚力量共成长,2024建信信托艺术大奖评委会特别奖获奖艺术家凌海鹏
不是吧!#萌娃日常 #母子日常 #人类幼崽的800个心眼子 #人小鬼大的小丫头 #斗智斗勇的日常
孕妈怀孕时不当使用雄激素药,女孩出生后有男性化的表现?医生:孕期要规范用药
华为Mate70系列:11月左右发布!华为Nova13系列:经销商9月分货
微信平台
手机官网