Java学习-----消息队列
消息队列是分布式系统中重要的组件之一。使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。
使用消息队列主要有三点好处:
(1)通过异步处理提高系统性能(减少响应所需时间):用户提交请求后,服务器将其发送到消息队列后直接就给出响应,相较于传统的服务器收到请求后,对数据库进行处理,得到结果再响应这个流程,消息队列通过处理和响应的分离,大大提高了系统性能。
(2)削峰/限流:先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。
(3)降低系统耦合性:一个模块将信息放入消息队列中,其他模块再来消息队列中取走需要的信息,可以减少模块之间的依赖,大大降低耦合性。
消息队列主要采用两种方式:发布-订阅模式和点对点模式。如果把消息的提供者视为生产者,使用消息的部分视为消费者,那么这两个模式中,前者是一个生产者把生产的消息发布到消息队列中,多个消费者订阅消息;后者是一个生产者专门给一个消费者生产消息。
虽然消息队列好处多多,但也有一些显而易见的缺点:
系统可用性降低: 系统可用性在某种程度上降低,引入后,程序员需要额外考虑消息在传输中丢失的可能
系统复杂性提高: 加入消息队列后之后,程序员需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题
一致性问题: 消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是这也会导致出现消息队列会出现内容不一致的情况。
常见的消息队列主要有:ActiveMQ、RabbitMQ、RocketMQ、Kafka,其差异如下:
对比方向 | 概要 |
---|---|
吞吐量 | 万级的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比 十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。 |
可用性 | 都可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 kafka 也是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 |
时效性 | RabbitMQ 基于erlang开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。其他三个都是 ms 级。 |
功能支持 | 除了 Kafka,其他三个功能都较为完备。 Kafka 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准 |
消息丢失 | ActiveMQ 和 RabbitMQ 丢失的可能性非常低, RocketMQ 和 Kafka 理论上不会丢失。 |