消息队列(MQ)及异步操作
本文主要介绍什么是消息队列(MQ),为什么使用消息队列,以及MQ的异步操作。
什么是消息队列?
“消息队列”是在消息的传输过程中保存消息的容器。主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到解耦的目的。主要有ActiveMQ,RabbitMQ,Kafka,RocketMQ。
为什么要使用消息队列?
主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。
MQ的异步操作
使用消息队列将调用异步化,可改善网站的扩展性,使用消息队列将调用异步化,可改善网站的扩展性,还可改善网站系统的性能。
不使用消息队列:
使用消息队列:
在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发的情况下,会对数据库造成巨大的压力, 同时也使得响应延迟加剧。在使用消息队列后,用户请求的数据发送给消息队列后立即返回,再由消息队列的消费者进程(通常情况下, 该进程
通常独立部署在专门的服务器集群上)从消息队列中获取数据, 异步写入数据库。由于消息队列服务器处理速度远快于数据库(消息队列服务器也比数据库具有更好的伸缩性),因此用户的响应延迟可得到有效改善。
消息队列具有很好的削峰作用一一即通过异步处理, 将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。在电子商务网站促销活动中,合理使用消息队列,可有效抵御促销活动刚开始大量涌入的订单对系统造成的冲击。
需要注意的是, 由于数据写入消息队列后立即返回给用户, 数据在后续的业务校验、写数据库等操作可能失败, 因此在使用消息队列进行业务异步处理后,需要适当修改业务流程进行配合,如订单提交后, 订单数据写入消息队列, 不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单,甚至商品出库后, 再通过电子邮件或SMS 消息通知用户订单成功,以免交易纠纷。