refactor: 优化消息序号生成逻辑以确保唯一性

This commit is contained in:
sliverp
2026-01-30 11:21:29 +08:00
parent e513641305
commit 92fa3b89eb

View File

@@ -56,18 +56,21 @@ export function clearTokenCache(): void {
/** /**
* msg_seq 追踪器 - 用于对同一条消息的多次回复 * msg_seq 追踪器 - 用于对同一条消息的多次回复
* key: msg_id, value: 当前 seq 值 * key: msg_id, value: 当前 seq 值
* 使用时间戳作为基础值,确保进程重启后不会重复
*/ */
const msgSeqTracker = new Map<string, number>(); const msgSeqTracker = new Map<string, number>();
const seqBaseTime = Math.floor(Date.now() / 1000) % 100000000; // 取秒级时间戳的后8位作为基础
/** /**
* 获取并递增消息序号 * 获取并递增消息序号
* 返回的 seq 会基于时间戳,避免进程重启后重复
*/ */
export function getNextMsgSeq(msgId: string): number { export function getNextMsgSeq(msgId: string): number {
const current = msgSeqTracker.get(msgId) ?? 0; const current = msgSeqTracker.get(msgId) ?? 0;
const next = current + 1; const next = current + 1;
msgSeqTracker.set(msgId, next); msgSeqTracker.set(msgId, next);
// 清理过期的序号(超过 5 次或 60 分钟后无意义) // 清理过期的序号
// 简单策略:保留最近 1000 条 // 简单策略:保留最近 1000 条
if (msgSeqTracker.size > 1000) { if (msgSeqTracker.size > 1000) {
const keys = Array.from(msgSeqTracker.keys()); const keys = Array.from(msgSeqTracker.keys());
@@ -76,7 +79,8 @@ export function getNextMsgSeq(msgId: string): number {
} }
} }
return next; // 结合时间戳基础值,确保唯一性
return seqBaseTime + next;
} }
/** /**