一.rabbitmq publisher(生产者)注意的几个点
1.深刻理解异步模式
1.1默认情况,publisher->server,server不会将publisher的请求的执行情况,返回给publisher。换句话说,默认,publisher只知道执行了生产消息的动作,不知道server是否已成功存储msg,更不知道msg是否已被consumer消费。
1.2如果,使用confirm模式,publisher->server,server只会告知publisher,是否接收到了请求。publisher只知道server接收到了msg,但不知道msg是否成功存储到queue。
1.3如果,使用了mandatory标志位,publisher->server,server会告知publisher,是否正确找到对应的queue,并把msg保存到了queue中。
1.4如果,使用了immediate标志位,publisher->server,server上如果该消息关联的queue上有消费者,则马上将消息投递给它,如果所有queue都没有消费者,直接把消息返还给生产者,不用将消息入队列等待消费者了。RabbitMQ 3.0.0以后的版本中去掉了immediate参数支持

2.关于失败重连模式
2.1最简单方式,捕获异常,判断异常信息,重新连接。try.....,except,(catch)。
2.2也可以调用对应的类对象,实现重连。比如java client 方法
ConnectionFactory factory = new ConnectionFactory();
factory.setAutomaticRecoveryEnabled(true); //设置网络异常重连
factory.setNetworkRecoveryInterval(10000);//设置 没10s ,重试一次
factory.setTopologyRecoveryEnabled(true);//设置重新声明交换器,队列等信息。
#http://www.rabbitmq.com/nightlies/rabbitmq-java-client/current-javadoc/

3.关于持久化
3.1msg,交换器,队列,都做持久化是保证msg被持久化的条件之一。
3.2需要配置confirm模式及mandatory标志位,保证msg被存储到queue中(见1.4)

4.关于集群写入数据模式
4.1rabbitmq底层,采用mnesia分布式数据库,存储数据。
4.2有镜像队列的集群中msg的写入,mnesia数据库事务模式有好几种,rabbitmq采用 sync_transaction 模式写入数据,来保证各个节点数据一致。
4.3虽然rmq,使用mnesia的sync_transaction模式,但是仔细研究两阶段事务提交协议,极个别情况下,也会出现,server反馈给client,master写入失败,但是其它节点写入成功的情况。也就说极个别情况,客户端会得到server写入失败的信息,实际是写入成功的。这种情况,client可能会再写一个msg。导致队列中消息重复。解决这个问题,需要消费者去保证,确定msg是否是已消费过的。
#http://my.oschina.net/hncscwc/blog/161762
#http://wqtn22.iteye.com/blog/1567715
#https://github.com/sky-big/RabbitMQ

5.关于集群中出现重复数据
5.1需要确认是不是publisher重复发送msg导致的。
5.2rmq底层采用mnesia数据库做存储。mnesia的事务执行的流程,存在这种可能性,即如果事务发起者节点本身挂掉了,远端节点间会相互询问事务的最终执行结果,如果有节点成功提交,那么其他节点也会得到通知并执行提交动作,相反如果没有节点成功提交,那么所有节点都会终止该事务的提交。
这种情况,“有节点成功提交,那么其他节点也会得到通知并执行提交动作”会导致整个集群节点事务提交成功.
但因为master挂了,publisher会获取到提交事务失败。之后如果publisher重试,重新发送msg,这就导致msg是重复的。
5.3publisher->server,server将msg存储完之后,server宕机,没有将最后的ack返回给publisher。这时,对client而言,写入失败,对server而言,写入成功。如果publisher重连其它节点,重写msg,就会导致msg重复。
5.4所以 msg/数据 是否重复,不应该由server保证,应该由应用方保证。金融类系统,需要注意。
#http://bravenewgeek.com/you-cannot-have-exactly-once-delivery/
#http://fengchj.com/?p=2367

