写点什么

在现代化架构中,如何处理长时间运行的流程

作者:Bernd Ruecker

  • 2024-08-11
    北京
  • 本文字数:4419 字

    阅读完需:约 14 分钟

在现代化架构中,如何处理长时间运行的流程

随着系统分布式程度的不断加强,我们需要解决远程通信和潜在的对等不可用的问题,挑战也就随之而来。我在 QCon London 2024 上的演讲深入探讨了流程编排器如何驾驭这些复杂性。本文介绍了我在研究中所讨论的概念。


借助订购披萨来了解长时间运行的流程


我们以电话订购披萨为例,这是一种同步阻塞式的通信:呼叫人会被阻塞,直到接听者进行应答,它允许进行直接反馈,但是,这要求双方同时都是可用的。另外一种可选方案是采用电子邮件,它是异步和非阻塞的:发送方不会被阻塞,“消息”处于排队状态,这具有一定的灵活性,但缺乏实时的反馈。当然,你可以通过再发一封电子邮件的方式提供反馈。


更为重要的是,通信反馈循环(“我们收到了你的订单”)并不是交互想要的预期结果。你饿了,所以你实际想要达到的效果是披萨送到了你的家门口。但这需要时间,因为披萨需要在烤箱里面烤一会儿。在这里,你可以看到,无论采用哪种交流方式,订购披萨都是一项需要长时间运行的任务,存在固有的延迟。


需要注意的是,长时间运行的流程指的是等待行为,而不是长时间运行的算法。这种等待可能是由于人工操作(比如批准或决策)、外部响应(比如消费者反馈)或故意让时间流逝(比如,在我们的样例中,位于烤箱中的披萨)。这些过程可能需要数小时、数天、数周,甚至更长的时间(但愿你的比萨不会这样)。


与之不同的是,在一家小面包店点咖啡是一种与结果同步的阻塞式交互。在制作咖啡的过程中,顾客和柜员都不能做任何其他的事情。对于单次点餐来说,这可能没有什么问题,但是对于点多杯咖啡的顾客来讲,等待时间过长会导致体验不佳,而且这还会阻碍面包店处理其他小额的订单。虽然与某些任务相比,制作咖啡相对比较快,但是这种交互的同步性限制了其可扩展性,并降低了用户体验。



Gregor Hohpe 在 “星巴克不使用两阶段提交” 一文中描述了星巴克如何通过将订购流程(异步和阻塞的,以反馈循环作为结束)与咖啡准备(异步,以最终结果作为结束)分离开来以扩展咖啡制作功能。这使得咖啡师可以独立扩展,并且有可能使用基于 App 的系统来取代订单流程,从而提高效率,改善用户体验。


这种模式的第一步是同步的,而涉及等待的长时间流程则是异步的,在很多场景中这都是很典型的情况。


等待所带来的挑战


等待会带来一定的挑战性,因为我们需要记住自己正在等待,这需要一个持久化的状态。而这产生了后续的需求,比如,了解我们正在等待什么、对过长时间的等待进行处理升级、对长时间运行的流程进行版本化管理,以及如何处理大规模的需求。我们面临的挑战在于,如何在解决这些问题的同时,又不引入预料之外的复杂性。



在过去的几年间,我见过了太多自制的工作流引擎。最开始,这些引擎往往很简单,只需在数据库中设置一个状态标记并实现一个等待机制即可。但是,它们很快就变为带有调度器、处理升级和其他特性的复杂系统,从而产生低效且难以维护的解决方案。所以,我们应该使用现有的工具来解决这个问题。


但是,我需要在此说明一下。在我的职业生涯中,我积极推动了多个开源工作流引擎项目的开发,并共同创建了一家专注于流程编排的公司 Camunda。因此,我当然对工作流引擎有一定的偏好。


我相信工作流引擎(现在越来越倾向于将其称为编排或流程引擎)能够有效解决长期运行的流程所面临的挑战。通过定义工作流模型(蓝图)并能够执行可长时间运行的实例,这些引擎从本质上解决了等待所带来的挑战。



