01丨为什么需要消息队列中间件?

853 阅读5分钟

前言

你好,我是喜欢刨根问底的小明不明。开发者圈子里,人人都在说中间件,消息队列,可见他们在软件开发中有着举足轻重的地位,那开发者们为什么会需要中间件,需要消息队列呢?


一、聊到中间件得从分层设计说起

分层设计其实无处不在公司管理分层,楼宇设计等,当然还有我们要讨论的软件领域。

分层设计的本质其实就是将复杂问题简单化,首先基于单一职责原则(SRP-Single responsibility principle)让每个对象各司其职,各尽所能。然后再基于“高内聚,低耦合”的设计思想实现相关层对象之间的交互。这样很好提高程序的可维护性和可扩展性

关键词:

  • 复杂问题简单化
  • 单一职责
  • 高内聚,低耦合
  • 提高系统的可维护性和可扩展性

以企业管理来举一个简单的例子:

假设要管理一个规模超过500人的公司,这是一个非常复杂的问题,我们都知道一般公司里面都会有一个组织结构(这里将管理问题进行了拆解,把复杂管理问题简单化),每个组织或者部门都有很明确的职责,比如说财务部,开发部,市场部等。每个部门内部的交流都是非常密切的,对外的交流相比于内部要少很多(高内聚,低耦合)。当财务出了问题或者需要调整,只需要调整财务部的管理方式(可维护性),如果公司靠考虑上市,财务可以成立小组对接发行(可扩展性)。


为什么需要中间件?

了解了分层的设计思想之后,中间件的是什么,以及为什么需要它的答案已经呼之欲出了。

它属于互联网领域分层架构中的平台中间件层

在复杂的系统设计中,软件架构人员或者开发工程师会把代码中通用服务和功能(根据单一职责原则) 做成一款软件,通常它的功能可以是数据管理、应用服务、消息传递、身份验证和 API 管理等。

读者可以再看一下下图(互联网领域的分层架构)的平台中间件层会有一个更深入的理解。 互联网领域的分层架构

为什么需要消息队列?

消息队列作为中间件之一,它的主要职责:就是收发消息这一通信需求,下面我们就从通信需求的角度剖析消息队列存在的意义。

1.通信需求——异步

秒杀系统要解决的核心问题就是:如何利用有限的服务器资源,尽可能多地处理短时间内的海量请求。

一个秒杀请求通常包含很多步骤,我们从同步和异步的角度分析服务器处理时间。

同步方式执行秒杀请求

同步方式执行秒杀请求

总耗时 500ms

异步方式执行秒杀请求

异步方式执行秒杀请求 总耗时 210ms,因为确认消息生产成功之后就可以返回了。

很明显异步的方式明显提高了服务器端的RT(Response Time)。

这就产生了一个问题:采用多线程的方法也可以完成异步,那我为什么需要消息队列呢?思考结束之后,请读者阅读通信需求——系统应用之间的解耦

2.通信需求——系统应用之间的解耦

产品经理和程序员之间的战火永不停歇,网上也经常有很多段子。 在这里插入图片描述

从中我们可以总结出:需求的变动是非常频繁的

因此作为一名能够沉着淡定的程序员,你写的代码和设计就要是高内聚低耦合的。

代码上的“高内聚低耦合”我们都知道通过设计模式来实现。

那么在系统和系统之间的耦合呢?答案自然就是我们的主题消息队列

不采用消息队列时:

在这里插入图片描述 上游系统需要知道它要调哪几个下游系统(耦合),一旦增加、减少下游系统或是下游系统需求如何变化,上游系统也需要进行修改然后重新发布。

采用了消息队列:

在这里插入图片描述 上游系统只需要生产了消息之后传给消息队列就可以了,不用关心消息被哪些下游系统消费了(解耦),因此无论增加、减少下游系统或是下游系统需求如何变化,订单服务都无需做任何更改。

3. 通信需求——流量控制

从网关到服务之间,服务和服务之间,他们的生产速度和消费速度一定都是不一致的,当生产速度远远大于消费速度的时候,一般会因为流量过大,导致流量暴增,应用挂掉。 削峰填谷

  • 用户的请求,服务器接收后,首先写入消息队列
  • 假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。 等于将系统可以正常处理的消息条数从“系统的消费能力上限”转换成了“消息队列的存储上限”,显著提高了系统的可用性。

总结

首先了解了分层设计思想,分层分层设计的本质其实就是将复杂问题简单化,首先基于单一职责原则(SRP-Single responsibility principle)让每个对象各司其职,各尽所能。然后再基于“高内聚,低耦合”的设计思想实现相关层对象之间的交互。这样很好提高程序的可维护性和可扩展性。 因此在互联网领域的分层架构中设计了平台中间件层,来提高互联网系统的可维护性和可扩展性。 消息队列的主要功能(职责)异步、解耦,削峰

思考题

市场上有这么多的消息队列实现,具体应该怎么进行选型呢?可以在评论区进行讨论。

参考资料

  1. 说说软件为什么要分层?
  2. 什么是中间件
  3. 什么是消息队列?
  4. 消息队列作用