1、异步通信 :
想向队列中 放入多少消息就放多少,然后再需要的时候再去处理它们。
2、解耦:
3、冗余:
有些情况下,处理数据的过程会失败,除非数据被持久化,否则将造成丢失。
4、扩展性:
5、过载保护:
MQ能够使关键组件顶住突发的访问压力 ,而不会因为突发的超负荷请求而完全崩溃。
6、可恢复性:
MQ降低进程间的耦合度,即使一个消息挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
7、顺序保证:
大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。
8、缓冲:
消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲 有助于控制和优化数据流经过系统的速度。以调节系统响应时间。
9、数据流处理:
分布式系统产生的海量数据流: 业务日志监控数据,用户行为,等。针对这些数据流 进行定时批量采集汇总。
《RabbitMQ实际操作》
1. 消息队列的作用与使用场景
异步:批量数据异步处理(批量上传文件)
削峰:高负载任务负载均衡(电商秒杀抢购)
解耦:串行任务并行化(退货流程解耦)
广播:基于Pub/Sub实现一对多通信
2. 多个消费者监听一个队列时,消息如何分发
轮询
默认的策略,消费者轮流,平均地接收消息
公平分发
根据消费者的能力来分发消息,给空闲的消费者发送更多消息
3. 无法被路由的消息去了哪里
无设置的情况下,无法路由(Routing key错误)的消息会被直接丢弃
解决方案:
将mandatory设置为true,并配合ReturnListener,实现消息的回发
声明交换机时,指定备份的交换机
4. 消息在什么时候会变成死信
消息拒绝并且没有设置重新入队
消息过期
消息堆积,并且队列达到最大长度,先入队的消息会变成DL
5. RabbitMQ如何实现延时队列
利用TTL(队列的消息存活时间或者消息存活时间),加上死信交换机
6. 如何保证消息的可靠性投递
发送方确认模式:
将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。
7. 消息幂等性
生产者方面:可以对每条消息生成一个msgID,以控制消息重复投递
高并发下RabbitMq消息中间件你应该介么玩!
什么是削峰限流场景:
秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
作用:
可以控制活动人数,超过此一定阀值的订单直接丢弃(我为什么秒杀一次都没有成功过呢)
可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)
什么是应用解耦
场景:
双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口。
缺点:
当库存系统出现故障时,订单就会失败
消息队列
消息队列(Message Queue,简称 MQ),高可用分布式集群技术,提供消息发布订阅、消息轨迹查询、定时(延时)消息、资源统计、监控报警等一系列消息云服务,是企业级互联网架构的核心产品
为什么选择RabbitMq?
ZeroMQ :
扩展性好,开发比较灵活,采用C语言实现,不能数据持久化
ActiveMQ:
历史悠久的开源项目,已经在很多产品中得到应用,对队列数较多的情 况支持不好,容易出现丢消息. 4000并发
Redis:
做为一个基于内存的K-V数据库,其提供了消息订阅的服务,可以当作MQ来使用,目前应用案例较少,且不方便扩展
RocketMQ:
阿里巴巴的MQ中间件,在其多个产品下使用,可查询的资料相当少,不全面
RabbitMQ :
结合erlang语言本身的并发优势,性能较好,管理端页面功能丰富,消息延迟微秒级,支持多种语言且支持AMQP客户端