当前位置: 首页 > news >正文

Go语言消息队列事务:Exactly-Once与At-Least-Once语义

Go语言消息队列事务:Exactly-Once与At-Least-Once语义

1. 消息语义

消息队列有三种传递语义:At-Most-Once(最多一次)、At-Least-Once(至少一次)和Exactly-Once(恰好一次)。

type DeliverySemantics int const ( AtMostOnce DeliverySemantics = 1 AtLeastOnce DeliverySemantics = 2 ExactlyOnce DeliverySemantics = 3 )

2. At-Least-Once实现

At-Least-Once需要消费者进行消息确认。

type AtLeastOnceConsumer struct { consumer *RabbitMQConsumer processed map[string]bool mu sync.RWMutex } func NewAtLeastOnceConsumer(consumer *RabbitMQConsumer) *AtLeastOnceConsumer { return &AtLeastOnceConsumer{ consumer: consumer, processed: make(map[string]bool), } } func (c *AtLeastOnceConsumer) Process(ctx context.Context, handler func([]byte) error) error { return c.consumer.ConsumeWithContext(ctx, func(msg []byte) error { msgID := generateMsgID(msg) c.mu.RLock() if c.processed[msgID] { c.mu.RUnlock() return nil } c.mu.RUnlock() if err := handler(msg); err != nil { return err } c.mu.Lock() c.processed[msgID] = true c.mu.Unlock() return nil }) } func generateMsgID(msg []byte) string { h := fnv.New32a() h.Write(msg) return fmt.Sprintf("%d-%d", time.Now().UnixNano(), h.Sum32()) }

3. Exactly-Once实现

Exactly-Once需要生产者和消费者配合,通过事务和幂等性保证。

type ExactlyOnceProducer struct { producer *RabbitMQProducer txn *amqp.Tx } func (p *ExactlyOnceProducer) PublishWithTransaction(ctx context.Context, routingKey string, body []byte) error { if p.txn == nil { tx, err := p.producer.conn.Channel().Tx() if err != nil { return err } p.txn = tx } err := p.producer.conn.Channel().PublishWithContext( ctx, p.exchange, routingKey, false, false, amqp.Publishing{ ContentType: "application/json", Body: body, DeliveryMode: amqp.Persistent, }, ) if err != nil { p.txn.Rollback() return err } return p.txn.Commit() } type IdempotentHandler struct { storage map[string]bool mu sync.RWMutex } func NewIdempotentHandler() *IdempotentHandler { return &IdempotentHandler{ storage: make(map[string]bool), } } func (h *IdempotentHandler) Handle(msgID string, handler func() error) error { h.mu.RLock() if h.storage[msgID] { h.mu.RUnlock() return nil } h.mu.RUnlock() if err := handler(); err != nil { return err } h.mu.Lock() h.storage[msgID] = true h.mu.Unlock() return nil }

4. 总结

本文介绍了At-Least-Once和Exactly-Once消息语义的实现方法,开发者应根据业务需求选择合适的传递语义。

http://www.jsqmd.com/news/782427/

相关文章:

  • 河北镀锌网片厂家质量排行:实测维度下的靠谱之选 - 奔跑123
  • 终极音乐格式转换指南:如何用 qmc-decoder 免费解锁QQ音乐加密文件
  • KeymouseGo:3步快速掌握免费鼠标键盘自动化,彻底解放你的双手!
  • 日本AND卤素水分仪靠谱代理商:如何甄别正规渠道? - 品牌推荐大师
  • Cursor AI 编辑器 MCP 工具集配置与实战指南
  • 2026最新卫生间门公司推荐!国内优质权威榜单发布,广东佛山等地公司实力可靠值得选择 - 十大品牌榜
  • 自动化运维新趋势:使用Ansible简化Linux管理
  • 2026年新国标铸铝门厂家排行榜|3大品牌实力拆解,工程选型口碑实力榜单测评 - 企业品牌优选推荐官
  • DownKyi:3步掌握B站视频批量下载与专业处理的完整方案
  • icode 星芒算法挑战赛20260508
  • 详细步骤教家长如何使用北师大家教中心网站发布家教信息 - 教育资讯板
  • 网盘直链下载助手终极指南:一键解锁八大网盘真实下载链接,告别龟速下载!
  • 2026脑电测量系统(EEG设备)避坑指南:新手必知的选购误区与供应商陷阱 - 品牌推荐大师
  • 2026年深圳港人驾考陪驾新趋势:纯直营零套路vs加盟乱象全解析 - 优质企业观察收录
  • 5分钟掌握拼多多数据采集:专业级电商爬虫系统搭建指南
  • 万齐福礼卡回收攻略,带你解读1分钟高效回收途径 - 可可收
  • 5个文件夹让Claude Code变身完整开发团队
  • 2026年三明治机源头厂家与华夫饼机源头工厂推荐:宁波红鹭智能-华夫饼机源头工厂推荐与采购要点解析 - 栗子测评
  • 终极指南:3步让AirPods在Windows电脑上实现完整功能体验
  • Docker部署OpenClaw:从环境准备到生产级任务编排实践
  • Go语言消息队列最佳实践:性能优化与生产部署
  • 济宁黄金回收哪家靠谱?6 大品牌覆盖 2 区 7 县 2 市,免费上门 + 实时金价 + 当场结 - 金掌柜黄金回收
  • CentOS 7 Docker Compose 多服务部署指南
  • 西安医学院考研辅导班推荐:排行榜单与选哪家好评测 - michalwang
  • 2026年深圳纯直营驾培避坑指南:宝华驾校如何用零隐形收费破局加盟乱象 - 优质企业观察收录
  • 从TikTok企业账号沦陷看“中间人钓鱼”攻击的防御之道
  • 如何高效使用XUnity.AutoTranslator:完整游戏翻译实战指南
  • 欧米茄中国区官方售后服务网点指南|2026年5月版 - 速递信息
  • 2026全国线下门店智能马桶星级全鉴|希箭领衔,健康卫浴的品质之选 - 江湖评测
  • 聊城大学考研辅导班推荐:排行榜单与选哪家好评测 - michalwang