跳至正文

协议语义:ID、seq 与游标

结论

集成 Flare IM 时 必须区分 四类标识;混用会导致幂等失败、同步重复或游标回退。

字段作用域谁生成用途
request_id单次 RPC / 发送请求客户端幂等重试、去重
message_id全局消息服务端(或编排器)消息唯一性、撤回/引用
seq会话内服务端单调递增排序、增量同步、已读
cursor用户 × 会话(或设备)客户端上报、服务端合并同步断点、多端漫游

seq(会话序列号)

  • 每个 conversation_id 维护 max_seq只增不减
  • 客户端拉历史:syncMessages(conversation_id, last_seq, limit),返回 seq > last_seq 的消息。
  • 禁止 用 offset/limit 分页替代 seq(大群/大会话会漂移)。
// SDK
client.sync_messages("conv_1", last_seq, 200).await?;
client.conversation().await?.mark_read("conv_1", read_seq).await?;

cursor(同步游标)

  • 表示「该用户在该会话已消费到的位置」,多端并发时服务端取 较大 seq 合并,避免误报回退。
  • SDK 本地持久化 cursor;上报前应与本地 max(本地, 远端) 对齐。

request_id 与幂等

  • 同一会话重复发送应携带相同 request_id,编排器去重后返回同一 message_id / seq
  • 网络超时重试 不要 换新 request_id(除非业务确认为新消息)。

message_id

  • 跨会话唯一,用于引用、撤回、反应绑定。
  • seq 无关:同一 message_id 在会话内对应唯一 seq

flare-proto 入口

包/服务说明
flare_proto::message消息体、Elem、状态
flare_proto::conversation会话摘要、参与者
flare_proto::sync增量同步、会话补丁

服务端 gRPC 清单见 /docs/server/04-grpc-api

检查清单

  • [ ] 客户端同步 API 使用 last_seq,非 page offset
  • [ ] 上报已读使用 read_seq,且不大于服务端 max_seq
  • [ ] 重试发送复用 request_id
  • [ ] 日志中分别打印四类 ID,便于排障