写点什么

用工作流方式构建应用

  • 2009-06-14
  • 本文字数:1984 字

    阅读完需:约 7 分钟

David Chappell 的新文章“工作流方式”开篇先讨论了编写优秀的服务器端软件有何意义:

每个编写代码的人都想构建优秀的软件。如果该软件是一个服务器应用,其优秀之处就是要伸缩良好、不用消耗太多资源就能处理大量负载。优秀的软件还应该尽可能地易于理解,无论是对创建者来说,还是对维护人员来说。同时实现这两个目标并非易事。有利于应用伸缩的设计往往会将应用拆分开,而把逻辑分散在各处会增大理解难度。反过来将逻辑统一到单一的执行单元又会使应用几乎不可能伸缩。

接着他开始讨论实现优秀服务器端软件的各种途径:

  • 最简单的方法是创建统一的应用,在一台机器的单一进程中运行。这种实现通常要实现如下内容: > - 维护状态,例子中用了简单的字符串变量来代表。

    • 从外界获取输入,比如从客户端接收请求。简单应用可以只从控制台读取信息,更常见的例子则可能是从 Web 浏览器接收 HTTP 请求,或从其它应用接收 SOAP 消息。
    • 向外界发送输出结果。根据应用的构建方式,应用可能会通过写到控制台或以其它方式经由 HTTP、SOAP 消息完成。
    • 使用 if/else 和 while 这些控制流语句,通过逻辑选择不同的执行路径。
    • 在应用的每个点上执行适当的代码来完成工作。

    这一简单的方法有几个优点: > - ……能以简单、统一的方式实现逻辑。这有助于处理代码的人理解逻辑,也能清楚表明事件允许的出现顺序。

    • ……处理应用的状态很简单。状态保存在进程的内存里,而且由于进程会在工作完成之前都持续运行,所以状态总是可用的。

    这一方法的局限是: > 在应用要等待(不论是来自控制台的用户、Web Services 客户端,还是其它什么地方的)输入的时候,应用通常都会阻塞。应用使用的线程和进程在输入到达之前会一直挂起,而不管等待了多久。由于线程和进程是相对稀缺的资源,考虑到它们只是等待输入,所以持有它们的应用就不会很好地伸缩。

  • 等待输入时关闭、输入到达时重启的应用。在这种情况下,应用包含的逻辑和前面的一样,但它现在被分成了不同的块。应用接收到客户端的第一个请求时,加载和执行合适的块。一旦处理完请求并送回响应,该块就可以卸载了——内存中不用保留任何内容。客户端的第二个请求到达时,再加载、执行处理该请求的块。这种实现通常用于 Web 应用,特定页面服务于具体请求,然后应用等待下一个请求。这种架构的优点是: > - 这种方法不会浪费资源,因为应用在不需要线程或进程的时候并不会占用它们。

    • ……让应用在不同的时间运行在不同的机器上的不同进程中。应用不会限定在单一系统……而是能在若干可用机器的任一台上执行。

    这些优势付出的代价是额外的复杂性: > - ……代码的各个块必须以某种方式共享状态。因为每个块都是按需加载、执行、关闭,状态必须存储在外部,比如在数据库里,或是其它持久化存储。

    • ……代码不再提供程序整体逻辑的统一视图……控制流并不明显。事实上,处理客户端第二个请求的代码块可能首先要检查第一个请求是否已经被处理完。对实现了任意一种重要业务流程的应用来说,理解并正确实现跨各个块的控制流很有挑战性。
  • 基于工作流的应用。基于工作流的应用所作的事情跟普通应用一样,包括维护状态、与外界交互、控制执行流、执行应用工作。不过在工作流里,所有的这些都由活动来完成。这些活动在功能上与典型程序的各个部分相符合。它不像传统程序一样用内置的语言元素协调活动的执行,而是有一个懂得如何运行活动的工作流运行时,负责协调工作流里活动的执行。这一架构的优点是: > - ……工作流方式给开发人员提供了统一的控制流。在简单的情况下,程序的主逻辑定义是非常连贯的。这让逻辑更容易理解……工作流本身描述了允许的控制流。

    • ……工作流不会在内存中挂起,不会阻塞线程,也不会在等待输入时耗尽进程。另一个优点是,工作流可以持久化,然后在另一台机器上再次加载。由于这个优点,工作流的不同部分可以运行在不同的系统上。

    David 所描述的工作流方法的其它优势还包括,并行工作的协调性、更高级别的重用(活动级别的重用)、流程执行的可视化 / 跟踪等。

