RabbitMQ介绍
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。
RabbitMQ(Rabbit Message Queue)是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现;AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求较高的场景,对性能和吞吐量的要求还在其次。
Erlang语言最初用于交换机领域的架构模式,有着和原生Socket一样的延迟,这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的。
RabbitMQ提供了可靠的消息机制、跟踪机制和灵活的消息路由,支持消息集群和分布式部署。适用于排队算法、秒杀活动、消息分发、异步处理、数据同步、处理耗时任务、CQRS等应用场景。
RabbitMQ应用
- AMQP高级消息队列协议 : AMQP协议模型和核心概念
- Exchange :RabbotMQ: Exchange四种模式介绍
- 可靠性投递:RabbitMQ:生产端和消费端的可靠性投递解决方案
- Return机制:RabbitMQ:Return消息机制
- 消费限流:RabbitMQ:消费端限流
- 死信队列DLX: RabbitMQ:死信队列DLX介绍及演示
消费端的手动ack和nack
- 应用场景
消费端进行消费的时候,如果由于业务异常我们可以进行日志记录,然后进行补偿等;
如果由于服务器挂掉等严重问题,此时我们可以采取手动ack保障消费端消费成功;
消费端的重回队列
- 应用场景
某些情况下由于业务需要,对于没有成功处理的消息,我们需要把消息返回Broker,让消费端重新消费;
过期时间TTL:Time To Live
RabbitMQ支持消息的过期时间,在消息发送时可以指定过期时间;
RabbitMQ同事还支持队列的过期时间,从消息加入队列开始计时,只要超过了队列配置的超时时间,那么 就自动清除消息;
- 设置方式
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.deliveryMode(2)
.contentEncoding("UTF-8")
.expiration("10000") // 设置过期时间
.headers(headers)
.build();
Map<String, Object> map = new HashMap<String, Object>();
map.put("x-message-ttl",6000);
channel.queueDeclare(queueName, durable, exclusive, autoDelete, map);