前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

文章目录

  • 什么是幂等性
  • 什么是消息的幂等性
  • 为什么会出现消息幂等性问题
  • 该如何解决消息幂等性问题
  • 总结

在分布式系统中,消息队列是一个常用的组件,用于解耦发送者和接收者之间的耦合。在消息队列中,保证消息幂等性是一个重要的问题,因为重复处理相同的消息可能会导致系统的状态不一致或者数据的错误。

什么是幂等性

幂等性是指对同一个操作进行多次执行所产生的影响相同,即多次执行和一次执行的效果是一样的。在计算机领域中,幂等性通常用于描述某个操作或请求的性质。

具有幂等性的操作或请求可以安全地执行多次,而不会引起任何不良的影响。无论操作执行多少次,系统的状态都应该保持一致,这样就能保证系统的正确性和可靠性。

举例来说,一个银行账户的存款操作就具有幂等性。无论进行多少次存款操作,最终的结果都是账户余额增加相应的金额。因此,即使存款操作被执行多次,也不会引起账户余额的错误或不一致。

在分布式系统中,保证操作的幂等性对于保证系统的正确性和可靠性非常重要。例如,在使用消息队列时,保证消息的幂等性可以避免同样的消息被重复处理或消费,从而保证系统的稳定性和可靠性。

什么是消息的幂等性

消息队列消息的幂等性是指在使用消息队列进行消息传递时,对于同一条消息的处理不会因为重复消费或处理而导致系统状态的错误或不一致。换句话说,如果一个消息队列消息是幂等的,那么在同一条消息被处理多次时,系统状态不会受到任何负面影响。

为什么会出现消息幂等性问题

消息队列出现消息幂等性问题的主要原因是消息重复发送。这种情况可能发生在以下情况下:

  1. 生产者重复发送消息:由于网络不稳定或其他异常情况,生产者可能会发送同样的消息多次。
  2. 消息队列本身的问题:由于消息队列本身的问题,消息可能会被重复发送。
  3. 消费者的问题:由于消费者的问题,消息可能会被重复消费。

无论是哪种情况,都会导致消息的重复处理,从而破坏了消息处理的幂等性。因此,在设计消息队列时需要考虑如何保证消息的幂等性,以避免这种问题的发生。

该如何解决消息幂等性问题

下面是一些保证消息队列中消息幂等性的方法:

  1. 消息去重
    消息队列通常会在消息发布之前进行去重操作,这样可以确保相同的消息只被传递一次。在消息队列中,比如 常用的去重方式有两种:

    • 通过消息唯一标识符实现去重:在消息中添加唯一标识符,例如UUID,消费者在消费消息的时候,先查询消息是否已经被消费,如果已经被消费,则直接忽略该消息。
    • 通过消息摘要实现去重:在消息中添加摘要信息,例如消息内容的哈希值,消费者在消费消息的时候,先查询摘要信息是否已经存在,如果已经存在,则直接忽略该消息。

    去重的方式有好几种,大体上的思想和上面两种是相同的,比如基于版本号、时间戳等,都是通过数据库或者缓存来记录消息ID或者内容,每次进行消息消费时,先查数据库或者缓存中是否有消费记录,有的话就不再消费,避免重复消费。

  2. 消息确认机制
    消息确认机制是指当消费者从消息队列中获取到一条消息后,需要向消息队列确认(ack)已经消费完成。只有在确认完成后,消息队列才会将该消息从队列中移除,并且不会再次发送给其他消费者。
    通过消息确认机制,可以保证每个消息只被处理一次,避免重复消费。

  3. 限制消费者数量
    一些消息队列支持限制消费者数量,只允许一个消费者处理一个特定的消息。当消息被消费者处理时,其他消费者无法再处理该消息,从而避免了重复消费的问题。

  4. 消息处理状态标记
    当接收方从消息队列中获取到消息时,它需要对消息进行处理,并将处理结果保存在数据库或者其他存储介质中。同时,还需要在消息队列中记录该消息的处理状态,比如将消息的状态设置为“已处理”。
    这样做的好处是,即使消息被重复消费,也不会对系统造成影响,因为每次消费都会判断消息的处理状态,如果已经处理过了,就直接跳过。

  5. 事务消息
    事务消息可以保证消息仅被处理一次。在发送事务消息时,消息发送方先发送一条半事务消息,等到消息处理完毕之后再发送一条确认消息。只有确认消息发送成功,半事务消息才算发送成功,否则半事务消息将在一定时间内重发,直到发送成功或者达到最大重试次数。通过这种方式可以避免消息重复发送或重复处理。

  1. 分布式锁
    在消息队列中,由于消费者可能存在多个实例,因此需要考虑分布式锁的问题。分布式锁可以保证同一时间只有一个消费者实例处理消息,从而避免重复消费的问题。
    具体实现如下:

    1. 在发送消息之前,使用分布式锁来获取一个唯一标识符。
    2. 将该唯一标识符作为消息的 ID,并将其发送到消息队列中。
    3. 当消费者接收到消息时,再次使用该唯一标识符来获取分布式锁。
    4. 如果分布式锁获取成功,则表示该消息没有被处理过,可以继续进行业务逻辑处理。
    5. 如果分布式锁获取失败,则表示该消息已经被其他消费者处理过,直接忽略即可。

