什么是消息队列?
就是消息的传输过程中保存消息的容器。 消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。
1.异步处理提高系统性能(削峰、减少响应所需要的时间)
不使用消息队列:
在不使用消息队列时,用户的请求数据直接写入数据库,在高并发情况下,数据库的数据剧增,使得响应速度慢。
使用消息队列:
使用了消息队列,用户的请求发送给消息队列后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。响应速度得到大幅改善
- 消息队列具有很好的削峰功能-即异步处理功能,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。
- 举例:在电子商务一些秒杀、促销活动中,合理使用消息 队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。
- 因为在请求在发送给消息队列后就返回给用户了,但是请求数据的后续业务校验,写数据库等操作可能失败。因此使用消息队列进行异步处理后,需要适当修改业务流程进行配合。
- 比如:用户在提交订单之后,订单数据写入消息队列,这个时候不能直接返回用户订单提交成功,需要在消息队列的消费者进程真正处理完该订单,再通过邮件通知用户订单成功。
2.降低系统耦合性
可以使模块直接不直接调用,那么新增模块或者修改模块就对其他模块影响较小,可扩展性更好
消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送 至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该 消息从何而来。
另外为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上, 等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务 器集群中的其他服务器发布消息。
使用消息队列带来的一些问题
- 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或 者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!
- 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺 序性等等问题!
- 一致性问题: 我上面讲了消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万 一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了!
原文地址:https://www.cnblogs.com/programmerzx/p/12324578.html
时间: 2024-11-02 04:35:29