适用于NMC监控平台的数值预报产品消息
本文属于介绍 NWPC 消息平台 系列文章。
NMC 建立了统一的业务监控平台,基于消息中间件 Kafka 实现消息系统,同时制定了统一的日志数据格式。
之前已根据上一版消息规范制定产品消息格式,详情参见《适用于NMC监控平台的数值预报产品消息》。
本文介绍在新版标准下设计的数值预报产品消息格式。
新旧消息对比
新版消息的目标是:
设计一套通用性较高的消息体模型, 考虑与重要产品监视系统、消息分析数据库对接的便捷性和可用性,并考虑信息的扩展能力
注:摘自规范文档,略有修改
新版消息增加大量字段,并对原有字段进行修改和扩充。 数值预报产品使用的新旧两版消息格式对比如下图所示。
笔者认为新增字段中的核心是用于确定消息唯一性的 PID
和 ID
,这样后端存储就不需要用额外的机制来区别重复的消息。
日志消息格式
日志消息格式参见《国家气象中心消息体设计方案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
,文件名 fileName
、absoluteDataName
中都可以体现产品的起报时间和预报时效,但不够直观,所以在设计数值预报产品消息时,使用了自定义的 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 字符串,包含 startTime
和 forecastTime
两个字段,分别代表起报时间和预报时效。
数值预报产品消息格式如下图所示:
下面详细说明各个字段。
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
消息类型,为每个系统单独设计一个类型
消息类型 | 含义 |
---|---|
GRAPES | GRAPES 模式(已定义) |
gfsProd | GRAPES GFS GRIB2 产品 |
meso10kmProd | GRAPES MESO 10KM GRIB2 产品 |
meso3kmProd | GRAPES 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_time | YYYYMMDDHH | 起报时间 | 2020032300 |
forecast_time | FFF | 预报时效 | 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 字符串,保存到 MonitorMessage
的 Description
成员中。
消息发送
目前,数值预报中心的数值预报业务系统使用 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
下图截取自 http://10.20.90.35:8080/monitor/index/nmcMonitor
当数据没有按时生成时,NMC 运控平台会发送报警短信。 下图是 2020 年 11 月 12 日中午发送的报警短信,提醒 GRAPES GFS 00 时的产品没有按时生成。
总结
对于 NWPC 产品消息来说,新版消息虽然增加大量字段,但后端应用需要的核心字段内容没有太大的变化,只是需要修改字段字典中的映射关系。 后续将继续修改消息接收和存储程序,对接新版消息。
新版消息格式已于 12 月 28 日开始平行测试,并将于 2021 年 1 月 1 日正式切换,同时旧版消息停止发送。
参考
NWPC 消息平台项目
NMC 监控平台
NMC 监控平台:请在气象局内网访问。