我们来看一个样例,它是一个简单的入职流程。入职流程在各行各业中都非常普遍,例如,你可能需要新开一个银行账户、购买新的保险或签订新的手机合同。你可以使用业务流程建模标注(Business Process Model and Notation,BPMN) 将流程可视化,BPMN 是定义流程图形化的 ISO 标准。这个流程涉及多个步骤,如客户评分和订单批准,这些步骤可能是自动完成的,也可能需要手动处理。



在 GitHub 上的这个样例中,我们使用一个 Java Spring Boot 应用程序连接到工作流引擎、部署流程并提供 Web UI 供用户交互。UI 会通过触发应用程序中的 REST 调用,在工作流引擎中启动一个流程实例。我们可以通过 UI 或其他集成方法对该实例进行监控和处理升级,并将任务分配给人工处理。


流程会继续处理,使用自定义代码或预置连接器执行相关操作,比如在 CRM 系统中创建用户或发送欢迎邮件。


现代工作流引擎还能处理 大规模的高容量流程,在地理位置分散的数据中心每秒可以处理数千个实例。因此,这项技术并不局限于小规模的应用场景,还可以用于大规模运营中的核心业务流程。


服务何时需要等待?(技术原因)


我们回到分布式系统上来,除了业务原因需要等待外,还有一些技术方面的原因,比如,异步通信延迟、消息投递失败以及分布式系统中的对等服务不可用等。如果不加以解决,这些问题可能会导致级联故障。


举例来说,不久前我在尝试办理登机手续时遇到了一个错误,导致我无法收到登机牌。多次尝试均以失败告终,我不得不创建了一个日历提醒,以便于稍后再试。这其实就阐述了有状态重试的概念,即由于临时的问题(比如,航空公司的条形码生成系统故障)导致的延迟重试。这个问题也彰显了分布式系统所面临的挑战,即组件故障是不可避免的。韧性设计可以隔离此类故障,防止它们影响整个系统,给用户带来不便。



改进后的系统设计会确认收到登机申请,同时独立解决登机牌的问题,要么承诺及时交付,要么建议使用应用程序等替代方案。这种方式可以提供更好的用户体验,并明确定义系统内的责任。但是,这种方式需要在登机服务中提供长时间运行流程的能力,以管理登机牌的延迟交付。由于需要在无状态的系统中进行状态管理,许多团队都避免出现这种情况。虽然客户习惯于即时响应,但是与需要用户进行干预的同步错误消息相比,具备清晰沟通交流的延迟结果往往是更为理想的用户体验。



我们将航班预定样例的功能扩展到收款和付款,由于依赖信用卡处理器等外部服务,这引入了更多的复杂性。这些服务可能暂时无法使用,从而导致延迟或失败。远程调用中的异常信息也可能词不达意,难以确定付款是否成功。在这种情况下,重试可能导致重复收费。工作流引擎可以通过检查付款状态并在必要的时候进行退款来帮助管理这些情况。不过,仔细考虑各种情况,并为特定场景选择最合适的解决方案依然至关重要。强大的工作流语言(如 BPMN)和图形可视化技术对于建立良好的解决方案至关重要,这便于和不同的利益相关者讨论各种方案。


在我们开始处理分布式系统的复杂性和长时间运行的流程时,就必须在 API 设计中采用异步通信了。虽然支付通常非常快捷和简单,但是假如遇到信用卡支付遭拒或服务不可用的情况,就需要采用不同的方式了。我们可以通过设计能够处理即时和延迟响应的系统,并使用 202 HTTP 代码等信号表示处理将在后台继续进行,来构建适应性更强、更健壮的支付系统。


这样,我们能够改善错误处理和恢复机制,并能更灵活地执行复杂的需求,比如,异步扣除用户的信用额度和信用卡扣款。



长时间运行能力对服务边界的重要性


