一、相关概念
- MOM(Message-Oriented Middleware):面向消息的中间件,是一种分布式系统架构,用于在应用程序之间传递异步消息。
- MQ(Message Queue):消息队列,也被称为消息中间件。消息队列是典型的:生产者、消费者模型。 生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。 MQ通过异步发送和接收消息,实现了生产者和消费者的解耦。
- MQ的主要作用:异步、解耦、缓冲(削峰填谷)。
- JMS(Java Message Service):是一个Java平台中关于面向消息中间件(MOM)的API。JMS提供了两种消息模型,点对点和发布订阅。
- AMQP(Advanced Message Queuing Protocol):AMQP是一种协议,不从API层进行限定,而是直接定义网络交换的数据格式,具有跨语言和跨平台性。
- RabbitMQ是当前最流行,应用最广泛的面向消息的中间件之一。
- RabbitMQ是基于AMQP的一款消息管理系统,由Erlang语言编写,支持多种开发系统和编程语言。
二、RabbitMQ五种消息模型
RabbitMQ Tutorials | RabbitMQhttps://www.rabbitmq.com/tutorials
三、怎么避免消息堆积
1.使用Work Queues搭建消费者集群,配合能者多劳充分发挥每台服务器的性能。
spring.rabbitmq.listener.simple.prefetch=1
2.使用多线程消费。
spring.rabbitmq.listener.simple.concurrency=CPU核数
四、怎么避免消息丢失
1.生产者确认机制:确保消息到达MQ。
spring.rabbitmq.publisher-confirm-type=correlated(异步非阻塞方式)
this.rabbitTemplate.setConfirmCallback(ConfirmCallback)/setReturnsCallback(ReturnsCallback)
2.消息持久化:不会因为MQ服务器宕机导致消息丢失。
springAMQP默认交换机持久化、队列持久化、消息持久化,不需要手动设置。
3.消费者确认机制:保证消费者正确无误地消费。
spring.rabbitmq.listener.simple.acknowledge-mode=manual
channel.basicAck/basicNack/basicReject()
五、死信队列和延时队列
出现以下三种情况就会变成死信(Dead Letter):
1.channel.basicNack或channel.basicReject的requeue被设置为false。
2.生存时间已到的消息。
3.消息队列满了依然有消息入队,淘汰最老的消息。
延时队列一般和死信队列一起使用。