• RabbitMQ-如何保证消费不被重复消费?


    一 重复消息

    为什么会出现消息重复?消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复。

    1.1 生产时消息重复

    由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经接收到了消息。这时候生产者就会重新发送一遍这条消息。

    生产者中如果消息未被确认,或确认失败,我们可以使用定时任务+(redis/db)来进行消息重试。

    1.2消费时消息重复

    消费者消费成功后,再给MQ确认的时候出现了网络波动,MQ没有接收到确认,为了保证消息被消费,MQ就会继续给消费者投递之前的消息。这时候消费者就接收到了两条一样的消息。

    如何保证MQ的消费是幂等性的,需要结合具体的业务来看  :

      比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了(最好带有时间戳字段,每次更新都以时间戳为条件),你就别插入了,update一下好吧 

      比如你是写redis,那没问题了,反正每次都是set,天然幂等性  

      比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面加一个全局唯一的id,类似订单id之类的东西,然后你这里消费到了之后,先根据这个id去比如redis里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个id写redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。  

    我话讲完!谁赞成?谁反对?
  • 相关阅读:
    使用hadoop平台进行小型网站日志分析
    flume分布式日志收集系统操作
    map-reduce任务的执行流程
    linux设置定制器自动执行任务
    pig笔记
    hive操作记录
    hbase集群安装和shell操作
    Spark Streaming揭秘 Day24 Transformation和action图解
    Spark Streaming揭秘 Day23 启动关闭源码图解
    Spark Streaming揭秘 Day22 架构源码图解
  • 原文地址:https://www.cnblogs.com/wffzk/p/13467056.html
Copyright © 2020-2023  润新知