REDACLE 工作流程管理系统
亚原子粒子是非常微小的物体,需要通过巨大的探测器来揭示和测量。这个领域被称为高能物理 (HEP),而实验性高能物理是一门前沿科学。它使用并推广最新的技术,发明新的工具,并鼓励知识交流。由于所有这些原因,长期以来,高能物理一直是开源软件的领域。
坏消息是高能物理变得越来越复杂;昨天以手工方式构建的东西现在已成为工业流程,需要专用的管理软件,通常价格昂贵。我们正在我们的实验中经历这种情况:一个大型国际合作项目,致力于建造一个 12,500 吨的探测器,称为 CMS(紧凑型缪子螺线管),计划于 2007 年在日内瓦 CERN 的大型强子对撞机上采集数据。我们在罗马的小组,由意大利国家核物理研究所 (INFN) 资助,位于罗马大学 La Sapienza 的物理系,正在从事电磁量热器的建造工作。量热器由大约 500,000 个零件组成,包括闪烁晶体和光电探测器。这个过程需要数据管理、质量控制和记录,所有这些都依赖于工作流程管理。
工作流程管理系统 (WFMS) 是“使业务流程的全部或部分自动化成为可能的软件,在此过程中,文档、信息或任务根据一组程序规则从一个参与者传递到另一个参与者以采取行动”(www.e-workflow.org)。使用 WFMS 允许协调员建立实现产品所需的操作流程。操作员在构建序列中得到指导,并避免了序列中不可预见的偏差。每个操作都会生成数据,例如测量值、注释和标签,这些数据记录在数据库中。
最初,我们在生产中使用了基于专有组件的 WFMS 大约两年。事实证明,它笨拙、缓慢、资源需求高、挂起后难以恢复,并且与其他工具集成很麻烦。当传入量热器零件的流量变得更高,而组装速度无法跟上时,我们决定开发我们自己的解决方案,基于开源组件。我们的要求是避免以前的低效率,与输入和输出数据透明地接口,并拥有灵活的解决方案。我们选择实施基于 LAMP(Linux、Apache、MySQL 和 Perl/PHP/Python)平台的系统。LAMP 的每个组件都发挥着重要作用:Linux 和 Apache 为服务和编程提供基本基础设施;MySQL 是我们 WFMS 的后端;而 Perl/PHP 管理操作员数据库的交互。
我们的 WFMS 被称为 REDACLE(Construction LEvel 的关系型 ECAL 数据库)。更详细地说,我们对数据库设计的要求是
高灵活性:在添加新产品或活动时,数据库结构不应更改。
存储质量控制 (QC) 数据的能力:质量保证是我们工作的重要组成部分,收集的数据必须可供所有人进行统计分析。
多种访问方式:数据库应该能够通过不同的方法进行查询,包括 shell、程序、脚本和 Web。
MySQL 自动满足了要求 3,并且这个事实,加上它的简单性和完整性,是我们采用 LAMP 的主要原因。为了满足前两个要求,我们开发了一组遵循模式的表,这是一种解决给定问题的常见和标准方法,就像在 OO 编程中一样。我们使用了称为同态的模式,它是多对一关系的简单表示。实际上,我们在数据库中将我们正在处理的特定过程的每个部分表示为两个表中的记录:对象表和对象定义表。每个对象定义都有一个 ID,实际上是一个 MySQL 主键编号。许多对象共享相同的对象定义,它们之间的关系由对象表中的外键提供,其中包含相应的定义 ID。
一个例子可能会更好地解释这种设计。正如引言中所述,我们的量热器由许多不同类型的零件组成。每种零件,例如晶体,都有许多实例。整个量热器大约有 75,000 个晶体。零件和零件定义保存在两个单独的数据库表中,如表 1 和表 2 所示。零件的不同实例通过 partDefinition 表中适当的 part ID 在 partDefinition_id 列中共享相同的零件定义。在这两个表中,零件 33105000006306 是 1L 桶形晶体,如其在 partDefinition 表中找到的 partDefinition_id 195 所示。
表 1. REDACLE 中的零件表
ID | partDefinition_id |
---|---|
33105000006306 | 195 |
33105000006307 | 196 |
33105000006308 | 197 |
33105000006309 | 198 |
33105000006310 | 196 |
这种方法的真正好处是灵活性。如果由于任何原因,新零件进入游戏,REDACLE 数据库结构将不会被修改。只需向定义表中添加新记录并将其与新零件关联即可。但是 REDACLE 数据库甚至更灵活;如果我们正在建造汽车而不是量热器,数据库结构将完全相同。
活动使用相同的方法表示:活动表保存 ActivityDescription 表中描述的记录实例。在工作流程中插入新活动是将活动描述提供给定义表,并将其与其在活动表中的出现相关联。同样,通过这种设计,可以无缝地描述完全不同的业务。例如,对于邮件投递,定义记录可以包含关于接收、分拣和投递的操作描述,而活动表可以包含关于在哪个包裹上何时完成给定操作的信息的记录。
工作流程是通过收集几个活动定义并定义它们应该执行的顺序来定义的。然后,接口软件检查在给定时间执行的活动是否在工作流程定义中遵循在零件上执行的最后一个已完成的活动。根据接口软件,可以跳过或重复活动。
对于质量控制数据,我们通过添加更高级别的抽象来采用相同的同态模式。我们将特征定义为在零件上执行的给定活动期间收集的数据。但是,特征表不存储实际值,因为它们可以是不同的性质——字符串、数字甚至更复杂的类型。特征表只是键的集合:其中一个键将特征链接到其在 charDefinition 表中的定义。实际特征根据其类型保存在单独的表中。
我们的流程有三种数据类型:单精度浮点数、数字三元组和字符串。例如,晶体的长度是一个数字,存储在 Value 表中。一些测量是在沿晶体轴的不同点和不同条件下进行的。例如,光学透射率是在不同波长下每 2 厘米测量的。它构成一个三元组,第一个数字代表位置,第二个数字代表波长,第三个数字代表透射率。每个三元组都作为一条记录存储在 multiValue 表中。字符串也是如此:操作员在操作前对每个晶体进行目视检查,他们可能会提供评论来说明可能的缺陷。在表 3 到表 7 中,我们展示了上述特征表示的表格。零件 33101000018045 已测量长度和透射率 (TTO)。长度在 value 表中为 229.7815mm。char_id 字段为 134821,指向特征表中对应于晶体长度的 charDefinition_id=6。TTO 是 multiValue 表中的一组三元组。对该晶体的目视检查得出了 charValue 表中不均匀的注释。
表 4. 特征
ID | charDefinition_id | part_id | activity_id |
---|---|---|---|
106035 | 2 | 33101000018045 | 10660 |
134821 | 6 | 33101000018045 | 16093 |
135252 | 26 | 33101000018045 | 16182 |
表 6. multiValue
ID | x | y | z | char_id |
---|---|---|---|---|
748867 | 15 | 700 | 76.1 | 135252 |
748907 | 35 | 700 | 75.7 | 135252 |
748947 | 55 | 700 | 75.9 | 135252 |
748987 | 75 | 700 | 76.1 | 135252 |
749027 | 95 | 700 | 76 | 135252 |
749067 | 115 | 700 | 75.5 | 135252 |
749107 | 135 | 700 | 76 | 135252 |
749147 | 155 | 700 | 75.7 | 135252 |
749187 | 175 | 700 | 76.3 | 135252 |
749227 | 195 | 700 | 76 | 135252 |
749267 | 215 | 700 | 74.6 | 135252 |
同样,这种方法使 REDACLE 适用于不同类型的业务;在乳品厂中,除了生产者(字符字符串)之外,它还可以用于记录每批牛奶的细菌负荷作为特征。此外,只需定义一个新表,就可以在不干扰模式的情况下向数据库添加全新的数据类型,例如图片或声音。例如,添加图片意味着创建一个包含三个字段的表:主键、作为 BLOB 的图片数据以及与特征表的关系,这通过整数 ID 表示。创建此类表的 MySQL 代码是
CREATE TABLE picture ( id INT NOT NULL AUTO_INCREMENT, data BLOB, char_id INT, INDEX (char_id), PRIMARY KEY (id) );
在我们的应用程序中,人类以多种方式与数据库交互——通过 MySQL 客户端、C++ 和 Java 程序、Perl 脚本和通过 Web 页面的 PHP 脚本。使用 Web 浏览器来呈现图形用户界面 (GUI) 提供了相当大的优势。GUI 是可移植的,不需要安装特定的组件,不会浪费时间在图形上,并且操作员或客户现在都很熟悉 Web 浏览器环境。
REDACLE 的另一个重要功能是它与其他机器的接口。在量热器构建过程中,自动机器无需任何人工支持即可测量晶体和其他零件(图 2)。然后,这些机器必须能够与 REDACLE 交互,以了解要执行的正确操作顺序,告知其操作的开始和结束时间,并提供要存储为特征的数据。
我们的目标是创建一个允许几乎任何设备与 REDACLE 交互的系统。我们避免强加给定的编程语言或为所有可能的设备提供库,因为它无法随着市场扩展。此外,某些设备可能是具有专有软件的嵌入式系统。
我们开发了一个名为 Instrument Agent (IA) 的守护程序,充当 REDACLE 和仪器之间的接口。IA 是一个连接到 Internet 端口的进程,能够读取 ASCII 字符并将它们写入该端口。仪器只需要能够连接到网络并通过连接发送字符串。
操作顺序如下
连接后,仪器声明它正在操作的零件。
IA 查询 REDACLE 数据库,并在工作流程中搜索该零件的最后一个已完成的活动。仪器应执行的命令存储在数据库中,作为 activityDefinition 表中的描述字段。
IA 将正确的命令发送给仪器。
在识别命令后,仪器执行它,并且 IA 在确认后在 REDACLE 数据库中插入一个新活动。
在作业结束时,IA 更新刚刚插入的活动,将其标记为 FINISHED,并从仪器获取 XML 格式的字符串数据。
活动的结果可能同时包含 multiValue 和 charValue 字段。单个值的格式如下
<RE><FI>field name<VA>field value</VA></FI>...</RE>
<RE> 代表结果,<FI> 代表字段,<VA> 代表值。从字段名称,仪器代理获取特征定义 ID,并根据字段值格式(数字的值和字符串的 charValue)填写相应的表。如果结果的形式为,则填充 multiValue 表
<RE><NT>ntuple name <FI>field name<VA>field value</VA></FI> ... </NT></RE>
<NT> 这里代表 n 元组,n 个元素的集合。
仪器软件开发人员无需了解 REDACLE 数据库的详细信息;他们只需要接受关于要使用的字符串格式的指导。没有规定要链接到程序的库,也没有要包含的文件。不强制使用编程语言。唯一的要求是能够为 IA 提供网络连接。
除了 GUI 和仪器接口外,我们还为管理员和协调员开发了一组辅助命令行脚本。此外,我们创建了一个小型库,用于在数据库上运行 C++ 程序和 Perl 脚本,而无需制定 SQL 查询。
REDACLE 在首次讨论该项目四个月后在我们的实验室发布。整个系统包含大约 10,000 行 Perl、C++、PHP 和 Java 代码。与以前的系统(托管在双 800MHz Pentium III 服务器上)所要求的资源相比,运行该软件所需的资源很小。该系统将 CPU 占用率饱和到大约 100%,并几乎占用了所有 512MB 的 RAM。我们还需要升级所有客户端 PC,将其内存增加一倍以支持 Java GUI。因此,我们计划将服务器升级到双 1GHz Pentium III,配备 1GB RAM,以提高以前系统的性能。当使用 REDACLE 时,我们惊奇地发现,CPU 负载可以忽略不计,平均内存使用量为 140-200MB。
很明显,我们需要工具来从以前的数据库导入或导出数据,以前的数据库仍然在其他实验室中使用。这些工具是用 Perl 快速构建的,用于读取或写入 XML 文件,我们能够在一天内将所有旧数据导入到 REDACLE 中。
目前,我们在数据库中大约有 13,000 个零件。存储的特征为 97,000 个,每个特征可能由多个值组成,数据库总大小为 50MB。在 15 个表中,包含超过 1,000,000 条记录的 multiValue 表最大,为 41MB。
但是,最引人注目的结果是通过比较操作员在量热器组装中花费的时间获得的。在引入 REDACLE 之前,操作员 25% 的时间浪费在与工作流程管理器的交互上。使用 REDACLE,操作员与数据库之间的交互花费的时间可以忽略不计,从而提高了整体探测器组装效率。
此外,操作员很快熟悉了 REDACLE 的灵活性,并开始要求新的工具和接口。以前需要数周才能开发或几乎不可能构建的东西,现在可以在很短的时间内使用 REDACLE 和 LAMP 实现——在几个小时到两三天之间。
REDACLE 数据库设计的非凡灵活性使其适用于许多不同的业务流程和工业应用,清楚地说明了开源软件如何优于专有产品。未来,我们计划支持更复杂的工作流程模型,以及在其他基于 REDACLE 的项目的开发中使用的常用查询和函数库。
资源
Cern 站点:www.cern.ch
罗马的 CMS 实验:www.roma1.infn.it/exp/cms
MySQL 参考站点:www.mysql.com
PHP 参考站点:www.php.net
工作流程门户:www.e-workflow.org
Giovanni Organtini (G.Organtini@roma1.infn.it) 在罗马大学教授物理学家计算和编程课程。他作为 Linux 用户进行研究和教学已有九年,并且与 Federica 结婚已有十年。他参与粒子探测器的设计和实现以及高能物理的先进计算。
Luciano M. Barone (Luciano.Barone@roma1.infn.it) 是罗马大学 La Sapienza 的物理学副教授。他作为高能实验物理学家投身物理学,很快转向同一领域的计算应用。他喜欢解决大型问题并将它们驯服到最精细的细节。