c#如何实现幂等消费_c#幂等消费的几种常见用法

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

相关推荐
wno70422 分钟前
Spring Security权限控制
java·python·spring
ShineWinsu1 小时前
对于Coze—AI:SDK的解析
人工智能·python·ai·sdk·项目·coze·字节跳动
IvorySQL1 小时前
IvorySQL 5.6 发布:PG 18.6 内核升级,沙盒即开即用
数据库·人工智能·postgresql
右耳朵猫AI1 小时前
Python周刊2026W38 | 标准流编码修复、PEP 845/846 草案、解析器提速 10%、集合字典二次复杂度
python·ai·数据科学
微软技术分享1 小时前
大模型网络结构:模型接口测试用例参考
python
CNSSIRD数据库2 小时前
中国企业环境信用数据库2003-2026
大数据·数据库·数据分析·论文笔记
Bruce_Liuxiaowei3 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
做运维的阿瑞3 小时前
Python 标准库汇总:分类速览与常用模块清单
linux·运维·python
fd32003 小时前
达梦数据库更新统计信息后仍走旧执行计划解决方案
数据库
why-geo3 小时前
Hermes Agent 与 Python 的会产生什么样的碰撞
人工智能·python·ai编程