rabbitmq消费者集群情况下,怎么保证同一个消息只被一个消费者消费

解决方案 »

  1.   

    幂等是用全局id存redis吗?还是先去数据库查,有数据就return 
      

  2.   

    做法很多,可以根据业务决定,比如唯一键(业务中存在唯一的字段才行),比如消息体中丢一个uuid,存到一个做幂等的表中,uuid的字段做唯一键也可以保证重复执行不出问题,利用数据库事务保证唯一,或者加分布式锁+特定的查询来保证只执行一次
    第二个可以脱离业务做到通用,其他跟业务强相关
      

  3.   

    你不是topic的话只能被消费一次
      

  4.   

    瞎说?请教下哪里瞎说了
    你觉得你这个想法能在生产环境去用吗,用了消息就是要减轻数据库的压力,存到一个做幂等的表中,uuid的字段做唯一键也可以保证重复执行不出问题,利用数据库事务保证唯一,这张表的数据量你考虑过吗,效率
      

  5.   

    瞎说?请教下哪里瞎说了
    你觉得你这个想法能在生产环境去用吗,用了消息就是要减轻数据库的压力,存到一个做幂等的表中,uuid的字段做唯一键也可以保证重复执行不出问题,利用数据库事务保证唯一,这张表的数据量你考虑过吗,效率
    这张表可以定期清理,并不觉得会有多大数据量,可以单独做成一个组件,几乎没有增加额外的复杂度,你插到业务表,当然可以,但与业务代码耦合,表也增加了一个额外的字段和唯一约束,对数据库的压力并不见得比单独成表小,毕竟单独的表可以清理,可以truncate,你那个不能,表一大,索引维护也是很大成本的.
    不同取舍罢了,怎么是瞎说?而且mq是减轻数据库压力?在性能上是为了削峰填谷,架构上是解耦,mq并不会减少数据库操作次数,缓存才能大幅度减轻数据库压力,当然对数据库完全没好处是假的,但作用没那么明显罢了