Diamond Light Source自动化数据处理的基础设施组件
项目描述
Zocalo是Diamond Light Source设计的一款自动化数据处理系统。此存储库包含Zocalo的基础设施组件。
Zocalo的理念很简单——构建一个消息框架,通过系统各个部分之间的文本消息发送来协调数据分析。从更广泛的范围来看,这还涵盖了归档等内容,但通常它负责处理数据采集之后的所有事情。
作为一个整体,Zocalo由两个存储库(以及在部署到Diamond时的一些私有内部存储库)组成。
DiamondLightSource/python-zocalo - 由Diamond Light Source开发的自动化数据处理基础设施组件。该软件包通过PyPi和conda-forge提供。
DiamondLightSource/python-workflows - Zocalo建立在workflows软件包之上。通常不需要与这个包过多交互,因为Zocalo已经抽象了细节。workflows控制服务之间的逻辑连接以及服务的定义,实际上是将消息发送到消息代理。目前这是一个ActiveMQ代理(通过STOMP),但正在添加对RabbitMQ代理(通过pika)的支持。这也可在PyPi和conda-forge上找到。
正如所述,Zocalo目前建立在ActiveMQ之上。ActiveMQ是一个Apache项目,提供消息代理服务器,充当中央调度器,允许各种服务进行通信。消息是纯文本的,但从Zocalo的角度来看,它是传递Python对象(json字典)。每个发送的消息都有一个目的地,以帮助消息代理进行路由。消息可以发送到特定的队列或广播到多个队列。这些队列由运行在Zocalo中的服务订阅。在使用Zocalo进行开发时,可能需要与ActiveMQ或RabbitMQ交互,但不太可能需要对其进行配置。
Zocalo允许监控执行python-workflows服务或配方包装器的作业。python-workflows软件包包含执行作业所需的大部分基础设施,有关其组件的更详细文档可在python-workflows GitHub仓库和Zocalo文档中找到。
核心概念
在Zocalo中运行有两种类型的任务:服务和包装器。服务应该处理一个离散的短期任务,例如在X射线晶体学背景下对一个小数据包进行数据处理作业(例如,在单个图像中找到斑点),或将结果插入数据库。相比之下,包装器可用于执行长时间运行的任务,例如运行数据处理程序,如xia2或fast_ep。
服务在后台启动并等待工作。在正常Zocalo操作中,有许多服务持续运行。在Diamond的典型用法中,同时运行大约有~100个服务。
另一方面,包装器仅在需要时运行。它们包裹的某物并不一定是Zocalo意识到的——例如,下流处理软件如xia2并不知道Zocalo是什么,也不应该知道。包装器接收一条消息,将其转换为命令行实例,运行软件——通常是作为一个集群作业,然后将结果重新格式化成消息发送回Zocalo。这些过程并不知道Zocalo是什么,但它们是由一个处理包装的脚本运行的。
在Diamond,所有东西最初都发送到一个服务:调度器。它接收初始请求消息并为Zocalo的其余部分附加有用信息。Diamond中调度器的实现是环境特定的且不为公开,但它执行了一些在其他环境中类似服务可能需要执行的操作。在Diamond中,与存储有关运行信息、元数据、图像数量、样品类型等信息的ISPyB数据库进行交互。存储在数据库中的数据会影响我们想要运行的软件,并且可能需要在许多服务中读取这些信息。我们显然不想从许多客户端读取相同的信息并淹没数据库,也不想数据库成为单点故障。调度器预先加载所有数据库操作——它获取数据收集ID(DCID)并在ISPyB中查找所有可能需要用于处理的信息。在系统流动方面,它位于初始消息和服务之间。
message -> Dispatcher -> [Services]
在处理结束时,可能需要将信息放回数据库,Diamond有一个特殊的ISPyB服务来完成写入。如果数据库发生故障,那没关系——事情将排队等待ISPyB服务处理,当数据库再次可用时进行处理,并写入数据库。这使我们某种程度上隔离了间歇性故障。
目前唯一的公开Zocalo服务是Schlockmeister,一个垃圾收集服务,用于删除多次重新排队的作业。Diamond运营各种内部Zocalo服务,这些服务在数据分析管道中执行频繁需要的操作。
与Zocalo协作
使用Graylog来管理Zocalo生成的日志。一旦Graylog和消息代理服务器运行,就可以使用Zocalo启动服务和包装器。
- Zocalo提供了以下命令行工具:
zocalo.go:触发配方处理
zocalo.wrap:运行命令,同时将其状态暴露给Zocalo以便跟踪
zocalo.service:启动服务的新实例
zocalo.shutdown:关闭Zocalo服务的特定实例或特定类型服务的所有实例
zocalo.queue_drain:以受控方式将一个队列中的内容排空到另一个队列中
如果服务通过setup.py中的workflows.services入口点链接,则可以通过zocalo.service访问服务。例如,要启动Schlockmeister服务
$ zocalo.service -s Schlockmeister
问:服务是如何启动的? |
---|
答:Zocalo本身对此一无所知。一些服务是自传播的,并采用简单的扩展行为——特别是每个图像分析服务。通常,所有服务都在集群节点上运行,虽然这意味着它们不能长时间运行——超过几个小时,服务集群作业被终止或抢占的风险很高。这也鼓励编写更健壮的服务,如果它们可能被杀死的话。 |
问:如果一个服务在处理过程中被终止,它仍然会被处理吗? |
---|
A: 是的,消息在事务中处理 - 当一个服务正在处理消息时,它会标记为“进行中”,但不会完全丢弃。如果服务没有处理消息,或者它与ActiveMQ的连接断开,那么它将被重新排队,以便另一个服务实例可以取走。 |
重复消息失败
如何处理重复错误?这是一个系统问题 - 例如,如果一个图像或格式错误的消息使一个服务崩溃,那么它将被重新排队,并最终杀死所有运行的服务实例(这将重新启动,然后死亡,依此类推)。
我们有一个专门的服务,用于查找重复失败并将它们移动到特殊的“死信队列”。这个服务称为Schlockmeister,是当时唯一迁移到公共zocalo存储库的服务。该服务检查发送的消息,尽可能安全地从消息中提取一些基本信息,并将其重新打包到DLQ,包含它在做什么的信息以及消息链的路由“历史”。
项目详情
下载文件
下载适合您平台文件的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
zocalo-1.1.1.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cdb29073d495c26049c69a4aec57a14972c768866e426de8004b02560e556c15 |
|
MD5 | a5d4d0449ad5a98be474ffa14051bc18 |
|
BLAKE2b-256 | 9cd9b28e3f60cee8ae677e322d88746be756e1eb5e774df630ff0e7511c9bf80 |
zocalo-1.1.1-py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6e4feac32b43d4ecebf859b399ec44bdff37e0d6e102bdc3358722952aa6efec |
|
MD5 | e161c98e108059d1aed1ae82b6c3b0d1 |
|
BLAKE2b-256 | f3b95ca35c3f85d007985663eee48a006d44a54beb3d1a8be197bfab523da39c |