编号:K-00 严重级:medium 工作线:SDK(sdk/) + 测试与文档(test/、docs/*) 来源:审查 S-16、S-24 依赖:无 被依赖:K-01 (#58)、K-02 (#59)、K-03 (#60)、K-04 (#61) 中涉及对外语义的条目
四套 SDK 在多项对外语义上各行其是(审查 S-16、S-24,另见 S-11、S-14、S-15、S-18 的约定部分)。先由本 issue 定一份约定,写进 docs/DEVELOPMENT.md 第 9 节附录"SDK 行为约定",四套实现 issue(K-01 至 K-04)照此统一。约定如下(总审查人推荐值,负责人审核时可调整):
docs/DEVELOPMENT.md
not_connected
bad_credentials
session_invalid
disabled
deleted
password_reset
taken_over
rate_limited
auth_failed
kicked
"0x8E"
queue_full
quota_exceeded
data
bad_request
long
Long
updateSelf
defaultDelayMs
Integer
max_schedule_seconds
send_at_ms
min(1 秒 × 2^(n-1), 30 秒) × 随机(0.7, 1.3)
docs/DEVELOPMENT.md(第 9 节附录)、四套 SDK 的 README;实现改动在 K-01 至 K-04。
sdk/js/src/mqtt.ts:41-45
types.ts:174-215
约定合入后,K-01 至 K-04 各自为每一项加同名用例(四套用例名一致,便于对照)。
以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。解决方案以本 issue 上方的"结论与统一方案"为准;原文里的方案与之不一致时,按上方执行。
connect()
connect.go:73-94
client.ts:168-193
client.py:197-211,260-264,292-299,345-421
Client.java:170-203,261-292,344-474
send.go:126-131
client.py:323-324
Client.java:316
send.go
client.py
Client.java
复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。
4059a15
按第二轮 SDK 审查修订了约定表(总审查人已对照代码核实):"重连退避"改为明确算法(原写法会把 JS 现有的双重翻倍带进四套),"rate_limited 重交退避"补充每次重新生成 rid,新增"logout"和"时长参数"两行。详见正文。
已合入 origin/main 0c9b459。落地提交 3749b9b docs: 写入 K-00 SDK 行为约定附录 (#57)。
0c9b459
3749b9b
No dependencies set.
The note is not visible to the blocked user.
编号:K-00 严重级:medium 工作线:SDK(sdk/) + 测试与文档(test/、docs/*) 来源:审查 S-16、S-24
依赖:无 被依赖:K-01 (#58)、K-02 (#59)、K-03 (#60)、K-04 (#61) 中涉及对外语义的条目
结论与统一方案
四套 SDK 在多项对外语义上各行其是(审查 S-16、S-24,另见 S-11、S-14、S-15、S-18 的约定部分)。先由本 issue 定一份约定,写进
docs/DEVELOPMENT.md第 9 节附录"SDK 行为约定",四套实现 issue(K-01 至 K-04)照此统一。约定如下(总审查人推荐值,负责人审核时可调整):not_connected;Client 可再次调用 connectbad_credentials、session_invalid、disabled、deleted、password_reset、taken_over、rate_limited;事件auth_failed/kicked带同一原因taken_over,不报"0x8E"queue_full,不用服务端的quota_exceededdata,不返回整个信封bad_request(PRD F11)long/Long)。JavaupdateSelf的defaultDelayMs现在是Integer,最多约 24.8 天,达不到max_schedule_seconds默认的 365 天(第二轮 SDK 审查)bad_requestsend_at_ms保持不变(DEVELOPMENT 第 6 节要求同一连接内 rid 不重复;Go、JS 现在复用原 rid)(审查 S-14,第二轮 SDK 审查补充 rid)min(1 秒 × 2^(n-1), 30 秒) × 随机(0.7, 1.3),n 是连续失败计数(n ≥ 1)。只有应用调用 connect 后的第一次连接可以不等待;已建立的连接断开后,第一次重连也要按 n=1 等约 1 秒。连接尝试失败时 n 加 1;连上后不足 60 秒又断开,也按一次失败计(n 加 1,即 S1.3 的"闪断继续抬升");稳定在线满 60 秒后断开,n 重置为 1。只维护这一个计数,不能再另把 base 翻倍(JS 现在两处都翻倍,实际间隔约 1、4、16、30 秒;Go、Python、Java 断线后第一次重连为 0 秒)。连接超时覆盖等 CONNACK 的时间(审查 S-15,第二轮 SDK 审查核实后修订)改动文件
docs/DEVELOPMENT.md(第 9 节附录)、四套 SDK 的 README;实现改动在 K-01 至 K-04。与其他问题的交互 / 冲突说明
sdk/js/src/mqtt.ts:41-45与types.ts:174-215两处同时翻倍,照搬会把错误带进四套);"rate_limited 重交退避"补充每次重新生成 rid;新增"logout"与"时长参数"两行。K-01 至 K-04 里"帧内容保持原样"指消息 id、正文与send_at_ms,rid 按本表重新生成。验收与测试
约定合入后,K-01 至 K-04 各自为每一项加同名用例(四套用例名一致,便于对照)。
问题明细(各区审查原文,证据含文件与行号)
[S-16] 四套对外语义不对齐(Go / JS / Python / Java)
connect()永不返回;Python/Java 等 35 秒抛 busy,但后台继续重连。auth_failed(原因丢失),Python/Java 为具体原因。queue_full;Python/Java 为quota_exceeded,与服务端同名错误码的含义不同。connect.go:73-94;JSclient.ts:168-193;Pythonclient.py:197-211,260-264,292-299,345-421;JavaClient.java:170-203,261-292,344-474。queue_full;返回值只给 data;sendAt 与 delay 同时给时本地报 bad_request;停止后 send 立即失败;max_receive_bytes 在本地校验。[S-24] 取消或超时后发送仍留在队列,稍后仍可能送达(Go / Python / Java)
send.go:126-131;Pythonclient.py:323-324;JavaClient.java:316。send.go;Pythonclient.py;JavaClient.java复审基线:main
4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。按第二轮 SDK 审查修订了约定表(总审查人已对照代码核实):"重连退避"改为明确算法(原写法会把 JS 现有的双重翻倍带进四套),"rate_limited 重交退避"补充每次重新生成 rid,新增"logout"和"时长参数"两行。详见正文。
已合入 origin/main
0c9b459。落地提交3749b9bdocs: 写入 K-00 SDK 行为约定附录 (#57)。