Skip to content
marstone edited this page Oct 14, 2024 · 12 revisions

概述

  • 本文旨在解释数据网关的消息队列服务的设计与使用方式

消息定义

{
    "specversion" : "1.0",
    "type" : "user.created",            // 和Topic一致,一般是 命名空间.数据类型.事件 的命名规范
    "source" : "XsFvzALh6KiMJ8tLa7G3",  // URI Reference格式,目前默认使用应用的client-id
    "subject" : "202103704",            // 对应与type中类型的id,如学工号
    "id" : "A234-1234-1234",            // 消息id,source+id 需唯一
    "time" : "2018-04-05T17:31:00Z",    // 时间戳 ISO 8601 格式
    "datacontenttype" : "application/json",          // 数据内容类型,目前只支持json  
    "data" : "{\"name\":\"Alice\", \"age\":\"20\"}", // 额外数据,因消息类型而异
    "tenant": "example.com",            // 消息发布者的租户(来自access_token) 
    "clientid": "n7dkDbprk4JZxDCD9UyU", // 消息发布者的应用(来自access_token) 
    "openid": "n7dkDbprk4JZxDCD9UyU",   // 消息发布者的用户(来自access_token) 
    "services": [ "sso" ],              // 消息发布者的服务(来自 clientid 对应的服务列表,或由消息发布者指定)
}

Topics

  • 注:平台内置Topic,命名空间被省略
Topic/Type subject Explained
tenant.created {tenant}[1] 租户创建
tenant.updated {tenant} 租户更新
tenant.deleted {tenant} 租户删除
tenant.ready {tenant} 租户创建完成,进入可用状态
tenant.preference.changed {tenant} 租户配置变更
app.created {client-id} 应用创建
app.activated[2] {client-id} 应用激活(租户内安装)
app.deactivated[2] {client-id} 应用取消激活(租户内删除)
app.preference.changed {client-id} 应用配置变更
service.invoked {服务代码} 网关接口被调用
user.created/updated/deleted[3] {openid} 用户创建/更新/删除
user.position.created/updated/deleted[3] {openid} 用户身份(三元组)创建/更新/删除
user.logout {id-token} 用户登出,用于OIDC后端统一登出
user.preference.changed {openid} 用户偏好变化
user.task.changed {openid} 用户待办变化
user.password.changed {openid} 用户密码变化
user.notification.changed {openid} 用户提醒变化,含新提醒、已读
user.issue.changed {openid} 用户工单变化,含新提醒、已读
users.changed "*" 批量用户变化
dept.created/updated/deleted[3] {部门代码} 部门创建/更新/删除
post.created/updated/deleted[3] {岗位代码} 岗位创建/更新/删除
datasource.cdc {数据源ID} 数据源数据发生变化(binlog)
usersource.cdc "*" 身份权威源数据发生变化
infoplus.user.task_changed {用户账号@域名} 用户待办发生变化
infoplus.user.cc_changed {用户账号@域名} 用户抄送发生变化
factory.part.changed {部件ID} 应用工厂中部件定义发生变化
  • [1] tenant参数参考Multitenancy
  • [2] 应用激活/取消激活的一些解释
    • 对于 maker 应用,subject 为 oauth 的 client_id,其他开发工具使用的subject可能不同,由各自应用解释
    • data.tenant 为当前应用激活的租户编码
    • data.temlateIdWorkspaceAPI 中的 [TQ2] 查询的 id 参数一致

Data结构

  • 不同的Topic对应的消息中data字段的数据结构不同

datasource.cdc

[{
  "kind": [insert|update|delete|alter|create|drop], // DB执行的操作
  "service": {string},  // GraphQL服务名
  "type": {string},     // GraphQL类型名
  "table": {string},    // 数据库表名
  "key": {string},      // 主键值,对应GraphQL类型中的ID字段(可选)
}]

user.password.changed

{
  "password": {string},  // 密码明文 
}

factory.part.changed

{
  "patches": [ {Patch} ],         // 补丁信息 
  "traces": [ {Trace} ]           // 用户行为信息 
}

使用方式

  • 属于数据网关的内置功能,通过GraphQL协议进行 Mutationpub)和 Subscriptionsub
  • pub接口
type Mutation {
  pub(message: MessageInput!): Message
}

# 参考第一节消息定义 
type Message {
    id: ID
    type: String
    specversion: String
    source: String
    time: Long
    subject: String
    datacontenttype: String
    data: String
    tenant: String
    clientid: String  
    openid: String
    services: [String]
}
    
# 参考第一节消息定义 
input MessageInput {
    id: ID
    type: String
    specversion: String
    source: String
    time: Long
    subject: String
    datacontenttype: String
    data: String
    tenant: String
    clientid: String
    openid: String
    services: [String]
}
  • sub接口
type Subscription {
    sub(
        topics: String
        filter: Filter
        since: Long
    ): Message
}
Clone this wiki locally