总结

消息队列可以通过以上多种方式来保证消息的幂等性和可靠性。需要根据具体的业务场景来选择合适的方式来保证消息的可靠传输和处理。

消息队列如何保证消息的幂等性相关推荐

  1. 你的消息队列如何保证消息不丢失,且只被消费一次,这篇就教会你

    我们将消息队列这个组件加入到了我们的商城系统里,并且通过秒杀这个实际的案例进行了实际演练,知道了它对高并发写流量做削峰填谷,对非关键业务逻辑做异步处理,对不同的业务系统做解耦合. 场景: 现在我们的电 ...

  2. 消息队列怎么保证消息有没有重复消费(幂等性)?

    普通业务控制幂等性 1.mysql唯一索引 2.token机制(请求前生成一个token,请求时携带这个token,如果这个token在redis中没有则继续,有则 有请求进行中) 3.mysql悲观 ...

  3. 分布式消息队列如何保证消息有且仅被消费一次?

    自己总结,仅供参考 一.保证消息生产成功.未丢失 这个要从生产者与MQ的角度去保证 1.生产者 生产者投递消息后,等待mq的消息接收成功ack(同步或者异步形式),成功则代表生产成功,失败则重试: 另 ...

  4. javax消息队列_Java面试—消息队列

    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得. 题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一 ...

  5. 消息队列 策略_消息模型:主题和队列有什么区别?

    首发公众号 可以看到,技术圈的风向一直在变,大数据.云的热度已经在慢慢消退,现在当红的是 AI 和 IoT.这些火热的概念,它最终要从论文和 PPT 落地,变成真正能解决问题的系统,否则就是一个空中楼 ...

  6. python消息队列中间件_python-RabbtiMQ消息队列

    1.RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之 ...

  7. mfc 消息消息队列概念_消息队列面试连环问

    最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息队列有哪些核心注意点. ...

  8. 面试精讲之面试考点及大厂真题 - 分布式专栏 15 如何解决消息重复,保证消息顺序问题

    15如何解决消息重复,保证消息顺序问题 自信和希望是青年的特权. --大仲马 引言 我在<12.项目中为什么要使用消息队列>中列举了两个使用消息队列的例子. (1)收银系统,确认收款成功, ...

  9. springboot集成阿里MNS消息队列发布订阅消息功能

    声明: 上一篇文章是springboot集成阿里ons发布订阅消息,此篇文章是mns发布订阅功能先简单记录一下ons与mns有什么区别 这里是在网上找的对比图: 此处为具体区别文章链接:点击打开链接 ...

最新文章

  1. keepalived介绍
  2. C#、VSTO讀取Excel類
  3. python之路-day19-面向对象之约束
  4. 在Android Native层中创建Java虚拟机实例
  5. 计算机制片管理系统,Agile Shot:新一代影视制片流程管理系统大揭秘
  6. HTTP协议之http状态码详解
  7. 利用 apache ab 测试服务器性能
  8. mysql按加号没反应_请各位大哥给小老弟解疑答惑一下 为什么点击加号没有反应?感谢...
  9. 用命令创建表空间、用户,并为用户授权、收回权限。
  10. 轻量级RTSP服务SDK
  11. 计算机专业英语读书报告,英语读书报告怎么写
  12. linux不写日志,linux 重要日志
  13. 深入理解分布式之抉择分布式锁
  14. Servlet详细介绍
  15. 月薪没过3W,肯定是没关注这几位大佬的公众号
  16. ThinkPHP5框架下载安装
  17. 全链路压测核心技术解析
  18. 【目标检测】YOLO系列——YOLOv1详解
  19. 微服务架构及解决方案
  20. php utf8(无bom),php中utf8 与utf-8 与utf8 无BOM

热门文章

  1. 20200607:根据中证800指数最近十年历史P/b分位数确认基金目标仓位
  2. Java中String转为Long
  3. java工程师主要是做什么的?我来聊聊如何提高自身的工作水平
  4. 知识图谱从入门到应用——知识图谱推理:基于表示学习的知识图谱推理-[嵌入学习]
  5. 2020个人网站搭建指南(华为云+wordpress)
  6. 初级会计报名-IE浏览器攻略
  7. Java课程设计-图书借阅管理系统
  8. gateway sentinel 熔断 不起作用_熔断器怎么选择?看完这篇文章我恍然大悟!上海民熔...
  9. RabbitMQ六种工作模式
  10. mapset——C++