设计健壮的服务需要在架构中包含长时间运行的功能。例如,当预定服务要求支付服务进行付款时,可能会出现信用卡拒付的情况。要解决这种问题,比如允许顾客更新其信用卡的详细信息,往往需要长时间运行的流程来管理交互和付款重试。虽然有些服务倾向于采用无状态模式,并避免这种复杂性,但是采用长时间运行的功能能够提供更好的解决方案,从而实现更全面的错误处理和恢复机制。


这个样例还重点强调了领域概念泄露的问题。预定服务不需要了解信用卡或特定的支付方法。通过将这些问题隔离在支付服务中,设计会更加整洁,也更能适应未来的变更。但是,这要求支付服务来处理支付重试以及客户交互相关的长时间运行流程。为开发团队提供简化这一流程的工具和框架至关重要。



有时候,人们认为工作流编排会导致单体的系统。但实际上,情况恰恰相反。通过在单个微服务中启用长时间运行的功能,我们可以更好地分配责任,避免创建过于臃肿的服务来集中复杂的逻辑。这种方式能够促成更具模块化和可维护性的架构,避免单体化的倾向。


成功引入流程编排


长时间运行的功能对于良好的服务设计和异步、非阻塞的操作至关重要。为了让整个企业的工程师都能使用这些功能,我们需要提供中心化的流程编排,最好是将其作为一种(自)服务。许多使用流程编排的组织都有一个专门的团队,通常被称为卓越中心(Center of Excellence,CoE),这样的团队致力于帮助他人构建解决方案,而不是直接创建解决方案。这种方式避免了以往中心化 BPM 模型的弊端,为团队提供了实施高效流程编排所需的技术和支持。


许多组织希望获得团队的自主权,避免过多的限制,因此对卓越中心这样的集中式团队望而却步。但是,团队拓扑模型提供了一个令人信服的理由来反驳这些想法。这种模式强调不同的团队类型,以实现最高的效率:产品导向(stream-aligned)团队专注于提供业务价值,赋能(enabling)团队提供咨询,平台团队提供必要的技术。专注于流程编排和和自动化的 CoE 通过提供技术和支持,将产品导向团队解放出来,使其能够专注于提供价值,这很好地适应了这种模式。该方法能够避免让每个团队独立探索技术栈的弊端,从而加快价值交付速度。


Spotify 的“Golden Path”方法就是一个很好的行业范例,它为不同类型的项目(如面向客户的 web 应用程序或长时间运行的工作流)提供了 预定义的解决方案。这些 Golden Paths 是为开发团队所设计的,易于使用且很具吸引力,但并不是强制性的。这样既能鼓励标准化和提升效率,又能保持自主性。其目标是摆脱“流言驱动的开发”,在整个组织范围内整合有效的技术。Spotify 发现,过多的权力下放拖慢了他们的速度,而“Golden Paths”有助于在自治性和效率之间保持平衡。



再举一个样例,Twilio 使用了名为“paved path”的概念来简化和规范开发流程。这包括创建团队可以轻松使用和实施的预制服务,降低搭建基础设施的复杂性,让团队更加关注于业务逻辑。


BPMN 是一个图形化的模型,是定义流程的 ISO 标准,这种图形化的模型为可视化和实现复杂的工作流提供了一种强大的方法。它们是活生生的文档,代表了运行中的代码,而不仅仅是需求。这些模型可用于各种目的,如测试用例、运维监控以及与利益相关者交流。在与利益相关者讨论长时间运行的行为时,这些模型的可视化就显得尤为重要,可以帮助他们理解异步操作背后的原理以及客户交互过程中可能发生的变化。采用图形化的模型能够让组织有效地利用现代化架构,并改善技术团队和非技术团队之间的协作。



结论


总而言之,鉴于各个方面的原因,长时间运行的能力是至关重要的。流程编排平台和工作流引擎提供了宝贵的技术,有助于设计更好的服务边界、以更低的复杂性快速实施以及更轻松地采用异步通信。这将带来卓越的用户体验、更高的运维效率、更好的自动化、更低的风险以及更优的合规性。强烈建议成立一个中心化的赋能团队,以便在整个组织内成功采用这项技术。


