• RabbitMQ、RocketMQ、Kafka常见消息队列不得不知道的事


    众所周知,目前的分布式系统中MQ已经成为了不可缺少的一部分,今天就来分析一下常见的消息队列以及他们的使用场景

    1. 什么是消息队列

    消息队列,一般我们会简称它为MQ(Message Queue)。消息队列是一种帮助开发人员解决系统间异步通信的中间件,常用于解决系统解耦和请求的削峰平谷的问题。
    消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3…对于消费者就会按照1,2,3…的顺序来消费。
    在这里插入图片描述

    2.消息队列的应用场景

    • 应用解耦:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
    • 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
    • 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况
    • 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理,增加系统的可扩展性

    3. 消息队列的两种模式

    3.1 点对点模式

    点对点模式下包括三个角色

    • 消息队列
    • 发送者 (生产者)
    • 接收者(消费者)

    每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,可以放在内存中也可以持久化,直到他们被消费或超时。
    在这里插入图片描述
    点对点模式特点:

    • 每个消息只有一个消费者,一旦被消费,消息就不再在消息队列中;
    • 发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
    • 接收者在成功接收消息之后需向队列应答成功,即发送回执ack,以便消息队列删除当前接收的消息;

    3.2 发布/订阅模式

    发布/订阅模式下包括三个角色:

    • 角色主题(Topic)
    • 发布者(Publisher)
    • 订阅者(Subscriber)

    消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被多个订阅者消费
    在这里插入图片描述
    发布/订阅模式特点:

    • 每个消息可以有多个订阅者;
    • 发布者和订阅者之间有时间上的依赖性
    • 为了消费消息,订阅者必须保持在线运行。

    4. 消息队列实现机制

    4.1 JMS

    • JMS(JAVA Message Service,Java消息服务)是一个Java平台中关于面向消息中间件的API
    • 允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息
    • 是一个消息服务的标准或者说是规范,是 Java 平台上有关面向消息中间件的技术规范
    • 便于消息系统中的 Java 应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口,简化企业应用的开发。
    • JMS 消息机制主要分为两种模型:PTP 模型和 Pub/Sub 模型

    4.2 AMQP

    AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。

    4.3 JMS VS AMQP

    在这里插入图片描述

    常见的消息队列产品

    RabbitMQ

    RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

    ActiveMQ

    ActiveMQ是由Apache出品,ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能

    RocketMQ

    RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进,消息可靠性上比 Kafka 更
    好。RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理等

    Kafka

    Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。
    在这里插入图片描述
    总结:

    • 中小型软件公司:
      建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便。但是也有一个问题,虽然RabbitMQ是开源的,国内又有几个能定制化开发erlang的程序员呢?不考虑rocketmq和kafka的原因是,一方面中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以kafka排除。不考虑rocketmq的原因是,rocketmq是阿里出品,如果阿里放弃维护rocketmq,中小型公司一般抽不出人来进行rocketmq的定制化开发,因此不推荐。
    • 大型软件公司:
      大型软件公司,具备足够的资金搭建分布式环境,也具备足够大的数据量。针对rocketMQ,大型软件公司也可以抽出人手对rocketMQ进行定制化开发,毕竟国内有能力改JAVA源码的人,还是相当多的。至于kafka,根据业务场景选择,如果有日志采集功能,肯定是首选kafka了。

    5 各中间件介绍

    kafka

    RabbitMQ

    RocketMQ

  • 相关阅读:
    Java获取本机IP地址的方法(内网、公网)
    数论——中国剩余定理及其扩展详解
    MySQL允许root远程登录
    为什么要进行数据治理
    Rockchip RK3399 - DRM crtc基础知识
    Codeforces Round #817 (Div. 4)(6/7)
    数组,数组方法及排序算法(冒泡排序,选择排序,快速排序)
    【FreeSwitch开发实践】media bug获取通话语音流
    python z3模块
    android studio 常见问题
  • 原文地址:https://blog.csdn.net/mr4569870/article/details/126619195