/** * 消息去重服务 * 处理消息去重逻辑,防止重复处理相同的消息 */ import type { IMessageDeduplication } from './types'; import { PROCESSED_MESSAGE_ID_EXPIRY, PROCESSED_MESSAGE_ID_MAX_SIZE, } from './constants'; export class MessageDeduplication implements IMessageDeduplication { // 已处理消息ID集合(用于去重,防止ACK消息和正常消息重复处理) private processedMessageIds: Set = new Set(); private processedMessageIdsExpiry: Map = new Map(); /** * 检查消息是否已处理 */ isMessageProcessed(messageId: string): boolean { return this.processedMessageIds.has(messageId); } /** * 标记消息已处理 */ markMessageAsProcessed(messageId: string): void { this.processedMessageIds.add(messageId); this.processedMessageIdsExpiry.set(messageId, Date.now()); // 定期清理 if (this.processedMessageIds.size > PROCESSED_MESSAGE_ID_MAX_SIZE) { this.cleanupProcessedMessageIds(); } } /** * 清理过期的消息ID(防止内存泄漏) */ cleanupProcessedMessageIds(): void { const now = Date.now(); for (const [id, timestamp] of this.processedMessageIdsExpiry.entries()) { if (now - timestamp > PROCESSED_MESSAGE_ID_EXPIRY) { this.processedMessageIds.delete(id); this.processedMessageIdsExpiry.delete(id); } } } /** * 重置所有已处理的消息ID * 用于测试或需要清除缓存的场景 */ reset(): void { this.processedMessageIds.clear(); this.processedMessageIdsExpiry.clear(); } } // 单例导出 export const messageDeduplication = new MessageDeduplication();