【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

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

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:204571

评论 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
回复
没有更多了
发现更多内容

Final Draft 12 for Mac激活版下载 剧本写作软件

影影绰绰一往直前

Butler for Mac v4.4.8激活版下载 Mac菜单栏快速启动工具

影影绰绰一往直前

Parallels Desktop 19 for mac完美破解版下载

影影绰绰一往直前

JavaScript 常见错误与异常处理

京东科技开发者

一分钟了解深度学习算法

小齐写代码

iCompta for Mac v6.1.11激活版下载(个人财物管理工具)

影影绰绰一往直前

Boxy SVG for Mac(矢量图编辑器) v4.21.0免激活版

影影绰绰一往直前

鼠标增强软件BetterMouse for Mac v1.5 (4424)中文激活版

影影绰绰一往直前

找软件开发公司做软件,三种付款比例,降低支付风险

软件开发-梦幻运营部

Java药物不良反应ADR智能监测系统源码

源码星辰

Java 源码 ADR智能监测系统

【第七在线】智能商品系统和ERP、BI系统的区别

第七在线

GreatSQL喊你来考证啦~

GreatSQL

揭秘阿里自研搜索引擎Havenask在线检索服务

阿里技术

搜索引擎 开源 搜索 Havenask 在线检索

软件测试开发/全日制/测试管理丨利用ChatGPT生成自动化测试脚本

测试人

软件测试 测试开发 ChatGPT

【大型模】模型型飞跃升级—文档图像识别领域迎来技术巨变

颜淡慕潇

ChatGPT OCR技术 垂直大模型 图像识别模型

Navicat Premium 15 mac(数据库开发软件)v15.0.30完美激活版

mac

苹果mac Windows软件 Navicat Premium 15 数据库开发软件

软件测试开发/全日制/测试管理/人工智能丨如何合理制定职业规划

测试人

软件测试

简单好用的思维导图推荐:simplemind最新中文版

mac大玩家j

思维导图软件 Mac软件推荐

康威定律:AI时代的IT组织变革

FinClip

智能商品系统如何协同其他系统共享数据和优化供应链决策?

第七在线

【推文】企业级AI问答知识库训练营,火热开营中!

阿里云大数据AI技术

专业的青否数字人系统源码!

青否数字人

数字人

AI数字人IP为企业创造无限商业价值!

青否数字人

数字人

这些常见的python编码习惯,你都会吗

华为云开发者联盟

Python 开发 华为云 华为云开发者联盟

不是每个企业都要数字化转型,但是每个企业都要进行数字化升级!

天津汇柏科技有限公司

数字化转型

记一次JSF异步调用引起的接口可用率降低

京东科技开发者

炸裂!「用嘴编程」的时代真的来了,席卷8000多家企业的Comate大升级

飞桨PaddlePaddle

人工智能 深度学习 编程语言

百度搜索exgraph图执行引擎设计与实践

百度Geek说

百度搜索 企业号 1 月 PK 榜 图执行 图执行引擎 DAG执行图

Mac电脑版文件启动器:Butler 激活最新版

胖墩儿不胖y

Mac软件 文件启动器

数字化时代下的数字化资产及其治理 |京东云技术团队

京东科技开发者

mybatisplus推荐用法

meacial

分层架构 设计原则 开发规范 MyBatisPlus

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