笔者最近在看消息队列,顺便做了整理,在学习这个知识点之前,笔者问了自己下面几个问题。
什么是消息队列?为什么我们需要消息队列?消息队列有什么用?常用的消息队列有那些?
以下内容,读者便从这几个方面开始说起。
一、什么是消息队列
消息队列(英语:Message queue):是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。
消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。
消息队列常常保存在链表结构中。
二、为什么我们需要消息队列,消息队列有什么用
其实问题二和三,是分不开的,所以笔者放到一起来阐述。
在说这个问题之前,我们需要先看下消息队列的特点,因为有了这些特点,我们才能知道为什么我们需要消息队列。
第一,异步处理,它允许消息在发送很长时间之后,再去处理。
第二,提供了有格式的消息。
第三,提供了存储功能。
解耦合:因为能够提供存储功能,这就可以应用到解耦场景中去,就是让原本相互依赖的生产者和消费者,可以解除掉依赖关系。
常用的例子是订单系统,如下所示:
订单系统每次在请求数据的时候,都依赖与库存系统的返回,成功就是成功,失败就是失败。库存系统有任何风吹草动,订单系统都会受影响,它们之间有很强的依赖关系。
使用了消息队列之后,订单系统只需要往消息队列里面写数据,写完就可以立刻返回。库存系统从消息队列里面读数据,读完就返回。订单系统和库存系统,相互没有依赖性,就算库存系统重启了,重启的这段时间内,订单系统依然可以不受影响。
异步处理:因为有消息队列的存在,生产者在生产完数据之后,会丢到消息队列中,然后返回给生产者成功还是失败。消费者只是从消息队列中消费数据,只要能够消费成功就可以,消费不成功的话,可以通过一些机制保证肯定可以消费成功,例如重试机制。
如此以来,生产者可以更快的获取到返回结果。
例如:下面的例子来自于大型网站架构系列:分布式消息队列(一)
计算在并行工作的情况下,用户从发出请求到得到响应的时间都会是100ms。
引入消息队列之后,用户的响应时间会减少到55ms。
流量削峰:在客户端瞬间访问数量过多的时候,很容易导致后端服务器处理不过来挂掉,特别是秒杀业务,例如双十一,前1000个访问用户,可以命中,后续的丢掉。
如此以来,我们可以设置一个1000个消息大小的消息队列,客户端请求的消息到了之后,我们就往里存,只要消息队列满了,我们就丢弃。而后端服务只会从这些消息队列中取数据来消费,如此以来服务端的压力会大大降低。
三、常用的消息队列有那些
有很多消息队列有很多开源的实现,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ、IBM MQ、Apache Qpid、Apache RocketMQ和HTTPSQS。
后续会选几个常用的消息队列来继续介绍。
参考资料:
灰子,做于二零一九年五月九日。
网友评论