适用于NMC监控平台的数值预报产品消息

目录

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

NMC 建立了统一的业务监控平台,基于消息中间件 Kafka 实现消息系统,同时制定了统一的日志数据格式。

之前已根据上一版消息规范制定产品消息格式,详情参见《适用于NMC监控平台的数值预报产品消息》。

本文介绍在新版标准下设计的数值预报产品消息格式。

新旧消息对比

新版消息的目标是:

设计一套通用性较高的消息体模型, 考虑与重要产品监视系统、消息分析数据库对接的便捷性和可用性,并考虑信息的扩展能力

注:摘自规范文档,略有修改

新版消息增加大量字段,并对原有字段进行修改和扩充。 数值预报产品使用的新旧两版消息格式对比如下图所示。

2021版消息与2020版消息格式对比

笔者认为新增字段中的核心是用于确定消息唯一性的 PIDID,这样后端存储就不需要用额外的机制来区别重复的消息。

日志消息格式

日志消息格式参见《国家气象中心消息体设计方案V1.4》。

消息使用 JSON 格式。

{
  "topic": "string",
  "source": "string",
  "sourceIP": "string",
  "type": "string",
  "PID": "string",
  "ID": "string",
  "datetime": "string",
  "fileNames": "string",
  "absoluteDataName": "string",
  "fileSizes": "string",
  "result": 0,
  "resultDesc": "string"
}

各个字段的说明如下表所示。

字段名含义可选说明
topic消息主题必选字符串(区分大小写)
source消息来源系统必选字符串(区分大小写)
sourceIP消息来源系统 IP必选字符串(区分大小写)
PID产品唯一标志码必选字符串
ID唯一标识码必选字符串,用时间生成一个 md5 码
datetime消息时间必选字符串,yyyy-MM-dd HH:mm:ss
fileNames文件名必选字符串,支持多个文件,以;为间隔
absoluteDataName带路径的文件名可选字符串,以;为间隔
fileSizes文件大小(单位:byte)必选字符串,以;为间隔
result处理状态必选Int 型,正确(0)、错误(-1)
resultDesc处理状态描述可选字符串,正确则描述处理的内容;错误描述具体错误内容
reserved扩展可选字符串

对于数值预报产品来说,我们一般只更关心某个时次某个时效的产品在何时生成。 尽管产品唯一标识码 PID,文件名 fileNameabsoluteDataName 中都可以体现产品的起报时间和预报时效,但不够直观,所以在设计数值预报产品消息时,使用了自定义的 resultDesc 段。

数值预报产品消息

首先看一个实际发送的消息,表示 GRAPES GFS 系统 2020 年 12 月 30 日 00 时次的 210 时效 GRIB2 产品在北京时间 2020-12-30 13:35:07 生成。

{
  "topic": "nwpcproduct",
  "source": "grapesGfs",
  "sourceIP": "10.40.143.27",
  "type": "gfsProd",
  "PID": "gfsProd0008021000038081",
  "ID": "2020123013350751685",
  "datetime": "2020-12-30 13:35:07",
  "fileNames": "gmf.gra.2020123000210.grb2",
  "absoluteDataName": "/g2/nwp_pd/NWP_GRAPES_GFS_GMF_POST_DATA/2020123000/togrib2/output/grib2_orig/gmf.gra.2020123000210.grb2",
  "fileSizes": "461749795",
  "result": 0,
  "resultDesc": "{\"startTime\":\"2020123000\",\"forecastTime\":\"210\"}"
}

resultDesc 字段保存一个 json 字符串,包含 startTimeforecastTime 两个字段,分别代表起报时间和预报时效。

数值预报产品消息格式如下图所示:

数值预报产品消息格式

下面详细说明各个字段。

topic

消息主题,与文档一致。 GRAPES 系统目前只发送 GRIB2 产品生成消息,使用 1 个专用主题。

系统含义
nwpcproduct数值预报产品制作,表示产品制作完成

source

数值预报业务系统名称,以 grapes 开头。

系统含义
grapesGfs全球 GRAPES 系统
grapesMeso10km区域 GRAPES 10KM 系统
grapesMeso3km区域 GRAPES 3KM 系统
grapesTym区域 GRAPES 台风系统
grapesGeps全球 GRAPES 集合预报系统
grapesReps区域 GRAPES 集合预报系统

sourceIP

消息来源系统IP。 GRAPES系统目前使用 CMA-PI 串行节点或登录节点发送消息,IP 地址类似 10.40.142.27。

脚本中执行的代码:

ip addr show bond0 | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}'

type

消息类型,为每个系统单独设计一个类型

消息类型含义
GRAPESGRAPES 模式(已定义)
gfsProdGRAPES GFS GRIB2 产品
meso10kmProdGRAPES MESO 10KM GRIB2 产品
meso3kmProdGRAPES MESO 3KM GRIB2 产品
…(后续添加)

PID

产品唯一标识码,字符串。

GRAPES系统GRIB产品定义如下:

业务类型 + 起报时间4 + 时效4 + 间隔4 + 随机数字4

${type}+00HH+FFFF+0006+XXXX

例如

gfsProd0008002400064535

ID

唯一标识码,根据时间生成

YYYYMMDDHHmmssXXXXX

其中 XXXXX 是 纳秒 / 10000 并取整。

datetime

消息发送时的时间,北京时,字符串

YYYY-MM-DD HH:mm:ss。

fileNames

文件名,以分号(;)分隔。 对于 NWPC 产品的消息来说,是 GRIB2 的文件名,例如

gmf.gra.2020122300024.grb2

absoluteDataName

