Serverless 架构下的消息队列使用与优化实践

阅读时长 7 分钟读完

Serverless 架构是当前互联网技术的热门话题,它的本质是将云服务商提供的虚拟机硬件资源抽象出来,将前端业务流程加速发展的同时也实现了成本的降低、技术的自治等多种优势。

随着 Serverless 技术的普及,我们的前端应用程序中运用了越来越多的事件驱动的消息队列。然而,对于很多开发人员来说,如何构建一套稳定的消息队列系统,是一个难题。本文结合实例,介绍了消息队列的概念、使用场景、优化方案和实践指南。

什么是消息队列?

简单的说,消息队列指的是一种异步通信机制,用于生产、传递、异步处理消息。消息队列大多数时候被用于解决分布式系统中的一些问题。

在分布式系统中,因为各个服务之间的相互依赖,很多时候服务之间的相互之间暴露出异步处理的问题。当每个微服务提供一样的功能之后,消息队列就成了这样一种处理方式。

为什么要使用消息队列?

使用消息队列有如下好处:

  • 解耦:消息队列能够将多个应用程序解耦,减少了应用程序之间的依赖关系。
  • 异步处理:应用程序将消息发送到消息队列后即可进行其他操作,等待消息队列中的消息被消费。
  • 冗错:当某些应用程序出现故障时,消息队列能够缓冲消息并接受故障恢复后重新消费处理。
  • 扩展性:在大数据量高并发的情况下,消息队列能够有效地缓存消息,增加应用程序扩展性

如何使用消息队列?

以下是一个简单的实例,展示如何在 Serverless 架构下使用消息队列。

安装依赖

首先,你需要需要使用 npm 安装两个模块:

代码实现

生产者代码:

-- -------------------- ---- -------
----- --- - -------------------
----- - --- - - ----
----- -------- - ------ -----

--------------- - ----- ------- -- -
  ----- --- - --- ----- ----------- ------------ ---

  --- ------- - ----------------------
  --- ------ - -
    ------------ --------
    --------- ---------
  --

  --- -
    --- ---- - ----- ----------------------------------
    -------------------- ----------------- ---- -- --- --------
  - ----- ------- -
    -------------------- -------
  -

  -------
--

消费者代码:

-- -------------------- ---- -------
----- --- - -------------------
----- - --- - - ----
----- -------- - ------ -----

--------------- - ----- ------- -- -
  ----- --- - --- ----- ----------- ------------ ---

  --- -
    --- ---- - ----- --------------------
      --------- ---------
      -------------------- -
    -------------

    --- ----------- - ----------------------------------
    -------------------- ----------------------------- -------- ---- --------

    -- -----------
    -- ---

  - ----- ------- -
    -------------------- -------
  -
--

测试代码

-- -------------------- ---- -------
----- --- - ------------------------
----- ------ - ------------------
----- -------- - -----------------------
----- -------- - -----------------------

-- --------
-------------- ---------- -- -- -
  --------- -- -
    ------------- -------------- ----------------- ---------- ----- --- ----
  ---

  -------- -- -
    -------------------
  ---

  ---------- --- --- ------- ---- ----- -- -- -
    ----- ----- - -
      ----- ------
    --
    ----- --- - ----- ------------------------
    ----------------------- -----------
  ---
---

-- --------
-------------- ---------- -- -- -
  --------- -- -
    ------------- ----------------- -----------------
      --------- -
        - ---------- ---- ----- ----------------- -
      -
    ----
  ---

  -------- -- -
    -------------------
  ---

  ---------- --- --- ------- ---- ----- -- -- -
    ----- ----- - -
      ----- ------
    --
    ----- --- - ----- ------------------------
    ----------------------- -----------
  ---
---

在以上模块实现后,你就可以部署你的队列服务了。你可以在 AWS Lambda 中部署生产者和消费者代码。同时,根据对应队列服务的 URL 即可正常使用该代码。

消息队列优化和实践

以上是一个基本实现的例子,也是您在日常开发中会使用的主要方式。但在生产环境中,消息队列仍然面临以下问题:

  • 吞吐量不稳定:由于消息队列中可能存在的较长处理时间,可能会导致消息总排队时间或消费时间大于阈值从而导致系统性能下降
  • 消息顺序的完整性:在某些情况下,消息队列中的消息顺序的完整性至关重要。这对于许多生产应用程序,例如金融交易系统,是不可动摇的。
  • 消息丢失:考虑当生产者的消息在发送后失败,触发重试机制的情况下消息丢失,需要补救。

以下是一些优化和实践策略:

提高吞吐量

提高吞吐量的一种策略是适时去除队列中的冗余消息,尤其是那些长时间未被消费的消息,可以通过以下方式实现:

  • 定时器:足以清除消息队列中的过期消息,这样就能提高吞吐量,但相关设置需要超时时间。
  • 告警:告警能够帮助开发者更好地了解程序运行状态,及时发现错误并且开发程序来解决它。同时,告警保证了程序可用性。

不过,这种方法还是有一些限制,例如并发能力等等,由于不同的业务场景,可能会有不同的需求且用法。

确保消息排序

防止消息队列出现乱序是一个繁琐和有挑战性的任务,但以下操作可以帮助你在保持消息排序和提高吞吐量之间找到平衡:

  • 消息明确区分:给消息编号或给消息增加一个时间戳,这样就可以更好地区分每个消息。
  • 其他方式:在生产应用程序时,您可能需要启用排序模式或通过为每个消息定义适当的优先级来确保消息排序。

消息丢失

即使消息队列服务自身是高可用和冗余的,在处理复杂场景的时候,仍然需要有过程来保证消息的完整性。以下操作可以确保您的消息不会丢失:

  • 消息复制:考虑将消息同时发送到多个队列以确保数据无法丢失。这被称为消息复制。
  • 消息协商:与所有相关方进行协商,以确保消息和处理的可靠性。

总结

Serverless 架构下的消息队列使用和优化是一个值得深入研究的领域,除了本文之外,还有更多值得了解和学习的内容。不论对于初学者还是对于有 Serverless 技术的开发人员,都应该对消息队列的使用场景和优化方法有一定的了解和掌握,以更好的支持我们的前端业务发展。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64bf8eb29e06631ab9c1431c

纠错
反馈