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

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

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

什么是消息队列?

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

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

为什么要使用消息队列?

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

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

如何使用消息队列?

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

安装依赖

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

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

代码实现

生产者代码:

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

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

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

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

  -------
--

消费者代码:

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

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

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

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

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

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

测试代码

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

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

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

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

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

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

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

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

消息队列优化和实践

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

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

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

提高吞吐量

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

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

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

确保消息排序

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

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

消息丢失

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

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

总结

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

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64bf8eb29e06631ab9c1431c


猜你喜欢

  • Socket.io 和 Vue 结合使用实现即时聊天系统

    在当今的数字时代,即时聊天成为了人们生活中不可或缺的一部分,它能够方便人们随时随地地交流信息。在前端类技术中,Socket.io 和 Vue 结合使用具有极高的可扩展性和可定制性,能够很容易地实现一个...

    1 年前
  • ECMAScript 2017 中的 Object.getOwnPropertyDescriptors:如何使用

    ECMAScript 2017 中的 Object.getOwnPropertyDescriptors:如何使用 ECMAScript 2017 添加了 Object.getOwnPropertyDe...

    1 年前
  • 使用 Headless CMS 构建多平台沉浸式阅读体验

    前言 如今,Web 端不再是唯一的数字媒体传播方式。移动应用和互动电子书的普及使得阅读经历越来越多样化和丰富化。在这篇文章中,我们将探讨如何使用 Headless CMS 构建一个多平台的沉浸式阅读体...

    1 年前
  • 使用 create-react-app 快速构建 React SPA 应用

    前言 React 是一个非常流行的开源 JavaScript 库,主要用于构建用户界面。在 React 中,将界面分解成多个组件,使得代码更容易维护、复用和测试。单页面应用程序(SPA)是一种使用 A...

    1 年前
  • 解决 Material Design 中 EditText 光标颜色不跟随主题变化的问题

    在 Material Design 主题下,Android EditText 的光标颜色默认是蓝色的。然而,当我们改变主题风格时,光标颜色并不会跟随主题变化,导致与主题不搭配,给用户带来困扰。

    1 年前
  • CSS Reset 的设计思路与实现方法

    前言 在网页开发的过程中,我们经常遇到样式的不兼容问题。例如,不同浏览器对于某些属性的默认值不同,在不同设备上显示也会有所差异。解决这些问题有多种方法,其中一种就是使用 CSS Reset。

    1 年前
  • CSS Grid 布局与传统布局的对比

    CSS Grid 布局是一种用于网页布局的新技术,它支持更加灵活和复杂的布局操作,提供了更加优秀的视觉效果,可以极大地提升网页的用户体验。与传统布局相比,CSS Grid 布局具有许多优势。

    1 年前
  • React Redux 如何处理大数据量的展示

    React Redux 是一个基于 React 框架的状态管理工具,它可以帮助开发者更加方便地管理 React 应用的状态并增强应用的性能。然而,当应用需要处理大量的数据时,就需要一些优化手段来提高性...

    1 年前
  • 通过 AR 技术实现市区无障碍导览系统

    身为一个前端开发工程师,我们能够想象到如何通过 AR(增强现实)技术来构建市区无障碍导览系统。 无障碍导览在现代社会中已经很普遍,它是为了方便聋哑人士,视觉障碍者以及行动不便的人而存在的。

    1 年前
  • Babel 编译 react-native 项目时出现”Error: The package @babel/runtime@^7.15.0 does not satisfy its siblings'“怎么办?

    背景 Babel 是一款用于编译 JavaScript 代码的工具,它可以将你写的新版 JavaScript 代码转换成旧版 JavaScript 代码,以支持旧版本的浏览器或 Node.js 等环境...

    1 年前
  • Webpack Encore 学习笔记

    什么是 Webpack Encore? Webpack Encore是一个Web开发工具,它为您提供了使用先进的前端工具构建网站所需的工作流程和配置。Webpack Encore可以用于JavaScr...

    1 年前
  • 如何构建自己的 Web 服务器并启动多个 Node.js 进程

    在开发前端项目的过程中,我们经常会需要搭建自己的 Web 服务器来测试和调试我们的应用程序。而 Node.js 提供了强大的库和工具来构建和启动我们自己的 Web 服务器。

    1 年前
  • ECMAScript 2016: 如何使用函数参数解构?

    ECMAScript 2016: 如何使用函数参数解构? 前言 如果你是一名有经验的 JavaScript 开发者,那么你一定已经听过 ECMAScript 2016(又称 ES7)的函数参数解构特性...

    1 年前
  • PWA 开发常见错误及其修复方法

    PWA(Progressive Web App)是一种新型的 Web 应用程序开发模式,具有类似于原生应用的体验。PWA 应用程序可以被添加到主屏幕,离线时也可以运行。

    1 年前
  • RxJS debounceTime 方法在 Angular 应用中的实际应用

    RxJS debounceTime 方法在 Angular 应用中的实际应用 随着前端应用的复杂性越来越高,我们需要使用更高效的代码来解决问题,以提升用户体验和应用性能。

    1 年前
  • 如何使用 Express.js 实现 GitHub 登录

    GitHub 是全球最大的开源代码托管平台,有数百万的开发者在上面分享代码和协作开发。为了方便开发者登录和授权使用 GitHub,GitHub 提供了 OAuth2.0 授权登录机制,开发者可以使用现...

    1 年前
  • Sequelize 中的数据操作实践及技巧

    Sequelize 是一个 Node.js 中的 ORM(对象关系映射)框架,它能够方便地与多种数据库进行交互,包括 MySQL、PostgreSQL、SQLite 和 Microsoft SQL S...

    1 年前
  • Redis 如何解决由于内存碎片导致的内存溢出问题

    Redis 是一个流行的内存数据结构存储系统,被广泛用于缓存、消息队列、会话存储等应用。内存是 Redis 最重要的资源,但长时间运行后,Redis 可能会遭受内存碎片(Memory Fragment...

    1 年前
  • 如何使用 gulp 和 ESLint 来自动化代码格式化

    前端开发的过程中,一个人写代码生产效率是高的,但是在团队中,要想保持代码的规范性,必须对代码进行格式化。而代码格式化的过程往往需要花费开发者很多时间和精力,因此,我们需要使用自动化工具来降低这种负担。

    1 年前
  • 通过 Web Components 实现前端集成开发

    在现代的前端开发中,一个项目可能会包含多个模块或组件,而这些模块或组件往往需要实现相似的功能,如表格、弹框、轮播图等。如果每个模块或组件都是独立开发、独立维护的,对于开发效率和代码复用率都是很不利的。

    1 年前

相关推荐

    暂无文章