消息队列之基础知识(一)

来自公众号:灰子学技术

欢迎关注:

 

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

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

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

一、什么是消息队列

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

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

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

 

640?wx_fmt=jpeg

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

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

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

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

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

第三,提供了存储功能。

 

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

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

 

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

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

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

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

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

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

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

有很多消息队列有很多开源的实现,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ、IBM MQ、Apache Qpid、Apache RocketMQ和HTTPSQS。

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

参考资料:

消息队列,维基百科

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

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

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值