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 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

相关推荐
harmony&4 小时前
ETCD 存储系统实战:从单节点部署到 Kubernetes 高可用集群
数据库·kubernetes·etcd
2601_962066494 小时前
【玩转全栈】----Django模板的继承
数据库·django·sqlite
烂蜻蜓5 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
一只小bit5 小时前
Redis哨兵机制、主从复制与集群搭建与维护
数据库·redis·bootstrap
jay神5 小时前
【计算机毕业设计】基于Flask+Vue的电影数据可视化与智能推荐系统
前端·vue.js·python·信息可视化·flask·毕业设计·课程设计
满怀冰雪6 小时前
24-PaddleClas 模型评估、导出与推理部署入门
大数据·人工智能·python·深度学习·paddle
DeepVisionary12 小时前
谷歌 Gemini Omni 1.1 Flash 正式发布:4K 视频、40 秒场景延伸,视频生成进入按 token 计费时代
python·自动化
zlwool12 小时前
图纸管理选型避坑指南
数据库·erp·设备erp·非标机械
阡之尘埃12 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
海兰12 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融