RabbitMQ作为主流的消息中间件,消息丢失可能源自生产者、RabbitMQ本身或消费端。为确保消息不丢失,我们需要采取一系列措施:生产者端:可启用事务或confirm机制。事务模式下,消息发送失败会回滚,confirm机制异步监控消息确认,超时或失败后重试。但需注意事务模式可能影响性能。
进一步优化Confirm机制,可以采用批量Confirm和异步Confirm方法。批量Confirm允许一次处理多个消息确认,提高确认效率。异步Confirm则允许在消息到达交换机后立即进行确认,但确认结果异步返回,提升系统响应速度。在业务环境中,消息积压处理还需关注消息丢失问题。
所以,如果你的业务中有以上列举的场景,或者类似的功能、性能需求,那么快快引入消息中间件来提升你的业务性能吧。引入消息中间件带来的一系列问题 虽然消息中间件引入有以上那么多好处,但是使用的时候依然会存在很多问题。
新消息并不仅仅是有人回复你或者给你发信息,通知也是以新消息的形式发给你的,有时候我也是这样,再点击的话,就会发现多了通知。还有,网页的记录是不能保存的,你就下个校内通吧,有什么消息马上提示,还可以像QQ一样有群。
1、在使用RabbitMQ做消息分发时,主要有三个概念要注意:Exchange,RoutingKey,Queue。
2、在架构和高可用性方面,Kafka利用ZooKeeper实现节点保活和主从切换,而RocketMQ舍弃ZK,自建NameServer,确保最终一致性。RabbitMQ的无主架构遵循AMQP协议,消息一旦消费即不可撤销,但集群模式需要根据性能需求进行调整。性能上,RocketMQ和Kafka性能相近,RabbitMQ在消息堆积时可能性能下降。
3、blackholed问题:当消息投递到未绑定队列或使用错误路由时,可能导致消息丢失。 ActiveMQ 作为JMS实现,它提供可靠消息传递。非持久化消息在内存和文件中,文件限制可能导致服务中断。 丢消息问题:非持久化消息堆积写入文件,若超过限制,可能导致消息丢失。
4、一般地,当发布端发送消息速度快于订阅端消费消息的速度时,队列中堆积了大量的消息,导致报警,就会触发流控机制。
1、在消费端实现幂等性,确保消息不被重复消费。常见做法包括:唯一ID + 指纹码机制:生成全局唯一ID并加指纹码,利用数据库主键去重。好处是实现简单,但高并发下存在性能瓶颈,可通过分库分表策略解决。Redis原子性:使用Redis的setnx命令确保消息唯一性。需考虑数据一致性与缓存同步策略。
2、如果要保证一致性,需要生产者在失败后重试,不过重试又会导致消息重复的问题,一个解决方案是每个消息给一个唯一的id,通过服务端的主动去重来避免重复消息的问题,不过这一机制目前Kafka还未实现。
3、在工程实践上,为了保障系统的可用性,互联网系统大多将强一致性需求转换成最终一致性的需求,并通过系统执行幂等性的保证,保证数据的最终一致性。但在电商等场景中,对于数据一致性的解决方法和常见的互联网系统(如 MySQL 主从同步)又有一定区别,群友的讨论分成以下 6 种解决方案。