rabbitmq publisher(生产者)注意的几个点相关推荐

  1. SpringBoot整合RabbitMQ(包含生产者和消费者)

    生产者 创建一个SpringBoot项目springboot-producer,作为RabbitMQ的生产者. 在pom文件中引入相关的依赖坐标 <dependency><group ...

  2. RabbitMQ 示例-生产者-消费者-direct-topic-fanout

    这是生产者和消费者2个项目, 包含 direct,topic,fanout模式下的消费,springboot + rabbitmq 代码地址:https://github.com/duende99/R ...

  3. Java笔记-RabbitMQ中生产者端confirm模式(异步模式)

    目录 基本概念 代码与实例 基本概念 异步模式:Channel对象提供的ConfirmListener()回调方法只包含deliverTag(当前Channel发出的消息序列号),需要自己为每一个Ch ...

  4. Java笔记-RabbitMQ中生产者端confirm模式

    目录 基本概念 代码与实例 基本概念 生产者将信号设置成confirm模式,一旦信道进入confirm模式,将有在该信道上面发布的消息都会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队 ...

  5. RabbitMQ实现生产者发送消息异步confirm

    一.生产者 /*** 异步确认生产者** @author : konsy* @date : 2022-04-12 17:04**/ public class ConfirmMessageProvide ...

  6. Spring整合RabbitMQ(包含生产者和消费者)

    生产者 创建一个MAVEN项目spring-exchange-producer作为消息队列的生产者 导入相关的依赖坐标 <dependencies><!-- https://mvnr ...

  7. springboot 与rabbitmq集成+生产者投递确认+消费者手动确认+TTL+死信队列+延时队列

    1.生产者的消息可靠性投递机制 1)springboot yml文件配置 spring:rabbitmq:host: 10.0.23.83username: lifwepassword: 123456 ...

  8. RabbitMQ 进阶 -- SpringBoot 集成 RabbitMQ实现生产者与消费者模式

  9. RabbitMQ入门学习系列(二),单生产者消费者

    友情提示 我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题.可以直接在公众号<爱码农爱生活 >留言.必定会再次 ...

最新文章

  1. 机器学习博士自曝:实验室「阉割」我的创造力,劝你别读
  2. 退市35年后,牛仔裤品牌李维斯要重新IPO了
  3. kettle大数据量读写mysql性能优化
  4. 安卓给string对象赋值_String 面试题!看完让你恍然大悟!
  5. 3种用python代码实现99乘法表
  6. Spark SQL CLI 运行
  7. ITK:过滤器Filter和ParallelizeImageRegion比较
  8. 1960 范德蒙矩阵(数学贪心)
  9. ABAP Text表的实现原理
  10. IEEE 754标准--维基百科
  11. day16-Dom提交表单以及其他
  12. 基于MaxCompute+PAI的用户增长方案实践
  13. 无法执行二进制文件: 可执行文件格式错误_VB中.frm .frx .vbp .vbw .scc文件都有什么作用,你知道么?...
  14. vmware虚拟的ubuntu18.04死机,尝试关闭时关机报“虚拟机xxx繁忙”
  15. echarts 柱状图如何不顶格_echarts柱状图如何中间对齐而不是底部对齐?
  16. oracle的merge into 的用法
  17. 通过自定义注解排除不需要过滤URL的方法
  18. java中怎么实现大小写转换(利用阿斯克码)
  19. Java - springboot中md5加解密工具类
  20. Redis之案例:省份列表(下)

热门文章

  1. 1.输出长春地铁1号线运行图
  2. 木马是如何入侵手机的
  3. oracle去掉谓词推入,消除谓词推进
  4. linux下 tftp卸载,linux下tftp使用方法
  5. C语言如何返回char类型,函数返回char类型数组,调用 函数后如何接收值?
  6. 【转】Android 手机连接台式电脑无线 Wi-Fi 上网
  7. 有奖征集丨向100万云开发者“秀肌肉”的机会来了
  8. 【转帖】Linux发行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGo
  9. 大数据早报:谷歌在印度孟买建首个云服务平台 MariaDB完成C轮2700万美元融资(11.3)
  10. Eureka Server和Eureka Client注册探秘