NWPC消息平台:发送ecFlow命令消息

目录

本文属于介绍 NWPC 消息平台 系列文章。

简介

ecFlow 中运行的任务脚本通过 ecflow_client 命令与 ecFlow 服务进行通讯,告知服务任务运行状态的变化。 每次命令调用都会在 ecFlow 服务的日志文件中写入一条记录。

详情请参看文章《ecFlow笔记:ecFlow日志解析 - child 命令记录》。

此类数据可以作为任务运行状态变化的数据,从这些数据组成的序列中可以计算得到某个任务的运行情况。

一个直观的想法就是监控 ecFlow 日志文件,实时获取业务系统的运行状态。 但笔者之前测试发现,无法保证日志信息会实时写入到文件中。 尤其在添加监听程序后,可以观察到部分日志的写入延迟会显著增加。

注:从今天的临时测试 (tail -f) 看,可以进行实时更新,上述结论存疑,需要进一步验证。

不过,仍有理由使用额外的机制保存业务系统日志信息,比如不应该将业务监控紧密绑定在 ecFlow 上。

NWPC 消息平台对任务脚本使用的 ecFlow_client 命令进行封装,向消息平台发送 ecFlow 命令消息,作为任务运行状态变化的数据。 后端应用可以从消息队列中获取该数据,从而对业务系统的运行状况进行实时监控。

本文介绍如何封装 ecflow_client 命令实现发送 ecFlow 命令消息

设计

本文对 ecflow_clinet 命令的封装需要满足以下原则:

  1. 不影响任务正常运行,包括与 ecFlow 服务的通讯
  2. 对现有业务流程影响最小,仅需要少量修改即可启用或关闭
  3. 以附加组件的形式存在,各个系统间互不影响

根据以上原则,本文设计封装 ecflow_clinet 发送 ecFlow 命令消息的方案,如下图所示。

封装 ecflow_client 命令发送 ecFlow 命令消息示意图

核心思想是通过配置环境变量 PATH,将任务脚本中的 ecflow_client 路径指向封装后的工具脚本,在该工具脚本中调用实际 ecflow_client 命令,并额外向 NWPC 消息平台发送消息。 业务系统仅需在所有任务都会加载的头文件 (例如 head.h) 中调用修改环境变量的集成脚本,即可启用或关闭消息发送功能,无需修改其他脚本。

关键技术实现

命令封装

本文将 ecfoow_client 命令调用和 ecFlow 命令消息发送封装到一个单独的工具脚本中 (nwpc_ecflow_clinet.sh)。 工具脚本中首先调用 ecFlow 的 ecflow_client 命令,保证与 ecFlow 服务的通讯能够及时完成。

启用 ecFlow 消息发送的系统可以在单独目录中创建 ecflow_client 链接,指向该工具脚本,并将该目录添加到环境变量 PATH 的开头。 这种以附加组件形式提供的扩展功能可以保证各个系统之间互不影响。

环境配置

本文将消息发送需要的各项配置信息封装到一个单独的配置脚本中。 业务系统仅需要在头文件 head.h 中添加少量代码,就可以启动消息发送功能,而无需修改其它脚本。 关闭消息发送命令也只需要注释或删掉相关的代码。

限时操作

为了不影响业务系统的正常运行,对消息发送命令中与消息中间件通讯的关键耗时环节添加时间限制,超过时限会强制终止消息发送,保证增加的消息发送步骤不影响后续脚本的正常运行。 目前时间限制是 2 秒。

实现

工具脚本

下面是简化后的工具脚本 (nwpc_ecflow_client.sh),包括两个步骤:

  • 调用 ecFlow 的 ecflow_client 命令
  • 向 NWPC 消息平台发送消息
# 调用 ecflow_client
/path/to/real/ecflow_client "$@"

# 发送消息,忽略命令错误
set +e
broker_node=$(getent hosts ${NWPC_MESSAGE_CLIENT_BROKER_NODE} | awk '{ print $1 }')
${NWPC_MESSAGE_CLINET_PROGRAM} ecflow-client \
    --command-options="$*" \
    --rabbitmq-server="${NWPC_MESSAGE_CLIENT_RABBITMQ_ADDRESS}" \
    --broker-address="${broker_node}:${NWPC_MESSAGE_CLIENT_BROKER_PORT}" \
    --with-broker
set -e

配置脚本

工具脚本中使用多个环境变量,本文将配置信息封装到一个单独的 shell 脚本中,方便业务系统脚本直接加载。

下面是配置脚本的示例,设置了消息中间件地址、代理服务 (后续介绍) 地址和命令行程序的路径。

export NWPC_MESSAGE_CLIENT_RABBITMQ_ADDRESS=amqp://guest:guest@localhost:port

export NWPC_MESSAGE_CLIENT_BROKER_NODE=localhost
export NWPC_MESSAGE_CLIENT_BROKER_PORT=port

export NWPC_MESSAGE_CLINET_PROGRAM=/path/to/nwpc_message_client

任务脚本

下面是当前业务系统脚本中启动消息发送功能的代码,添加在头文件 head.h 中。

NWPC_MESSAGE_CLIENT_BASE=/path/to/nwpc_message_client/base
source ${NWPC_MESSAGE_CLIENT_BASE}/conf/config-develop-ecflow.sh
export PATH=${NWPC_MESSAGE_CLIENT_BASE}/tool/ecflow:${PATH}

后续会进一步整合简化,比如以单独头文件 (message_client.ecf) 的形式集成到业务系统脚本中。

参考

NWPC 消息平台项目

nwpc-oper/nwpc-message-client

nwpc-oper/nmc-message-client

nwpc-oper/nwpc-message-tool

ecFlow 命令消息

NWPC消息平台:ecFlow 命令消息