什么是消息中间件
面向消息的系统(消息中间件)是在分布式系统中完成消息发送和接收的基本软件。 消息中间件,也称为消息队列,指使用高效可靠的消息传递机制进行与平台无关的数据交换,并基于数据通信进行分布式系统集成。 通过提供消息传递和消息队列模型,可以在分布式环境中扩展进程通信。
主流的消息中间件
目前业界流行的开源消息中间件有ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等,其中使用最广泛的有RabbitMQ、RocketMQ、kafket MQ Redis还可以在一定程度上实现“Queue”和“Pub/Sub”这样的结构,从严格意义上讲不是消息中间件。
这三款的区别:
官方链接RabbitMQ
RabbitMQ开始用于通信业务的可靠通信,也是为数不多的支持AMQP协议的产品之一。
优点:
重量轻、速度快、易于部署
支持灵活的路由配置。 RabbitMQ在生产者和队列之间有一个交换机模块。 根据配置的路由规则,生产者可以将发送的消息发送到不同的队列。 路由规则很灵活,也可以自己实现。
RabbitMQ的客户端支持大多数编程语言。
缺点:
在队列中积累大量消息时,性能会急剧下降
RabbitMQ的性能是Kafka和RocketMQ中最差的,每秒处理数万到数十万条消息。 如果APP应用程序需要高性能,请不要选择RabbitMQ。
RabbitMQ是Erlang开发的,功能扩展和二次开发的成本很高。
RocketMQ
RocketMQ是一个开源消息队列,使用java实现。 参考Kafka的设计进行了很多改进。
优点:
RocketMQ主要用于秩序、事务处理、流计算、消息推送、日志流处理、binlog分发等场景。 经过迄今为止的双11考验,据说性能、稳定性不可靠。
RocketMQ几乎具备了消息队列应该具有的所有特性和功能。
java开发对于阅读源代码、扩展和二次开发非常有用。
对电子商务领域的应对延迟进行了很多优化。 在大多数情况下,响应为毫秒级别。 如果APP应用程序关心响应时间,则可以使用RocketMQ。
性能比RabbitMQ高一位数,每秒处理数十万条消息。
缺点:
与外围系统的集成和兼容性不好。
Kafka
Kafka的可靠性、稳定性、功能特性满足大部分应用场景。 与外围系统的兼容性排在第一、第二位,特别是在大数据和流计算领域,大多数相关的开源软件都支持Kafka。 Kafka是由Scala和Java开发的,由于设计了大量的批处理和异步处理,Kafka可以获得非常高的性能。 其异步消息的发送和接收是三个中最好的,但与RocketMQ相差很大,每秒处理数十万条消息。 对于异步消息,打开压缩后,Kafka最终将达到每秒处理2000w消息的级别。
优点:
支持多个生产者和消费者
支持中介横向展开
复制集机制可实现数据冗馀,避免数据丢失
用主题分类数据
通过分割和发送压缩数据,减少数据传输开销,提高吞吐量
支持多种模式的消息
基于磁盘的数据持久化
高性能的处理信息在大数据的情况下能够保证子秒级的消息延迟
一个消费者可以支持多个主题的消息
CPU和内存消耗很少
网络开销也比较小
支持数据中心之间的数据复制
支持群集镜像
缺点:
由于批量发送,数据无法真正实时到达
mqtt协议不支持
不支持直接访问物联网传感数据
只能支持统一分区中的消息有序,而不能实现全局消息有序
监视不完整,需要安装插件
需要与zookeeper协作的元数据管理
数据丢失,不支持事务
数据可能会被重复消耗,消息顺序可能会混乱。 可以确保有序地创建单个固定分区内部的消息。 但是,如果一个主题有多个分区,则无法保证秩序。 需要zookeeper的支持。 topic一般需要人工创建,部署和维护比mq更高