简介
MQ(Message Queue)是一种提供消息队列服务的中间件,在当今微服务盛行的互联网架构中,提供一种进程间的异步通信方式。消息队列是一套提供消息生产、存储和消费全过程的软件系统,目前已经成为了很多互联网服务架构里的标配中间件。
作用
异步解耦
一个大型的应用通常会由多个子应用构成,比如电商系统通常会由订单系统、物流系统、用户系统、库存系统等构成。如果系统间使用常规的同步调用,用户在订单系统下单成功,订单系统需要调用物流系统、库存系统、用户系统等系统进行业务逻辑处理,耦合性很大,且随着业务的复杂性的增大,耦合性也越来越大,改动起来也困难,需要和多个系统进行沟通。
如果在订单系统调用其它系统的过程中,其它系统出现响应慢或者故障的情况,那么也会影响订单系统,造成用户体验不好。
当使用消息队列后,系统间的耦合度会降低许多,订单系统只需要和消息队列进行通信,而不再需要关注其它子系统是否正常工作。如果其它子系统出现问题,那么消息会存储在消息队列内部,只需要其它子系统及时解决故障即可。而且异步通信后,整个系统的吞吐量也会上升。
削峰限流
很多系统的流量都遵循二八定律,即80%的流量集中在20%的时间段内,为了避免大量请求同一时间进入对系统造成负载过大,我们可以使用消息队列将系统处理不完的请求暂存在消息队列中,然后让系统以匀速的方式处理完这批峰值请求,能够大大提升系统的稳定性。
使用消息队列进行流量削峰限流,很多时候是为了成本方面考虑,一个系统要实现稳定每秒能处理1万请求,需要耗费的机器和研发成本是比较大的,如果系统只有较短的一段时间QPS会达到1万,而大部分时间的QPS只有1千,那么我们只需要投入针对1千QPS请求的成本,使用消息队列缓冲高峰期的请求,这样能有效地节约研发成本。
数据收集
在分布式系统产生海量数据的时代,数据对很多公司来说都是很重要的,依据对数据收集和分析,方便业务了解用户行为、客户群体和客户画像等,技术更好地进行系统监控、日志查看等。因此,一个可靠地、吞吐量大的消息队列是数据处理系统中很重要的一个环节。
RocketMQ
RocketMQ是一款使用Java语言开发的MQ产品,由阿里巴巴公司进行开发,现已贡献给Apache开源基金会进行维护。RocketMQ经过了多年阿里双十一购物节千亿级消息的考验,性能和稳定性都有很好的评价。
相对于使用Scala语言开发的Kafka和使用Erlang语言开发的RabbitMQ,RocketMQ更适用于Java语言为主的公司,比较容易技术人员进行定制开发和维护。