消息队列的简单介绍(一)

一、什么是消息队列

消息队列包含了两个关键词:消息和队列。消息是指在应用间传送的数据,其表现形式是多样的。队列从抽象上来讲就是指消息的进和出,从时间顺序上来说,进和出并不一定是同步进行的,所以需要一个容器来暂存和处理消息。

因此,消息队列可以简单理解为:把要传输的数据放在队列中。当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件。

二、消息队列的相关概念

在这里插入图片描述
•Broker:消息处理中心,负责消息的接收、存储、转发等。
•Producer:消息⽣产者,负责产生和发送消息到消息处理中心。
•Consumer:消息消费者,负责从消息处理中心获取消息,并进行相应的处理。

消息队列服务的核心是消息处理中心,它至少要具备消息发送,消息接收和消息暂存功能。

但在生产环境中,对消息队列的要求远不止基本的消息发送、接收和暂存。在不同的业务场景中,需要消息队列产品能解决例如消息堆积、消息持久化、可靠投递、消息重复、严格有序、集群等各种问题。

三、消息队列要解决的问题

1.消息持久化

如果消息到达消息处理中心后不做任何处理就直接转给消费者,那么消息处理中心也就失去了存在的意义,无法满足流量削峰等需求。所以常规的做法就是先将消息暂存下来,然后选择合适的时机将消息投递给消费者。消息暂存可以选择将消息放在内存中,也可以选择放到文件、数据库等地方。将消息放在内存中存在的最大问题是,一旦机器宕掉消息将丢失。如果场景需要消息不能丢失,那么势必要将消息持久化。比如将消息存到本地文件、分布式文件系统、数据库系统中等。

2.可靠投递

可靠投递是不允许存在消息丢失的情况的。从消息的整个生命周期来分析,消息丢失的情况一般发生在如下过程中:
•从生产者到消息处理中心
•从消息处理中心
•消息处理中心持久化消息

3.消息重复

有些消息队列为了支持消息可靠投递,会选择在接收到消息后先持久化到本地,然后发送给消费者。当消息发送失败或者不知道是否发送成功时(比如超时),消息的状态是待发送,定时任务不停地轮询所有的待发送消息,最终保证消息不会丢失,这就带来了消息可能会重复的问题。

4.集群

在大型应用中,系统架构一般都需要实现高可用性,以排除单点故障引起的服务中断,所以可能需要消息队列产品提供对集群模式的支持。集群不仅可以让消费者和生产者在某个节点崩溃的情况下继续运行,集群之间的多个节点还能够共享负载,让某台机器或网络出现故障时能自动进行负载均衡,而且可以通过增加更多的节点来提高消息通信的吞吐量。

5.消息中间件

消息中间件关注于数据的发送和接收,利用高效、可靠的异步消息传递机制集成分布式系统。它基于消息队列的存储-转发机制,并提供了特有的异步传输机制,能够基于消息传输和异步事务处理实现应用整合和数据交换。

四、为何使用消息队列

使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

1.解耦

preview
系统A将userId写到消息队列中,系统C和系统D从消息队列中拿数据

例如,系统D拿userId不再经过系统A,而是从消息队列里边拿。系统D即便挂了或者请求超时,都跟系统A无关,只跟消息队列有关

这样一来,系统A与系统B、C、D都解耦了。

生产者把消息发送到消息队列中,这个过程就结束了。至于谁会从消息队列中取消息,生产者是不需要关心的。这样就实现了生产者和消费者的解耦。

2.异步(减少响应所需时间)

preview

为了提高用户体验和吞吐量,其实可以异步地调用系统B、C、D的接口。系统A执行完了以后,将userId写到消息队列中,然后就直接返回了。再由消息队列的消费者进程从消息队列中获取数据,各自执行自己的进程,因此响应速度得到大幅改善。

异步意味着程序在处理结果完成之前无须等待就可以去干其他事情,避免了资源的浪费。

3.削峰/限流

preview

系统B和系统C根据自己的能够处理的请求数去消息队列中拿数据,这样即便有每秒有8000个请求,那只是把请求放在消息队列中,去拿消息队列的消息由系统自己去控制,这样就不会把整个系统给搞崩。
可以得出,消息队列具有很好的削峰作用的功能——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。

五、消息队列的缺点

1.系统复杂性提高

加入消息队列后,你需要考虑消息重复消费、消息丢失、消息的顺序消费等等问题!

2.系统可用性降低

这里先说一下什么是系统可用性,避免与系统复杂性弄混淆。
系统的可用性,英文名字为System Usability,即系统服务不中断运行时间占实际运行时间的比例。所以,可用性其实是一个百分比,如99.9%。

引入消息队列后,其作为一个中间件,万一MQ宕机,消息生产者,消息消费者都不能正常执行了。

3.数据一致性问题

消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了!

六、 各种MQ产品的比较

常见的MQ产品包括Kafka、ActiveMQ、RabbitMQ、RocketMQ。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值