跳至正文

07 — flare-im-core 业务扩展点与 API 接入

1. 结论

flare-im-core 的业务扩展必须走显式扩展面,不允许核心服务直接依赖业务 crate。生产推荐按能力类型选择接入方式:

类型接入面适用场景是否影响主链
生命周期校验HookPlugin.Call / PreSendHook好友关系、黑名单、内容风控、租户策略pre_send 可拒绝
生命周期旁路post_send / delivery / recall Hook审计、指标、合规归档、运营分析默认不阻塞
命令/查询扩展ExtensionPlugin.Call / CapabilityService.Dispatch链接预览、翻译、业务查询、管理操作由调用方决定
同步扩展SyncService.ExecuteSync + 注入端口群目录、通讯录、用户资料增量不改消息 seq
写后投影业务 Domain Event + bridgeSocial 写成功后建会话、发系统消息业务侧控制
业务接入埋点BusinessProbeEvent / BusinessProbeSinkBI、审计、计费、推荐、风控特征不阻塞
HTTP BFFflare-api-gatewayApp/管理后台访问 Core 能力只做边界适配

核心约束:

  • request_id 负责幂等和追踪,不等于 message_id
  • message_id 是消息全局标识,不等于会话内 seq
  • seq 只由 IM Core 在会话维度分配,业务服务不得生成或回退。
  • cursor 用于读模型同步,不得替代消息 seq
  • 所有服务间调用必须透传 Ctxx-trace-idx-request-idx-tenant-idx-user-id

2. 扩展点清单

扩展点Proto / Trait触发时机业务可做禁止事项
pre_sendPreSendHookRequest / PreSendHook消息校验后、seq 分配前拒绝发送、补充草稿元数据、路由建议分配 seq、直接写消息存储
post_sendPostSendHookRequest / PostSendHook消息推入主链后审计、统计、合规归档、异步通知依赖其完成后再对客户端确认
deliveryDeliveryHookRequest / DeliveryHook下行送达后送达指标、渠道分析修改消息事实
recallRecallHookRequest / RecallHook撤回流程审计、权限补充检查绕过 MessageActionService
message_readMessageReadHookRequest / MessageReadHook已读水位更新后已读率、重要消息阅读审计修改游标/未读权威状态
message_reactionMessageReactionHookRequest / MessageReactionHookreaction 变更时表态白名单、互动统计、推荐特征修改消息内容
conversation_lifecycleConversationLifecycleHookRequest / ConversationLifecycleHook会话状态事实提交后外部目录投影、生命周期审计失败后回滚已提交事实
conversation_memberConversationMemberHookRequest / ConversationMemberHook成员变更时成员审计、风控、版本通知把业务目录完整资料写入 Core
GetConversationParticipantsHookRust trait需要参与者列表时从业务目录提供成员列表把好友列表当会话参与者
CapabilityService.DispatchDispatchCapabilityRequest显式能力调用业务能力路由替代生命周期 Hook
ExtensionPlugin.CallGenericRequest + Any显式 operation 调用业务查询/命令插件硬编码到 Core
SyncService.ExecuteSyncSyncRequest客户端同步群目录、通讯录、资料增量混用消息 last_seq
MessageSendService.SendSystemMessagegRPC业务写后通知系统消息、通知消息业务普通聊天绕过客户端上行链路
ConversationManageServicegRPC业务目录变化后建会话、成员变更投影在 Social 内维护消息 unread
ConversationReadService.ListConversationParticipantsgRPC / gateway成员页、@ 候选人、参与者增量分页读取 Core 参与者投影把群目录完整业务资料塞入 Core
BusinessProbeSinkRust port / MQ adapterCore 事实观测输出标准业务埋点在 Sink 中反向调用 Core 主链

3. HookPlugin API

服务定义:

说明
Packageflare.capability.v1
ServiceHookPlugin
RPCCall(GenericRequest) returns (GenericResponse)

GenericRequest 约定:

字段说明
operationHook 类型,例如 flare.hook.v1.pre_send
request_id幂等键,必须与 metadata 可关联
metadata轻量路由/灰度/签名字段
payloadgoogle.protobuf.Any,内嵌具体 Hook Request

常用 operation:

operationpayload默认失败策略
flare.hook.v1.pre_sendPreSendHookRequest强校验,推荐 fail-fast
flare.hook.v1.post_sendPostSendHookRequest旁路,推荐 fail-open
flare.hook.v1.deliveryDeliveryHookRequest旁路,推荐 fail-open
flare.hook.v1.recallRecallHookRequest视权限模型决定
flare.hook.v1.message_readMessageReadHookRequest旁路,推荐 fail-open
flare.hook.v1.message_reactionMessageReactionHookRequest视表态策略决定
flare.hook.v1.conversation_lifecycleConversationLifecycleHookRequest事实后旁路,推荐 fail-open
flare.hook.v1.conversation_memberConversationMemberHookRequest视成员变更发起方决定

pre_send 的业务语义:

  1. Orchestrator 已完成基础消息校验。
  2. 尚未分配最终 seq,业务不能依赖 seq
  3. Hook 可以返回 allow = false 拒绝发送。
  4. Hook 可以回写 draft.metadataannotations,但必须由宿主决定哪些字段进入持久化事实。
  5. 业务拒绝应返回机器可读 deny_reason_code,例如 SOCIAL_PRESEND_DENIED

4. Capability / Extension API

CapabilityService 面向能力目录、授权和命令分发:

RPC用途
ListCapabilities列出当前可用能力
ListUserCapabilities查询用户可用能力
Dispatchcapability_id 分发命令
GrantUserCapability / RevokeUserCapability授权管理
SetTenantCapabilitySwitch租户级开关
RegisterPluginEndpoint / DeregisterPluginEndpoint插件实例注册

ExtensionPlugin.Call 面向通用 operation:

命名建议示例
{domain}.{subsystem}.{action}social.sync.group_directory
{domain}.{capability}.v{n}.{action}link.preview.v1

使用原则:

  • 能力调用必须带 tenant_iduser_idconversation_idrequest_id
  • 大 payload 不应塞进 payload_json;应先落对象存储或业务存储,再传引用。
  • operation 必须版本化或保持向后兼容。
  • 长耗时任务应返回 accepted / task_id,不阻塞 IM 主链。

5. 服务间 gRPC API

API归属使用者说明
RouterUpstreamService.RouteMessagesignaling route长连接网关客户端上行入口
MessageSendService.SendMessageorchestratorroute / gateway 内部普通消息发送
MessageSendService.SendSystemMessageorchestratorbridge / 后台系统消息
MessageActionService.RecallMessageorchestratorgateway / 后台撤回消息
ConversationManageServiceconversationbridge / 管理面会话和成员投影
ConversationReadServiceconversationgateway / sync会话读模型
StorageReaderServicestorage-readerquery / sync历史消息读取
SyncService.ExecuteSyncsync-orchestratorSDK / gateway多端同步
MediaServicemediagateway / SDK媒体上传、处理、引用
CapabilityServicecapabilitygateway / orchestrator能力目录和分发
HookPlugincapability / business hookorchestrator生命周期回调
ExtensionPluginbusiness plugincapability / 工具面扩展命令/查询

6. 扩展接入决策

需求推荐接入原因
发送前校验好友/群权限pre_send Hook必须在 seq 分配前拒绝
发消息后写审计日志post_send Hook不影响主链确认
好友通过后自动创建单聊Social Domain Event + bridge业务写模型成功后投影 IM
群成员变更同步到会话参与者bridge 调 ConversationManageService会话投影由 Core 管
客户端拉群目录增量SyncService.ExecuteSync 注入 Social 端口与消息同步解耦
客户端发现成员变化对比 participant_version 后拉 ConversationParticipants大群成员同步不污染消息 seq
业务做 BI/计费/推荐特征BusinessProbeEvent + MQ/Hook/Capability非侵入式观察 Core 事实
链接预览CapabilityService.Dispatch + message event enrich命令型能力,非消息存储
管理后台调用 Coreflare-api-gateway统一认证、错误、返回格式

更完整的消息/会话接入点、群体变更和 Core 独立运行策略见 docs/integration/09-message-conversation-access-points.md(内部稿,未在站点发布)。 业务接入埋点模型见 10-business-instrumentation.md

7. 生产要求

  • 幂等:所有写操作使用 request_id 或业务事件 ID 去重。
  • 顺序:业务不得生成或覆盖消息 seq;会话内顺序只认 Core 分配结果。
  • 超时:主链 Hook 超时必须短,pre_send 建议 100-500ms。
  • 降级:强一致门禁 fail-fast;审计、指标、通知 fail-open。
  • 观测:Hook/Extension 必须输出 trace_idrequest_idtenant_idoperation、耗时、结果。
  • 安全:Hook body 里的用户字段不能替代认证;服务端必须从 metadata / token 还原可信身份。