Loading...
墨滴

yuexintech

2021/06/14  阅读:71  主题:默认主题

秒懂消息队列

一、消息队列是什么?

首先,我们看到新事物新概念时要对它进行拆解,消息队列这里就可以拆成消息和队列(这不是废话吗~ ̄□ ̄)。消息在计算机世界里可以理解为数据,这个数据是用来多方沟通的,以达成一致目的。

比如约定这个数据是在商城购买成功后的信息,在发物流时直接拿这个信息辅助进行即可。

至于队列,就是一个容器,用来存储这些数据。至于存储是用内存,用db,用日志文件,都可以,看时效性和持久性的要求。

消息队列理解起来就是有人往一个容器里发送了数据,这些数据会暂时的存储起来,如果此时有其他人需要这些数据,就可以从容器里获取。

当然,也可以由容器推送这些消息过去,目的都是一样的,就是要消费这些数据

消息队列
消息队列

二、消息队列可以用来干嘛

为什么要有消息队列?存在即有道理,嗯,要相信真理(#^.^#) 。继续上面的购买商品下单操作,我们先来简单的捋一捋。

一般支付成功后就要通知物流发货了,假设我们支付服务和物流服务可以直接通信,那只要在支付成功后通过 httprpc 直接调用物流服务的协议接口即可。

正常情况,这样的流程是没有问题的,甚至很多服务的关联都通过这样的方式去调用,就像函数调用一样。

但是,程序员的世界没那么简单。得考虑很多情况,比如物流服务调不通怎么办?

此时想到的办法就是调用不成功后,暂时存放起来,然后不断的通过去轮询,完成后续的动作。

这样一来,对于支付服务就得多承担数据存储这个职责了。或许我们也可以将责任转移给物流服务,让物流服务不断的拉取数据。但同样的,物流服务也要承担额外的操作。

服务不可用
服务不可用

此时,消息队列就派上用场了,它就像现实生活中的中介,负责关联两侧。

只要支付服务投递了相关数据给消息队列,那么后续的分发动作就由它包办了。如果此时某个服务不可用,那么消息队列还可以继续工作,或接受数据或分发数据。而这也是消息队列的特性:解耦、缓冲(削峰)

消息队列特性
消息队列特性

三、使用消息队列有哪些注意点?

使用了消息队列,意味着引入了额外的组件。虽然它承担了一部分职责,但也会引入其他的复杂度。

比如当生产数据的生产方投递失败时,需要怎么处理,当消费方消费数据失败时,怎么才算失败,会不会出现消费成功,但网络超时的失败?

因此,消息队列具备很多优势,但我们也需要考虑很多使用场景。

关于投递失败的问题,其实是涉及到了消息事务,原本我们的事务都可以由数据库的事务来保证,但这里涉及的操作除了 db 还有投递消息这个动作,因此需要将这2个动作变成一个事务。

至于怎么保证整体事务,大家可以看看这篇文章 还不知道事务消息吗?这篇文章带你全面扫盲! 总体来讲,就是定时回调检查状态

关于消费失败的问题,这个就比较容易解决。当失败后,消息队列肯定是要进行二次投递的,对于接受消息的一方在业务上去保证幂等性,可以通过检测预期的版本号或者状态字段,如果已被修改过,则直接把错误消息给干掉即可。

四、常用的消息队列

现在已经有很多开源的消息队列组件了,它们一般都会考虑到可用性,容灾性,持久化等特性。所以挑一款靠谱的消息队列也很重要,可以参考下方的图

消息队列对比
消息队列对比

总结

使用消息队列,并不是简单的堆组件即可,也是需要去分析调研的。后面有时间的话,将为大家具体分析各个消息队列的特性。

yuexintech

2021/06/14  阅读:71  主题:默认主题

作者介绍

yuexintech