文章目录
什么是消息中间件?
消息中间件是可以用来进行跨系统通信的一个软件,提供了可靠的异步通信机制。
目前常见的消息中间件有哪些?
目前常见的消息中间件有四种
- ActiveMQ
ActiveMQ是Apache开源的一款使用java编写的基于JMS规范的消息中间件,不过目前官方的维护似乎变得特变少了 - RabbitMQ
RabbitMQ是一款开源的使用ERLang开发的基于AMQP协议的消息中间件,社区活跃度还不错 - RocketMQ
RocketMQ是阿里团队开源的一款使用java编写的消息中间件 - Kafka
kafka是LinkedIn公司开发的一款使用scala语言编写的高性能消息中间件
各个消息中间件之间的对比
特点 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
社区活跃度 | 低 | 高 | 相对较高 | 高 |
性能 | 单机吞吐量在万级左右 | 单机吞吐量在万级左右,不过消息延迟特别低,在微秒级别 | 单机吞吐量可达到10w级别 | 单机的吞吐量可以达到10w级别 |
可靠性 | 可靠性相对来说低一点,有较低的概率丢失数据 | 可靠性非常高,基本上不会丢失数据 | 经过配置可以做到0丢失 | 经过配置可以做到0丢失 |
可用性 | 基于主从架构实现高可用 | 可以部署镜像集群,创建高可用队列保证可用性 | 分布式架构,可用性很高 | 也是分布式架构,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 |
功能完善情况 | 由于诞生早,支持的功能非常丰富 | 功能完善,而且有非常友好的web管理界面,插件支持丰富 | 功能比较完善,提供命令控制台管理 | 提供比较简单的MQ功能 |
主要使用场景 | 一般小型的公司,或者并发不高的场景都可以使用,不过现在社区活跃度不高了,不建议使用它 | 适用于中小型企业,以及对消息的可靠性要求高于吞吐量的场景 | 适用于高并发场景,并且公司实力强,有能力改源码 | 更多的是适用于日志采集的场景,在大数据,云计算领域使用的相对比较多 |
你使用过哪些消息中间件?
目前我还仅仅使用到了Rabbitmq
你为什么会选择使用RabbitMQ
基于我的业务场景来说,我选择使用rabbitmq是根据一下几点来考量的:
1、业务场景需要保证消息不能丢失,对可靠性要求比较高,所以我排除了ActiveMQ
2、业务的吞吐量本身并不是特别大,引入消息中间件主要是为了解耦和异步,所以我决定选择RabbitMQ
3、团队中有了解过RabbitMQ的人占多数,而我自身也是比较熟悉RabbitMQ,所以降低了开发的风险
你在使用的过程中都遇到了哪些问题?
在使用的过程中遇到了以下几个问题:
1、数据同步的时候消费者挂掉了
消费者挂掉的原因是因为内存溢出,为什么会内存溢出?
后面发现线停到消费者,然后等待队列里面堆积很多消息之后在启动消费者,发现不一会儿就会出现内存溢出,排查发现是因为没有使用QOS预取,导致了消息一下子全部被拉取到消费者,导致消费者内存溢出。
解决方案:设置QOS的值为300,重新发布消费者,没有出现内存溢出
2、消息丢失了
由于之前消费者挂掉,所有的消息都堆积到了队列里面,队列都已经堆积满了,溢出的消息却无处可去直接被丢弃了
解决方案:增加死信交换器和死信队列,溢出的消息会进入死信队列继续消费,同时也把队列和交换器以及消息做了持久化设置
使用消息中间件给系统带来了哪些弊端
1、系统的整体可用性降低了
由于引入了消息中间件,所以不得不去考虑消息中间件会挂掉的可能性,一旦消息中间件挂掉,那么系统就会不可用。
2、系统变得更复杂了
由于引入了一个消息中间件,从系统整体上来说又多了一个需要整合的模块,从开发上来说需要进行消息中间件代码的编写。