文件绝对路径,以分号(;)分隔。 对于 NWPC 产品类型的消息来说,是 CMA-PI 上。 例如下面是 GRAPES GFS 预报系统 GRIB 2 产品的临时归档路径 (runtime archive)。

/g2/nwp_pd/NWP_GRAPES_GFS_GMF_POST_DATA/2020122300/togrib2/024/gmf.gra.2020122300024.grb2

fileSizes

文件大小,单位 byte,以分号(;)分隔。 例如:

437801456

result

处理状态

状态含义
0成功
-1错误

目前只发送 成功 的消息,即当 GRIB 2 产品生成后会发送一条消息。

resultDesc

附加信息。 对于 NWPC 产品类型的消息来说,是 json 字符串,包含下面的字段:

字段名格式含义示例
start_timeYYYYMMDDHH起报时间2020032300
forecast_timeFFF预报时效021

resultDesc字符串如下:

{\"start_time\":\"2019062400\",\"forecast_time\":\"006\"}

目前只有确定性模式系统发送产品消息,未来会增加集合预报系统。 为了区分各个集合成员,考虑在 resultDesc 中增加新的字段,例如 number

实现

下面介绍 nwpc-oper/nmc-message-client 项目中对数值预报产品消息的实现。

注:临时修改为新版消息结构,后续会进一步改进

日志消息

MonitorMessage 是通用的日志消息。

type MonitorMessageV2 struct {
	Topic             string `json:"topic"`
	Source            string `json:"source"`
	SourceIP          string `json:"sourceIP"`
	MessageType       string `json:"type"`
	PID               string `json:"PID"`
	ID                string `json:"ID"`
	DateTime          string `json:"datetime,omitempty"`
	FileNames         string `json:"fileNames"`
	AbsoluteDataName  string `json:"absoluteDataName,omitempty"`
	FileSizes         string `json:"fileSizes"`
	Result            int8   `json:"result"`
	ResultDescription string `json:"resultDesc"`
}

数值预报产品消息

数值预报产品消息使用通用的 MonitorMessage 表示。

其中描述字段使用 ProbGribMessageDescription 表示。

type ProbGribMessageDescription struct {
  StartTime    string `json:"startTime,omitempty"`
  ForecastTime string `json:"forecastTime,omitempty"`
}

构造消息时,会将 ProbGribMessageDescription 对象转为 JSON 字符串,保存到 MonitorMessageDescription 成员中。

消息发送

目前,数值预报中心的数值预报业务系统使用 nwpc-oper/nmc-message-client 项目中的 nmc_monitor_client 命令发送消息。

nmc_monitor_client production \
  --target host1:9092 \
  --source grapesGfs \
  --source-ip some-ip \
  --type gfsProd \
  --product-interval 3 \
  --file-name gmf.gra.2020123000210.grb2 \
  --absolute-data-name /some/path/to/gmf.gra.2020123000210.grb2 \
  --file-size 461749795 \
  --start-time 2020123000 \
  --forecast-time 210 \
  --status 0 \
  --ignore-error \
  --debug

其中 target 是 Kafka 服务器地址列表,使用逗号分隔。

命令会自动生成时间,添加到 datetime 字段。

为了保证命令不影响整个业务系统的正常运行,使用 --ignore-error 参数,保证程序的返回值永远是 0。

启用 --debug 参数后,程序运行的输出如下所示:

brokers: [host1:9092]
Version 0.3.0-alpha (d559d45)
Build at 2020-12-28T07:03:04.655546709+00:00
message:
{
  "topic": "nwpcproduct",
  "source": "grapesGfs",
  "sourceIP": "some-ip",
  "type": "gfsProd",
  "PID": "gfsProd0008021000038081",
  "ID": "2020123013350751685",
  "datetime": "2020-12-30 13:35:07",
  "fileNames": "gmf.gra.2020123000210.grb2",
  "absoluteDataName": "/some/path/to/gmf.gra.2020123000210.grb2",
  "fileSizes": "461749795",
  "result": 0,
  "resultDesc": "{\"startTime\":\"2020123000\",\"forecastTime\":\"210\"}"
}
create writer...
create writer...done
send message...
send message successful
close writer...
close writer...done

后续文章会继续介绍该命令如何实现,以及与 NMC 消息平台相关的更多项目。

消息展示

气象中心已开发监控网站展示各类系统的运行情况。

下图截取自 http://10.20.90.35:8080/monitor/alarmGrapes/getGrapes

NMC 综合业务感知平台中展示接收到的 GRAPES GFS 产品消息

下图截取自 http://10.20.90.35:8080/monitor/index/nmcMonitor

NMC 关键业务信息监视会显示 GRAPES 模式产品的完成情况

当数据没有按时生成时,NMC 运控平台会发送报警短信。 下图是 2020 年 11 月 12 日中午发送的报警短信,提醒 GRAPES GFS 00 时的产品没有按时生成。

NMC 运控平台发送的报警短信,GRAPES GFS 00 时产品生成时间阈值是 13:30

总结

对于 NWPC 产品消息来说,新版消息虽然增加大量字段,但后端应用需要的核心字段内容没有太大的变化,只是需要修改字段字典中的映射关系。 后续将继续修改消息接收和存储程序,对接新版消息。

新版消息格式已于 12 月 28 日开始平行测试,并将于 2021 年 1 月 1 日正式切换,同时旧版消息停止发送。

参考

NWPC 消息平台项目

nwpc-oper/nmc-message-client

nwpc-oepr/nwpc-message-tool

NMC 监控平台

NMC 监控平台:请在气象局内网访问。