原文链接:

https://www.infoq.com/articles/mastering-long-running-processes/


2024-08-11 08:0013256

评论 1 条评论

发布
用户头像
架构治理受到越来越多企业重视,但开展中面临的挑战很多,如何在快速发展的业务需求和技术变更中保持架构的稳定性和一致性,成为不少团队的难题。 欢迎点击了解,通过迪今科技架构治理工具,来实现架构治理全生命周期管理。
2024-12-20 18:02 · 广东
回复
没有更多了
发现更多内容

征文丨TiDB 社区专栏第一届征文大赛,快来一次性集齐所有周边吧!

PingCAP

在 Manjaro 上安装 Chrome

信号量

chrome Linux

2022年济南正规等保测评公司名单(排名不分先后)

行云管家

等保 等保测评 等保2.0 济南

OceanBase 存储引擎详解

OceanBase 数据库

netty系列之:java中的base64编码器

程序那些事

Java 程序那些事 3月月更

2022 年值得关注的 9 个最新 Java 趋势

Ethereal

Web 键盘输入法应用开发指南(9)—— 标准与实现

天择

JavaScript 键盘 输入法 3月月更

并发异步编程之争:协程(asyncio)到底需不需要加锁?(线程/协程安全/挂起/主动切换)Python3

刘悦的技术博客

多线程 协程 Python3 协程原理

鸿蒙开发必备书籍【收藏】

坚果

鸿蒙 3月月更

OceanBase 在线体验环境,现已上线!

OceanBase 数据库

一站式运维管理工具平台 OCP 到底有多好用,看这篇文章就够了!

OceanBase 数据库

两小时,掌握四个数字化工具!

明道云

零基础学编程?从这本豆瓣评分9.2的入门级神作开始

图灵社区

Python 零基础

电科申泰加入龙蜥社区并成为理事单位,共创基础软硬件生态新未来

OpenAnolis小助手

开源 理事单位 申威 软硬件

如何使用 Checkmk 监控 SSL TLS 证书?

Ethereal

私有云与公有云,哪种云模型最适合企业的需求

Ethereal

数据对接 - 大屏云极简使用手册

shulinwu

可视化 数据可视化 大屏可视化 数据可视化控件 大屏

HSC推出「万物生长计划」 赋能虎符交易所HOO新应用场景

区块链前沿News

Hoo 虎符交易所 虎符智能链

Meetup预告| AIOps指标相关算法体系分享

云智慧AIOps社区

机器学习 大数据 算法 AIOPS 智能运维

ZEGO 自研客户端配置管理系统 —— 云控

ZEGO即构

后台开发 客户端配置 音视频架构

周边生态|StreamNative 联合 Cloudera 开源 Apache Pulsar+Apache NiFi 集成处理器

Apache Pulsar

cloudera 开源 架构 云原生 Apache Pulsar

Rust类型

Shine

读书笔记 rust

这门面向应用开发者的 TiDB 使用教程,TiDB SQL、Connector API、架构体系…你一定不能错过!

PingCAP

数字化时代,如何做好用户体验与应用性能管理

云智慧AIOps社区

监控宝 监控工具 自动化运维 数字化经济

大数据培训hive数仓存储格式详解

@零度

hive 大数据开发

【C语言】三子棋游戏与多子棋 (保姆级的实现过程)

謓泽

3月月更

【三级等保】三级等保服务费用一年大概要多少?一年需要测评一次嘛?

行云管家

网络安全 等保 等级保护 三级等保

抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现

bin的技术小屋

中间件 池化技术 java netty 内存池

Map-Reduce 思想在 ABAP 编程中的一个实际应用案例

汪子熙

mapreduce abap CRM系统 企业级应用 3月月更

企业帮助中心的搭建步骤

小炮

帮助中心

资产管理系统开发解决方案

低代码小观

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

在现代化架构中,如何处理长时间运行的流程_架构_InfoQ精选文章