最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

微进程:微服务中后台作业的一种新架构设计模式

juanjolainez

  • 2021-06-28
  • 本文字数:3764 字

    阅读完需:约 12 分钟

微进程:微服务中后台作业的一种新架构设计模式

本文最初发布于 Medium 网站,经原作者授权由 InfoQ 中文站翻译并分享。

 

实现微服务时,后台进程是最容易被忽略的元素,而绝大多数应用程序都需要后台进程。

 

微服务领域的大多数参考书目都着重于如何拆分单体、领域驱动设计、编排与同步、如何拆分数据库等。但人们往往不会提到后台进程,以及如何在微服务架构环境中实现它们。

 

关于这一点,我会推荐 Sam Newman 的《构建微服务》和《从单体到微服务》两本书,其中涵盖了上面的几乎所有内容,当然只有后台作业除外。

背景概况

介绍下我们的背景概况。在 CreditorWatch,我们目前实现了几个微服务,每个微服务负责一个数据(域)。

 

我们的后台进程不仅限于用户交互触发的操作(在这种情况下,我们将引发一个事件,该事件将通过我们的事件驱动架构等部分,相当标准的设计)。实际上很多(大多数)后台任务都是计划任务,并负责数据提取、数据更新、电子邮件等事项。

 

就规模而言,在 CreditorWatch,我们每个月大约有 4000 万个微进程。

 

其中许多进程非常冗长且笨重(其中一些进程可能需要长达一周的时间才能完成),例如在我们的 OLTP 系统中计算澳大利亚所有公司的所有信用评分的进程。在 CreditorWatch,我们有一个非常高效的 CI/CD 管道,每天可以触发多次部署,并且我们为微服务使用了 Docker 容器。

 

这基本上就是我们拥有的基础架构以及需要解决的问题。

 

理想情况下,我们不希望有哪个盒子,就因为它正在运行一个长期进程就无法更新,因此解决方案需要考虑到这一点,并将尝试解决这个问题。

微进程模式

 

在这篇短文中,我们将尝试解释微进程模式(我们根据微服务和后台进程这两个词创造了这个术语),以及如何使用 AWS 服务成功实现微进程模式。我们把它叫做一种设计模式,是因为它是针对一个常见问题(在微服务架构中实现较长的后台进程)的可靠解决方案(我们已经成功实现了多次)。

 

微进程处理过程主要是将非常大的任务(1 个进程)划分为一些较小的任务(微进程),然后使用我们的微服务逻辑和架构处理它们。

 

这个概念并不是什么新鲜事物,并已在其他领域广泛使用(BigData 集群中的 MapReduce,或分治算法),但这种方法将相同的技术应用于微服务架构,给我们带来了很多好处,而缺点却很少。

 

要实现这种方法,我们有 1 个进程(可以是计划或手动触发),其唯一的工作就是收集并触发所有需要处理的作业。请注意,此进程实际上不会处理任何需要实现的最终结果(在我们之前的示例中,最终结果指的是计算所有澳大利亚公司的所有信用评分)。只需排队一个作业就可以更新每家公司的信用评分

 

这明显要比计算所有信用分数要快,因为分成多个的微进程只需要花费几分钟就能算出分数,而计算所有信用分数则需要几天时间。在我们的案例中,计算一个信用评分平均需要半秒(我们如何做到以如此快的速度来处理我们这么大规模的数据量,可以另开一篇文章详细讲解了),因此考虑到我们的数据库中有近 1900 万家公司,单个进程完成整个计算大约需要 100 天。鉴于我们每个月都要这样做,因此一个单独的进程是不可行的。

 

很多时候,划分任务的进程非常轻巧,我们可以在一个 lambda 函数中实现它(请注意 lambda 函数的处理时间限制为 15 分钟),这样我们就不必担心服务器或虚拟机中的 crontab 配置。

 

此时,我们的队列中有很多(也许是数百万个)小任务等待处理,因此“真正的工作”尚未完成。

 

当然,一旦你将所有作业都排在队列中,就有许多方法可以并行执行作业。

 

传统上,我们可能会有一个带有监督者(或类似对象)的盒子,让多个进程从队列中提取消息,但这意味着我们会有一个盒子不断地运行代码以提取消息和代码等待处理,这就属于微服务了。

 

即使这种方法(和其他使用相同微服务代码的方法,以及在同一环境中从队列中提取消息的代码)是有效且可行的,我们还是发现有两种不同的环境(具有后台进程和用于实时流量的 docker 容器的虚拟或物理服务器)会带来很多开销。

 

在某些配置中(例如一个虚拟盒子),如果我们要部署,将需要停止监督并等待进程完成,然后再用新代码启动一个新的并销毁前一个,这将大大增加部署的复杂程度,因为我们需要跟踪所有后台进程。

 

另外,我们不得不想出两种不同的方式来监视我们的应用程序(后台进程和活动端点),确保我们的日志记录器能够正确跟踪两个不同环境中的所有日志,并确保两处的依赖都正确无误,等等。

 