David 文章的剩余部分描述了 Windows WF 实现的详细说明、使用场景,还有与其它.NET 技术(包括 WCF、Dublin、ASP.NET 等)的集成。他还简单说明了在.NET 4 中引入的 WF 的新特性。

尽管 David 的文章是从 Windows WF 的角度去谈如何构建工作流应用,但是按 Tom Baeyens 的话说:

……[文章] 解释了工作流和 BPM 引擎的本质……BPM 引擎在两个关键方面不同于 Java、C、Cobol 等普通程序: - 运行时状态是可持久化的。在进程执行过程中的任何时候,进程的执行都可以中断并存储。稍后可以从持久存储中取回执行状态并继续执行。

  • 图形化表示。BPM 流程与语言编写的普通程序不同的第二个方面是,BPM 流程都把方框、箭头等图形化表示作为目标。

对希望理解工作流引擎如何工作、哪些应用适合采用工作流的人来说,这是一篇很好的阅读材料。

查看英文原文: Building Applications, the Workflow Way

2009-06-14 23:273560
用户头像

发布了 151 篇内容, 共 68.3 次阅读, 收获喜欢 18 次。

关注

评论

发布
暂无评论
发现更多内容

Fastjson官方再次披露高危漏洞,包括rocketmq、jeecg-boot等近15%的github开源项目受影响

墨菲安全

安全 idea插件 Fastjson 依赖漏洞检测 墨菲安全

小区适合投放自助洗车机吗?

共享电单车厂家

自助洗车加盟 小区投放自助洗车机

十一、云原生网络微隔离

穿过生命散发芬芳

5月月更 微隔离

uniapp 如何将输入值转成大写

CRMEB

数据行业中的建模是什么?

清林情报分析师

数据分析 行业分析 数据建模 业务思维 模型思维

深入 HTTP/3(2)|不那么 Boring 的 SSL

SOFAStack

互联网 TLS HTTP3.0 QUIC协议 HTTP API

企业的文档管理策略

小炮

文档管理

PingCAP Clinic 服务:贯穿云上云下的 TiDB 集群诊断服务

PingCAP

大数据学习必备 | 推荐几个牛X 的 github 项目,助你事半功倍

大数据梦想家

大数据 学习资料 Github'

2021年证券类APP更新迭代监测专题分析(中)发布

易观分析

证券

MBTI 剧透人生,你的天选职业是什么?(免费测)

融云 RongCloud

云原生时代,热门监控工具对比与使用场景分析

云智慧AIOps社区

云原生 监控 Grafana Prometheus 监控宝

智能汽车领域的开源软件供应链安全检测工具分享

墨菲安全

idea插件 工具分享 开源安全 墨菲安全 软件供应链

没有店面店铺可以做自助洗车吗?

共享电单车厂家

自助洗车加盟 自助洗车店面

6月月更“粽”头戏,大家一起来参与吧!

InfoQ写作社区官方

热门活动 6月月更

7 款最棒的开源 React UI 库测评 - 特别针对国内使用场景推荐

蒋川

JavaScript react.js 开源 UI 组件库

「v2.4」千呼万唤的图形化编排,来了!

Jianmu

持续集成 低代码 开发工具 开源项目 节点编排

模块二

Geek_2ce415

避免惊群以及负载均衡的原理与具体实现

C++后台开发

nginx 负载均衡 后端开发 C++后台开发 惊群

末流985,秋招斩获多家大厂offer 经验分享

大数据梦想家

面经分享 大数据开发

自助手动洗车设备洗车怎么样?

共享电单车厂家

自助洗车加盟 自助洗车机洗车 自助手动洗车设备

是开自助洗车店还是传统洗车店好?

共享电单车厂家

自助洗车加盟 开自助洗车店 传统洗车店

英特尔开源项目推动SYCL标准采用,打破单个厂商封闭生态系统

科技之家

百度智能小程序巡检调度方案演进之路

百度Geek说

TiDB 查询优化及调优系列(四)查询执行计划的调整及优化原理

PingCAP

eKuiper 1.5.0发布:实现无缝式工业数据采集+边缘流处理

EMQ映云科技

物联网 IoT emq 开源之夏 5月月更

YARN Federation技术解析及应用

移动云大数据

YARN

如何用Apifox 发送接口请求?

Liam

开发者 测试 后端 开发 Postman

平衡人工智能的性能要求,实现可信AI在银行业务场景的高质量应用

易观分析

人工智能

为什么穷人越穷,富人越富?

大数据梦想家

程序人生

用工作流方式构建应用_SOA_Boris Lublinsky_InfoQ精选文章