跳转到内容

Trantor 触发器

背景

业务通常有服务间通信需求,当上游业务服务数据变更时,需要通知下游服务。通知方式分为同步通知和异步通知。

  1. 同步通知用于实时性要求较高的场景,通过 HTTP API 触发;
  2. 异步通知用于实时性要求不高的场景,借助消息中间件实现。 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'

开启消息消费开关,当模型数据变更时,消费模型消息。

在线配置触发器

进入 制品中心->配置->业务域->触发器,新增触发器:

image-20211125142204082

字段类型规则
资源原标识string必填,50字以内的大写字母、小写字母或数字,必须大写字母开头编辑时不可修改
资源名称string必填,50个字以内的无限制字符
超时设置int非必填,大于0,整数精度是1
跨应用boolean默认为 是
资源类型dictionary必填,枚举为 内部 外部 默认外部
描述string非必填,200个字以内的无限制格式字符
监听模型对应模型必填,可选范围为当前应用-版本下的全量模型
监听类型dictionary枚举为,新增、更新、删除。默认为新增
触发逻辑dictionary必填,枚举为 逻辑流 逻辑函数 默认为逻辑流
逻辑流对应逻辑流联动,触发逻辑为逻辑流时出现,必填,可选范围为所有逻辑流
逻辑函数对应逻辑函数联动,触发逻辑为逻辑函数时出现,必填,可选范围为所有逻辑函数

Trigger 未处理问题定位

  1. 确保 Datastore 消息发送开关已开启,业务服务消息消费开关已开启。
  2. 确保 trigger 资源已上报 & 发布,可在交付控制台->运行环境->逻辑->触发器查看。
  3. 业务日志搜索关键信息 received model changed message, model: <替换为自己的 modelKey>。若有,表示消息已消费,查看是否有异常产生导致 trigger 最终未被调用;若无,应该是消息生产速度 & 消费速度不匹配导致消息堆积,请联系 Trantor 技术支持获取 RocketMQ console 查看消息消费情况,ConsumerGroup 名称在业务启动过程中有打印,请通过关键字 GID_DSConsumerGroup 查看。

FAQ

  1. 直接操作数据库会触发 trigger 吗?

不会,trigger 是通过监听消息触发的,只有通过 Datastore 提供的 SDK 操作数据库才会产生消息

  1. @Trigger 注解内 listenFields 属性可以不写吗?

可以,listenFields 属性仅在监听模型更新事件时使用,当指定的字段有变更时,才会触发 trigger 逻辑;若不写,默认监听模型全部字段

  1. Trigger 内业务处理失败时是如何处理的?

Trantor framework 侧负责消费消息,触发 trigger 内逻辑,若业务逻辑处理失败,会重试两次,若重试失败,认为消息消费成功,业务侧请保证功能幂等。