消息队列对本质
- 消息队列是一种先进先出的数据结构
- 常见对应用场景:削峰、解耦、异步
为什么要使用消息队列?
1.解耦:系统的耦合性越高,容错率就越低,比如电商系统,用户下单会调用支付系统,物流系统,库存系统等,其中一个出现问题那么整个系统也会崩溃,可用性会很低,影响使用体验。
2.异步:A收到请求调用BCD,BCD每一个子系统都会消耗一个写库的时间,加一起就会使整个系统变慢,这几乎是企业级项目中,不允许出现的情况。注意:如果返回数据依赖BCD,就不适用于使用队列。
3.流量削峰:某一个时间点,大量的请求打到同一个点。请求流量瞬间猛增,有可能将系统压垮,这种场景可以使用消息队列来削峰。把请求缓存到MQ。
各种队列产品的比较
特性 | ActiveMQ | RabbitMQ | RocketMQ | kafka |
---|---|---|---|---|
开发语言 | Java | erlang | java | scala |
单击吞吐量 | 万级 | 万级 | 十万级 | 十万级 |
时效性 | ms级 | us级 | ms级 | ms级以内 |
可用性 | 高(主从) | 高(主从) | 非常高(分布式) | 非常高(分布式) |
功能特性 | 成熟的产品,很多公司的老项目都在用,有较多的文档 | 并发能力强,性能极好,延时最低。GUI很多功能。 | MQ功能完善,因为是Java开发的,所以具备二次开发的能力,扩展性强。 | 只支持主要的mq功能,像一些消息查询,消息回溯的功能没有实现,在大数据领域应用很广。 |
消息队列的优缺点?
-
系统引用的外部依赖越多,可用性就越低,MQ一旦挂了,系统就不可用了。(保证mq高可用)
-
系统复杂度变高。
-
消息丢失、消息重复怎么处理。怎么保证消息传递的顺序性。
-
一致性问题。BC处理成功 D失败,数据不一致这种情况怎么处理?(分布式事务)
如何保证队列的高可用
-
核心就是搭建集群
-
RabbitMQ普通集群,镜像集群。
-
RocketMQ分布式架构。
如何保证消息不丢失。
- 生产者没有发送到broker
- 消息发送到broker之后,broker宕机导致内存中的消息数据丢失
- 消费者获得到信息,但消费者还没来得及处理,宕机了,但此时MQ中的消息已经被删除了。
- 解决方案:Confirm确认机制,ACK。
如何保证消息不被重复消费,消息的幂等性。
- 重复消费的根本原因是网络不可达