请注意,我甚至没有提到有两个不同的代码库负责计算信用评分,一个代码库用于后台进程,另一个代码库用于微服务,所以还得考虑那些不能出现代码复制的禁区。

 

理想情况下,我们希望:

  • 不要重复代码

  • 没有多个(需要测试)的系统配置

  • 能够监控我们后台进程的健康状况和进度

  • 缩放(例如,在工作时间以外更快地处理)

  • 能够快速部署并尽快使用最新版本的代码

  • 部署简单且维护成本低廉

 

我们提出的用于处理微进程的解决方案是微服务架构的原生方案。我们利用 SQS+Lambda 创建了一个推送队列,并调用一个微服务端点来执行微进程的任务。

 

我们在这里更具体地讨论了SQS+lambda方法

微进程模式架构

 

这里仅包含以下三个元素:

  • 一个进程将大进程分成多个很小的微进程

  • 推送队列(在我们的示例中使用 SQS+Lambda 函数实现)

  • 嵌入微服务的端点

 

我们实现了我们想要的大部分目标。

 

我们实现了:

  • 不要重复代码(所有代码都驻留在微服务代码库中)

  • 没有多个需要我们测试的系统配置(我们只有微服务基础架构)

  • 能够监视我们后台进程的健康状况和进度(我们可以全程看到队列中有多少待处理消息)

  • 缩放(在实现 lambda 函数时,我们可以按需缩放,更多信息请参见这里

  • 能够快速部署并(通过当前的部署)尽快使用最新版本的代码

  • 部署简单且维护成本低(我们像往常一样部署,不需要额外的开销)

 

但是,这一解决方案也有其缺点:

  • 微进程限制为 15 分钟(如果使用 Lambda 的话)

  • 实时流量和来自后台作业,到同一基础架构的流量会混淆监视并影响实时流量(后文会列出解决方案)

  • 也许进程无法分割,所以这种方法无济于事

 

微进程的进程可能比实时流量慢,并且我们要确保可以正确监控两种进程的健康状态。

 

为了避免混淆监控,并避免微进程可能对实时流量产生的影响(它会消耗实时流量所需的资源,例如内存、每个容器的最大进程等),我们在另一个子域下构建了一个克隆基础架构(相同的 docker 容器映像)。

 

在我们的案例中,对于信用评分示例,我们有:

 

scores-live.domain.com

score-queue.domain.com.au

 

后台作业将指向 creditscore-queue-service.creditorwatch.com.au,而实时流量将指向 creditscore-service.creditorwatch.com.au。

 

通过这一小小的调整,我们可以按需只缩放实时流量(或后台进程)的容量,而又不影响另一方,并且可以更有效地进行监控,因为我们可以轻松地按主机过滤。

映射搞定了,但 reduce 在哪里?

先前的进程涵盖了我们大进程中的所有小部分,但是如何将它们粘合在一起呢?

 

继续看前文的示例,后台进程的目标是获取包含我们所有公司的所有信用评分的报告,并将其通过电子邮件发送给数据科学团队,以便他们进行统计。

 

当处理并发进程时,这是软件工程中一个非常著名的问题,并且它有很多解决方案(囚徒问题是并发的经典问题,如果你想编写一个监视器模式,则它是一个很好的练习)。我们会只使用已经讨论过的解决方案提出一个简单的方案。

 

启动所有进程时,我们将在数据库中创建一条记录。该进程将有一个进程 ID。这将是父 ID 进程。对于其余的部分,我们还将创建一条记录,并使用其自己的进程 ID 和对父记录的引用。该记录将具有该进程的结果(在本例中为信用评分)。请注意,你可能需要存储大量信息(实际上,我们有一个进程存储一个文本文件,该文件需要合并到其他文件中以完成整个任务)。在这种情况下,你可以放入一个文件管理器(已挂载的卷、S3 文件夹等),并存储对它的引用。

 

现在,当子进程运行并完成时,它需要通知父进程,后者将检查所有其他进程是否已完成。如果完成,它将运行任务将所有信用评分存储在文件中,然后发送电子邮件。

 

当然,有不同的方法来通知父进程。在上面的示例中,使用现有的架构似乎是合理的,该架构是将作业排队,然后使用一个推送队列在微服务中执行代码以评估一切是否完成,如果完成,则收集结果并发送电子邮件。

 

提醒一下:在处理并发进程时,请确保锁定正在使用的表,以确保进程互斥。否则,你会遇到一些麻烦事。

小结

长时间运行的后台进程可能很难在微服务架构中实现,并且会带来一些挑战,因此,为了克服这些挑战,我们创建了一种称为微进程的新设计模式。

 

微进程模式包括:

  • 创建一个将长时间运行的进程划分为很多较小的微进程的进程

  • 将所有微进程排入推送队列

  • 将消息转发到你的微服务进行处理

  • 使用现有的 APM 工具和日志进行监视

 

推送队列和 lambda 函数可能会让人头疼,因此这里推荐大家阅读一些相关文章,这样你就能事先了解所有所需的信息。

 

https://medium.com/creditorwatch/how-to-successfully-create-a-push-queue-using-sqs-lambda-57f299056fe7

 

https://medium.com/creditorwatch/aws-lambda-facts-you-wish-to-know-before-processing-2-billion-lambda-executions-2021-78fe77183c80

 

希望你满意,有任何问题或建议都可以联系我们!我会很高兴与大家交流的!

 

原文链接:https://medium.com/creditorwatch/microprocesses-a-new-architectural-design-pattern-for-background-jobs-on-a-microservice-172a8a19ba8f

2021-06-28 12:204565

评论 5 条评论

发布
用户头像
spark是否可以解决这类问题,看完没太理解微进程面向的问题及解决方案的核心能力
2021-07-05 13:08
回复
用户头像
和wasm提出的微进程概念一样,因为aws的lambda也是支持wasm。微进程的概念有点类似线程,但文章没有指出微进程和线程的差异,毕竟线程也达到类似微进程的效果,但缺点就是不支持异构应用。wasm的微进程可以同时把c/c++、go、rust编写的异构应用放在同一个进程执行,这是线程缺乏的能力。
2021-06-29 09:41
回复
异构应用在同一个进程运行 是什么原理呢请问?
2021-06-29 22:42
回复
编译前是异构,编译后都是wasm字节码
2021-06-30 17:09
回复
没有更多了
发现更多内容

全国首个!OceanBase 助力江西省养老保险全国统筹信息系统上线

OceanBase 数据库

OceanBase 开源 OceanBase 社区版 核心系统

CRM系统为什么被认为是企业的重要资产?

低代码小观

企业管理 资产管理 CRM 企业管理系统 CRM系统

硬核化解ISV四大痛点,华为云智联生活行业加速器助力伙伴实现商业成功

华为云开发者联盟

华为云 HarmonyOS 智联生活 华为云IoTDA 云云协同

谁编写了区块链的规则?

CECBC

2022年购买服务器运维管理软件选择哪家好?

行云管家

IT运维 服务器运维

COSCL开源评选名单公布!OceanBase 社区版荣获2021优秀开源项目奖

OceanBase 数据库

OceanBase 开源 OceanBase 社区版

Veritas:2022年数据安全及合规领域行业预测

WorkPlus

你设备中的木马藏在哪里?为什么查杀困难?

喀拉峻

黑客 网络安全 安全 信息安全 木马病毒

DTC 2021 | 一体化架构的原生分布式数据库正在成为核心系统首选

OceanBase 数据库

数据库 OceanBase 开源 OceanBase 社区版

HTTPDNS 快速入门

37手游iOS技术运营团队

DNS httpdns

Xcode 配置多套 App 图标的方法 --- AppStore 图标 A/B Test 实践

37手游iOS技术运营团队

ios xcode appstore 产品页优化 自定产品页

回顾2021,展望2022 | TDengine一年“成绩”汇总

TDengine

数据库 tdengine 2021年终总结

大型购物平台的系统设计与架构

恒生LIGHT云社区

平台搭建 构架 平台架构

OceanBase 通过工信部电子标准院首批开源项目成熟度评估

OceanBase 数据库

数据库 工信部 OceanBase 开源

云堡垒机和普通堡垒机的三大区别分析-行云管家

行云管家

云计算 网络安全 数据安全 堡垒机 云堡垒机

SpringMVC框架基础知识(01)

海拥(haiyong.site)

28天写作 12月日更

OpenMLDB 12月会议纪要

第四范式开发者社区

人工智能 机器学习 第四范式 OpenMLDB

腾讯云数据库2021年成绩单,请检阅!

腾讯云数据库

tdsql 国产数据库

当MySQL执行XA事务时遭遇崩溃,且看华为云如何保障数据一致性

华为云开发者联盟

MySQL 华为云

《国产分布式数据库选型及满意度调查报告》出炉,OceanBase获得双料第一

OceanBase 数据库

分布式数据库 OceanBase 开源 OceanBase 社区版

盘点 2021|一个新的开始

IT蜗壳-Tango

28天写作 12月日更 盘点2021 盘点 2021

重塑企业创新方式 Serverless让云“开箱即用”

WorkPlus

“千言”开源数据集项目全面升级:数据驱动AI技术进步

百度开发者中心

千言

数字化转型失败,有哪些原因?

禅道项目管理

数字化转型

区块链赋能生猪养殖,让“猪”事有迹可循

CECBC

MongoDB基本介绍与安装(1)

Tom弹架构

Java mongodb

2021MongoDB技术实践与应用案例征集活动获奖通知

MongoDB中文社区

2021年末总结

编号94530

工作 架构设计 心得 2021 项目经验

性能提升40%!阿里云神龙大数据加速引擎获TPCx-BB世界排名第一

阿里云弹性计算

阿里云 神龙

iOS 编译器__Attribute__的入门指南

37手游iOS技术运营团队

xcode LLVM Clang编译 Clang Attribute

探索SaaS产业发展新机遇|鲁班会贵安首秀圆满收官

华为云开发者联盟

SaaS 华为云 应用构建

微进程:微服务中后台作业的一种新架构设计模式_语言 & 开发_InfoQ精选文章