c#如何实现幂等消费_c#幂等消费的几种常见用法
ConcurrentDictionary 无法保证幂等性因其不支持查-写-处理的原子操作且进程重启后丢失数据必须结合 Redis 或数据库持久化去重并设置合理过期时间。为什么 ConcurrentDictionary 加锁还不够用消息重复投递时仅靠 ConcurrentDictionary 记录已处理的 messageId 很容易漏判——它不保证操作原子性比如“查不存在 → 写入 → 处理业务”这三步之间仍有并发窗口。更糟的是进程重启后内存态的字典就清空了幂等直接失效。必须配合持久化存储如 Redis 或数据库做去重判断ConcurrentDictionary 只能作本地缓存加速查写必须是原子操作Redis 用 SET key value NX EXSQL 用带 WHERE NOT EXISTS 的插入或 INSERT ... ON CONFLICT DO NOTHINGPostgreSQL注意过期时间设置太短会导致误判重试消息为新消息太长则占用存储建议按业务重试窗口如 15 分钟 缓冲如 5 分钟设定IdempotentConsumer 类要不要自己封装自己写一个通用 IdempotentConsumer 类看似省事但容易陷入“过度抽象”陷阱——不同消息源Kafka、RabbitMQ、Azure Service Bus的确认机制、重试语义、消息元数据结构差异很大硬套同一接口反而增加出错概率。优先复用框架能力如 MassTransit 的 IdempotentConsumerFilter、NServiceBus 的 MessageDrivenSubscription 自带幂等支持若必须自研只封装“查重-执行-记录”骨架把存储访问和消息提取逻辑交给调用方传入 Func避免耦合具体中间件类型别在构造函数里初始化 Redis 连接或 DB context——它们不是线程安全的应每次从工厂获取数据库唯一约束怎么设才不崩用 UNIQUE(message_id) 是最常用的兜底手段但实际踩坑最多字段长度超限、大小写敏感、NULL 值冲突、复合键遗漏业务维度都会让约束失效或抛出意外异常。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能