消息队列(一)

作者: 灰常出色 | 来源:发表于2019-05-09 20:35 被阅读8次

    笔者最近在看消息队列,顺便做了整理,在学习这个知识点之前,笔者问了自己下面几个问题。

    什么是消息队列?为什么我们需要消息队列?消息队列有什么用?常用的消息队列有那些?

    以下内容,读者便从这几个方面开始说起。

    一、什么是消息队列

    消息队列(英语:Message queue):是一种进程间通信或同一进程的不同线程间的通信方式,软件贮列用来处理一系列的输入,通常是来自用户。

    消息队列提供了异步通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。

    消息队列常常保存在链表结构中。

    二、为什么我们需要消息队列,消息队列有什么用

    其实问题二和三,是分不开的,所以笔者放到一起来阐述。

    在说这个问题之前,我们需要先看下消息队列的特点,因为有了这些特点,我们才能知道为什么我们需要消息队列。

    第一,异步处理,它允许消息在发送很长时间之后,再去处理。

    第二,提供了有格式的消息。

    第三,提供了存储功能。

    解耦合:因为能够提供存储功能,这就可以应用到解耦场景中去,就是让原本相互依赖的生产者和消费者,可以解除掉依赖关系。

    常用的例子是订单系统,如下所示:

    订单系统每次在请求数据的时候,都依赖与库存系统的返回,成功就是成功,失败就是失败。库存系统有任何风吹草动,订单系统都会受影响,它们之间有很强的依赖关系。

    使用了消息队列之后,订单系统只需要往消息队列里面写数据,写完就可以立刻返回。库存系统从消息队列里面读数据,读完就返回。订单系统和库存系统,相互没有依赖性,就算库存系统重启了,重启的这段时间内,订单系统依然可以不受影响。

    异步处理:因为有消息队列的存在,生产者在生产完数据之后,会丢到消息队列中,然后返回给生产者成功还是失败。消费者只是从消息队列中消费数据,只要能够消费成功就可以,消费不成功的话,可以通过一些机制保证肯定可以消费成功,例如重试机制。

    如此以来,生产者可以更快的获取到返回结果。

    例如:下面的例子来自于大型网站架构系列:分布式消息队列(一)

    计算在并行工作的情况下,用户从发出请求到得到响应的时间都会是100ms

    引入消息队列之后,用户的响应时间会减少到55ms。

    流量削峰:在客户端瞬间访问数量过多的时候,很容易导致后端服务器处理不过来挂掉,特别是秒杀业务,例如双十一,前1000个访问用户,可以命中,后续的丢掉。

    如此以来,我们可以设置一个1000个消息大小的消息队列,客户端请求的消息到了之后,我们就往里存,只要消息队列满了,我们就丢弃。而后端服务只会从这些消息队列中取数据来消费,如此以来服务端的压力会大大降低。

    三、常用的消息队列有那些

    有很多消息队列有很多开源的实现,包括JBoss MessagingJORAMApache ActiveMQSun Open Message QueueRabbitMQIBM MQApache QpidApache RocketMQ和HTTPSQS。

    后续会选几个常用的消息队列来继续介绍。

    参考资料:

    消息队列,维基百科

    消息队列的使用场景是怎样的?

    大型网站架构系列:分布式消息队列(一)


    灰子,做于二零一九年五月九日。

    相关文章

      网友评论

        本文标题:消息队列(一)

        本文链接:https://www.haomeiwen.com/subject/xtaioqtx.html