消息队列基础

Posted programmerzx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列基础相关的知识,希望对你有一定的参考价值。

什么是消息队列?

就是消息的传输过程中保存消息的容器。 消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

1.异步处理提高系统性能(削峰、减少响应所需要的时间)

不使用消息队列:
技术图片
在不使用消息队列时,用户的请求数据直接写入数据库,在高并发情况下,数据库的数据剧增,使得响应速度慢。

使用消息队列:
技术图片
使用了消息队列,用户的请求发送给消息队列后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。响应速度得到大幅改善

  • 消息队列具有很好的削峰功能-即异步处理功能,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。
  • 举例:在电子商务一些秒杀、促销活动中,合理使用消息 队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。

  • 因为在请求在发送给消息队列后就返回给用户了,但是请求数据的后续业务校验,写数据库等操作可能失败。因此使用消息队列进行异步处理后,需要适当修改业务流程进行配合。
  • 比如:用户在提交订单之后,订单数据写入消息队列,这个时候不能直接返回用户订单提交成功,需要在消息队列的消费者进程真正处理完该订单,再通过邮件通知用户订单成功。

2.降低系统耦合性

可以使模块直接不直接调用,那么新增模块或者修改模块就对其他模块影响较小,可扩展性更好

消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送 至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该 消息从何而来。

另外为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上, 等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务 器集群中的其他服务器发布消息。

使用消息队列带来的一些问题

  • 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或 者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!

  • 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺 序性等等问题!

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

以上是关于消息队列基础的主要内容,如果未能解决你的问题,请参考以下文章

聊聊消息队列中的基础概念

消息队列专题(基础篇):消息队列入门

消息列队基础

消息队列RabbitMQ基础知识详解

消息队列学习 -- 基础了解

Rabbitmq 基础