一、主流消息中间件介绍

1、ActiveMQ

  1. ActiveMQ是Apache出品,最流行的能力强劲的开源消息总线,并且它是一个完全支持JMS规范的消息中间件。

  2. 其丰富的API、多种集群构建模式使得它成为业界老牌消息中间件,在中小型企业中应用广泛!

  3. MQ衡量指标:服务性能、数据存储、集群架构

  4. 架构模式

    8cKw7Q.png

2、KAFKA

  1. Kafka是Linkedln开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。

  2. PageCache:Kafka的生产和读写都发生在PageCache中

  3. Kafka集群模式

    8cMNCR.png

3、RocketMQ

  1. RocketMQ是阿里开源的消息中间件,目前也已经孵化为Apache顶级项目,它是纯Java开发的,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流处理、binglog分发等场景。

  2. 集群拓扑

    8cQ8QP.png

4、RabbitMQ

  1. RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性高、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

  2. 架构模式

    8clAYj.png

5、几种中间件的比较

1、更新频率

  1. ActiveMQ:(最近两次时间间隔:113天)

    8c8Rnx.png

  2. Kafka:(最近两次时间间隔:17天)

    8c10K0.png

  3. RocketMQ:(最近两次次平均时间差:45天)
    20220422112804.png

  4. RabbitMQ:(最近两次平均时间差:26天)

    8c1vsP.png

  5. 综上:更新频率:Kafka>RabitMQ >RocketMQ>ActiveMQ

2、性能对比表

8c8XHf.png

3、如何选择

中小型软件公司,建议选RabbitMQ。一方面,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便。正所谓,成也萧何,败也萧何!他的弊端也在这里,虽然RabbitMQ是开源的,然而国内有几个能定制化开发erlang的程序员呢?所幸,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug,这点对于中小型公司来说十分重要。不考虑rocketmq和kafka的原因是,一方面中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以kafka排除。不考虑rocketmq的原因是,rocketmq是阿里出品,如果阿里放弃维护rocketmq,中小型公司一般抽不出人来进行rocketmq的定制化开发,因此不推荐。

大型软件公司,根据具体使用在rocketMq和kafka之间二选一。一方面,大型软件公司,具备足够的资金搭建分布式环境,也具备足够大的数据量。针对rocketMQ,大型软件公司也可以抽出人手对rocketMQ进行定制化开发,毕竟国内有能力改JAVA源码的人,还是相当多的。至于kafka,根据业务场景选择,如果有日志采集功能,肯定是首选kafka了。具体该选哪个,看使用场景。

4、对比

https://blog.csdn.net/zzzgd_666/article/details/80880537

二、初识RabbitMQ

RabbitMQ 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang语言编写的,并且RabbitMQ是基于AMQP协议的。

1、哪些大厂再用RabbitMQ,为什么?

  • 滴滴,美团,头条,去哪儿,艺龙…

为什么?也就是说RabbitMQ好在哪?

  • 开源、性能优秀、稳定性保障;
  • 提供可靠性消息投递模式(config)、返回模式(return);
  • 与SpringAMQP完美结合、API丰富;
  • 集群模式丰富,表达式配置,HA模式,镜像队列模式;
  • 保证数据不丢失的前提做到高可靠性、可用性。

2、RabbitMQ高性能的原因?

  • ==Erlang==语言最初在于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的。
  • Erlang的优点:==Erlang有着和原生Socket一样的延迟==;

3、什么是AMQP高级消息队列协议?

  • AMQP全称:Advanced Message Queuing Protocol

  • AMQP翻译:高级消息队列协议

  • AMQP定义:是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

  • AMQP协议模型

    8csdkd.png

4、AMQP核心概念

  • Server:又称Broker,接受客户端的连接,实现AMQP实体服务;
  • Connection:连接,应用程序与Broker的网络连接;
  • Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。
  • Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行装饰,比如消息的优先级、延迟等高级特性;Body则是消息体的内容。
  • Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个ExchangeQueue,同一个Virtual Host里面不能有相同名称的ExchangeQueue
  • Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列;
  • BingingExchangeQueue之间的虚拟连接,binding中可以包含routing key
  • Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息。
  • Queue:也称为Message Queue,消息队列,保存消息并将他们转发给消费者。

5、RabbitMQ的整体架构

8ccXNQ.png

6、RabbitMQ消息是如何流转的

8c2Mzn.png

7、安装RabbitMQ

7.1、参照以下两个

链接: https://blog.csdn.net/u014209205/article/details/80642210

8cRPkF.png

7.2、配置

8cRV61.png

8cR0hQ.png

7.3、部分讲解

8cRr1s.png

  • rabbitmqctl:增加队列,增加交换机,增加用户等操作,集群搭建等
  • rabbitmq-plugins:安装、启用插件
  • rabbitmq-server:启停服务,查看节点状态

7.4、端口说明

  • 5672:Java端通信端口号
  • 15672:管控台端口号
  • 25672:集群通讯端口号

三、命令行与管控台

1、基础操作

  • 关闭应用:rabbitmqctl stop_app
  • 启动应用:rabbitmqctl start_app
  • 重启应用:service rabbitmq-server restart
  • 节点状态:rabbitmqctl status
  • 添加用户:rabbitmqctl add_user username password
  • 列出所有用户:rabbitmqctl list_users
  • 删除用户:rabbitmqctl delete_user username
  • 清除用户权限:rabbitmqctl clear_permissions -p vhostpath username
  • 列出用户权限:rabbitmqctl list_user_permissions username
  • 修改密码:rabbitmqctl change_password username newpassword
  • 设置用户权限:rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*"
  • 创建虚拟主机:rabbitmqctl add_vhost vhostpath
  • 列出所有虚拟主机:rabbitmqctl list_vhosts
  • 列出虚拟主机上所有权限:rabbitmqctl list_permissions -p vhostpath
  • 删除虚拟主机:rabbitmqctl delete_vhost vhostpath
  • 查看所有队列信息:rabbitmqctl list_queues
  • 清除队列里的消息:rabbitmqvtl -p vhostpath purge_queue blue

2、高级操作

  • 移除所有数据:rabbitmqctl reset;要在 rabbitmqctl stop_app之后使用。
  • 组成集群命令:rabbitmqctl join_cluster <clusternode> [--ram]
  • 查看集群状态:rabbitmqctl cluster_status
  • 修改集群节点的存储形式:rabbitmqctl change_cluster_node_type disc | ram
  • 忘记节点(摘除节点):rabbitmactl forget_cluster_node [--offline]
  • 修改节点名称:rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2...]

3、管控台介绍

8fEWvV.png

8fE4DU.png