丢数据的三个场景:生产者丢失,mq自己丢失,消费者丢失
- 生产者丢失:
- 第一种消息发送前开启事务,发生异常就回滚事务
- 第二种开启confirm模式,每次写得消息都会分配一个唯一的id,写入mq之后会回传acK消息,失败回调用nack接口,可以根据这重新处理这个消息
两种处理方式的区别:事务机制是同步的,提交一个事务会阻塞的,而confirm机制是异步的,发送消息之后还能发送下一个消息,一般使用confirm 机制
- mq丢失:
对消息队列和交换机持久化,并且发送消息的是deliveryMode 设置为2(1是不持久化)
- 消费者丢失:
使用rabbitmq提供的ack机制,首先关闭rabbitmq的自动ack,然后每次在确保处理完这个消息之后,在代码里手动调用ack。这样就可以避免消息还没有处理完就ack。
spring-cloud-stream 整合依赖
// javax.el
compile ('org.glassfish.web:javax.el:2.2.4') {
exclude group: 'javax.el', module: 'javax.el-api'
}
//rabbitmq
compile 'org.springframework.cloud:spring-cloud-starter-stream-rabbit'
compile 'org.springframework.cloud:spring-cloud-stream'