消息队列浅析 | 青训营笔记

68 阅读3分钟

这是我参与[第五届青训营]伴学笔记创作活动的第13天。

什么是消息队列

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。

消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ。

“消息队列网络”是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。

“消息队列”安装期间,管理员确定哪些服务器可以互相通信,并设置特定服务器的特殊角色。构成此“消息队列”网络的计算机称为“站点”,它们之间通过“站点链接”相互连接。每个站点链接都有一个关联的“开销”,它由管理员确定,指示了经过此站点链接传递消息的频率。

消息队列优点

  • 解耦:将两个服务脱离,避免因为另一个服务宕机了,该服务不能够使用的情况发生 效果就体现在,A系统发布了消息给B系统,B系统挂了,那也不会影响A系统,消息已经发送到消息队列中了,A系统不需要再去考虑是否完成的问题
  • 异步:简而言之,就是类似于新开一个线程,去操作想要干的事情。由消息队列堆积耗时长的事务,不仅限于IO、业务流程复杂繁琐的业务
  • 削峰:对某个服务访问流量过大,需要放入队列中减缓访问的次数。与异步架构类似,但不相同,专注于一个服务或者说一个请求,它本身可能耗时很短

消息队列缺点

  • 系统可用性降低:引入消息队列后,就需要保证MQ的高可用性,本来可能 A 系统直接调用 B系统,因为引入了消息队列,使得 有一个MQ的中介,但是 MQ 挂掉了,这时候就完了。
  • 系统复杂度提高:引入消息队列后,处理的逻辑变多了,需要去考虑,消息有没有被重复消费,消息有没有丢失,消息的顺序性…等问题
  • 一致性问题:比如秒杀系统,订单系统处理完了,返回成功,但库存系统减少失败了,这时候就数据不一致了。