Trantor 触发器
背景
业务通常有服务间通信需求,当上游业务服务数据变更时,需要通知下游服务。通知方式分为同步通知和异步通知。
- 同步通知用于实时性要求较高的场景,通过 HTTP API 触发;
- 异步通知用于实时性要求不高的场景,借助消息中间件实现。 Trantor 针对异步通知的场景,提供了 Trigger 机制,简化了开发难度,提高了开发效率,使业务用户快速实现业务场景。针对二开场景,方便地启用 & 停用,可快速扩展监听逻辑,无需重新部署业务服务。
工作机制
Trigger 基于 RocketMQ/阿里云ONS 实现,使用上对用户无感知。为了用户更好地理解 Trigger 工作流程,方便异常情况下的问题排查,这里简要介绍下 Trigger 的工作机制,请看下图:

其中,Datastore 作为消息生产者,用户通过 Datastore 服务提供的 SDK 进行数据 Create/Update/Delete 操作时,Datastore 判断模型是否已注册为监听模型,若注册,其作为消息生产者发送数据变更消息至 RocketMQ/ONS,topic 为: DATASTORE_SUBSCRIBE_<metastore 环境变量 DS_PROJECT_ID>;业务服务作为消息消费者,根据 application.yml 内声明的 mainModule & embedModules 生成 ConsumerGroup,收到消息后,根据消息类型(Create/Update/Delete)、消息所属模型 & 当前业务服务包含的模块获取对应 trigger 列表,逐一触发。
前置条件
注:trigger 只能监听持久化模型(BO),不可监听搜索模型(SO)。
DataStore参数设置
SUBSCRIBE_VERSION: 'V2'MQ_SERVER_ADDRESS: '<RocketMQ/ONS nameserver 地址>'SUBSCRIBE: 'true'开启消息发送开关,当模型数据变更时,发送消息。
业务模块参数设置
MQ_SERVER_ADDRESS: 'ip:port'DS_SUBSCRIBE: 'true'开启消息消费开关,当模型数据变更时,消费模型消息。
在线配置触发器
进入 制品中心->配置->业务域->触发器,新增触发器:

| 字段 | 类型 | 规则 |
|---|---|---|
| 资源原标识 | string | 必填,50字以内的大写字母、小写字母或数字,必须大写字母开头编辑时不可修改 |
| 资源名称 | string | 必填,50个字以内的无限制字符 |
| 超时设置 | int | 非必填,大于0,整数精度是1 |
| 跨应用 | boolean | 默认为 是 |
| 资源类型 | dictionary | 必填,枚举为 内部 外部 默认外部 |
| 描述 | string | 非必填,200个字以内的无限制格式字符 |
| 监听模型 | 对应模型 | 必填,可选范围为当前应用-版本下的全量模型 |
| 监听类型 | dictionary | 枚举为,新增、更新、删除。默认为新增 |
| 触发逻辑 | dictionary | 必填,枚举为 逻辑流 逻辑函数 默认为逻辑流 |
| 逻辑流 | 对应逻辑流 | 联动,触发逻辑为逻辑流时出现,必填,可选范围为所有逻辑流 |
| 逻辑函数 | 对应逻辑函数 | 联动,触发逻辑为逻辑函数时出现,必填,可选范围为所有逻辑函数 |
Trigger 未处理问题定位
- 确保 Datastore 消息发送开关已开启,业务服务消息消费开关已开启。
- 确保 trigger 资源已上报 & 发布,可在
交付控制台->运行环境->逻辑->触发器查看。 - 业务日志搜索关键信息
received model changed message, model: <替换为自己的 modelKey>。若有,表示消息已消费,查看是否有异常产生导致 trigger 最终未被调用;若无,应该是消息生产速度 & 消费速度不匹配导致消息堆积,请联系 Trantor 技术支持获取 RocketMQ console 查看消息消费情况,ConsumerGroup 名称在业务启动过程中有打印,请通过关键字GID_DSConsumerGroup查看。
FAQ
- 直接操作数据库会触发 trigger 吗?
不会,trigger 是通过监听消息触发的,只有通过 Datastore 提供的 SDK 操作数据库才会产生消息
- @Trigger 注解内 listenFields 属性可以不写吗?
可以,listenFields 属性仅在监听模型更新事件时使用,当指定的字段有变更时,才会触发 trigger 逻辑;若不写,默认监听模型全部字段
- Trigger 内业务处理失败时是如何处理的?
Trantor framework 侧负责消费消息,触发 trigger 内逻辑,若业务逻辑处理失败,会重试两次,若重试失败,认为消息消费成功,业务侧请保证功能幂等。