rabbitmq常见问题
概念
RabbitMQ消息中间件,采用的是erlang语言,而这个语言就本身就是支持并发的。
在项目中运用的场景是我们对于订单数据修改时,需要把订单的状态同步到第三方系统,在这个对接的过程中,我们将消息发送到RabbitMQ上,而RabbitMq再把消息推送到第三方系统
几种模式
- 单发送单接收
- 单发送多接收
- 发布订阅模式
- 按topic发送接收
保证数据不丢失
在发送消息的时候,消费信息的过程中,在三个地方可能存在的问题
1.发送时,消息由于网络问题,半路就会搞丢了
解决办法:
- a.同步:采用事物管理,开始事物,在发送消息的时候,如果mq没有接受到消息,抛出异常,本地捕捉异常并重试
- b.异步:写入时可以调本地接口,确定机制(建议使用)
2.MQ服务器本身的问题,如果他还没有来得及把消息发送消费端就挂了,这个时候消息就丢了
解决办法:(持久化操作)
- a.创建队列时,设置其为持久化
- b.消息的deliveryMode为2
3.在消费的时候,消息由于网络问题,半路搞丢
解决办法:
消息者在接收到消息先执行业务代码,等结束时,再告诉服务器已经执行完,再执行删除操作
如何避免数据重复消费
这个rabbitmq认为不是服务器的问题,而是我们代码的问题
所以我们解决办法就是在消费端进行控制,拥有一个业务id,人工去重/
程序的道路上一去不复返