zoukankan      html  css  js  c++  java
  • 主流的消息中间件有哪些?

    注:文章内容输出来源--拉勾教育Java高薪训练营;

    转自:https://zhuanlan.zhihu.com/p/269823523

    1. 什么是消息中间件

    灵魂发问:什么是消息中间件?

    维基百科对消息中间件的解释:面向消息的系统(消息中间件)是在分布式系统中完成消息的发送和接收的基础软件。消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。

    2. 消息中间件选择

    有哪些主流的消息中间件?

    当前业界比较流行的开源消息中间件包括:ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等,其中应用最为广泛的要数RabbitMQ、RocketMQ、Kafka 这三款。Redis在某种程度上也可以是实现类似 “Queue” 和“ Pub/Sub” 的机制,严格意义上不算消息中间件。

    消息中间件各有优劣,我么应该怎么选择呢?

    1、首先,产品应该是开源的。开源意味着如果队列使用中遇到bug,可以很快修改,而不用等待开发者的更新。

    2、其次,产品必须是近几年比较流行的,要有一个活跃的社区。这样遇到问题很快就可以找到解决方法。同时流行也意味着bug较少。流行的产品一般跟周边系统兼容性比较好。

    3、最后,作为消息队列,要具备以下几个特性:

    • 消息传输的可靠性:保证消息不会丢失。
    • 支持集群,包括横向扩展,单点故障都可以解决。
    • 性能要好,要能够满足业务的性能需求

    3. RabbitMQ

    RabbitMQ 开始是用在电信业务的可靠通信的,也是少有的几款支持AMQP协议的产品之一。

    优点:

    1. 轻量级,快速,部署使用方便
    2. 支持灵活的路由配置。RabbitMQ中,在生产者和队列之间有一个交换器模块。根据配置的路由规则,生产者发送的消息可以发送到不同的队列中。路由规则很灵活,还可以自己实现。
    3. RabbitMQ的客户端支持大多数的编程语言。

    缺点:

    1. 如果有大量消息堆积在队列中,性能会急剧下降
    2. RabbitMQ的性能在Kafka和RocketMQ中是最差的,每秒处理几万到几十万的消息。如果应用要求高的性能,不要选择RabbitMQ。
    3. RabbitMQ是Erlang开发的,功能扩展和二次开发代价很高。

    4. RocketMQ

    RocketMQ 是一个开源的消息队列,使用 java 实现。借鉴了 Kafka 的设计并做了很多改进。

    优点:

    1. RocketMQ 主要用于有序,事务,流计算,消息推送,日志流处理,binlog分发等场景。经过了历次的双11考验,性能,稳定性可可靠性没的说。
    2. RocketMQ 几乎具备了消息队列应该具备的所有特性和功能。
    3. java 开发,阅读源代码、扩展、二次开发很方便。
    4. 对电商领域的响应延迟做了很多优化。在大多数情况下,响应在毫秒级。如果应用很关注响应时间,可以使用RocketMQ。
    5. 性能比RabbitMQ高一个数量级,每秒处理几十万的消息。

    缺点:

    1. 跟周边系统的整合和兼容不是很好。

    5. Kafka

    Kafka的可靠性,稳定性和功能特性基本满足大多数的应用场景。跟周边系统的兼容性是数一数二的,尤其是大数据和流计算领域,几乎所有相关的开源软件都支持Kafka。Kafka是Scala和Java开发的,对批处理和异步处理做了大量的设计,因此Kafka可以得到非常高的性能。它的异步消息的发送和接收是三个中最好的,但是跟RocketMQ拉不开数量级,每秒处理几十万的消息。如果是异步消息,并且开启了压缩,Kafka最终可以达到每秒处理2000w消息的级别。

    优点:

    1. 支持多个生产者和消费者
    2. 支持broker的横向拓展
    3. 副本集机制,实现数据冗余,保证数据不丢失
    4. 通过topic将数据进行分类
    5. 通过分批发送压缩数据的方式,减少数据传输开销,提高吞高量
    6. 支持多种模式的消息
    7. 基于磁盘实现数据的持久化
    8. 高性能的处理信息,在大数据的情况下,可以保证亚秒级的消息延迟
    9. 一个消费者可以支持多种topic的消息
    10. 对CPU和内存的消耗比较小
    11. 对网络开销也比较小
    12. 支持跨数据中心的数据复制
    13. 支持镜像集群

    缺点:

    1. 由于是批量发送,所以数据达不到真正的实时
    2. 对于mqtt协议不支持
    3. 不支持物联网传感数据直接接入
    4. 只能支持统一分区内消息有序,无法实现全局消息有序
    5. 监控不完善,需要安装插件
    6. 需要配合zookeeper进行元数据管理
    7. 会丢失数据,并且不支持事务
    8. 可能会重复消费数据,消息会乱序,可用保证一个固定的partition内部的消息是有序的,但是一个topic有多个partition的话,就不能保证有序了,需要zookeeper的支持,topic一般需要人工创建,部署和维护一般都比mq高
  • 相关阅读:
    003-结构型-01-适配器模式(Adapter)
    java-mybaits-013-mybatis-Interceptor-拦截器执行顺序
    java-mybaits-012-mybatis-Interceptor-拦截器读写分离四种实现方案
    002-poi-excel-导出设置单元格数据校验规则、筛选功能
    001-poi-excel-基础、单元格使用操作
    大数据Hadoop第八周——Wordcount程序的运行+Spark下载解压+Scala语言环境和简介
    大数据Hadoop第七周——Eclipse环境下java语言mapreduce程序开发环境配置+WordCount.java详解...
    大数据Hadoop第六周——启动集群并验证
    大数据Hadoop第五周——Hadoop系统配置、启动Hadoop集群
    大数据Hadoop第四周——免密钥登录设置、配置java和hadoop环境
  • 原文地址:https://www.cnblogs.com/4AMLJW/p/zhuliuzhongjianjian.html
Copyright © 2011-2022 走看看