RabbitMQ学习笔记(一)

一、MQ介绍

1.1什么是MQ?

MQ(Message Quene) : 翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产 消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和 接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件通过利用高效可靠的消息传递机 制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。

1.2 MQ有哪些

当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴 自主开发 RocketMQ 等。

1.3 不同MQ特点

1.ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息队列。它是一个完全支持JMS规范的的消息 中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎!

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

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

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

RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少 量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。

二、RabbitMQ

2.1 RabbitMQ简介

1)RabbitMQ概念

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

AMQP 协议 AMQP(advanced message queuing protocol)`在2003年时被提出,最早用于解决金融领不同平台之 间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数 据格式。这使得实现了AMQP的provider天然性就是跨平台的。

2)AMQP核心概念

概念 说明
连接 Connection 一个网络连接,比如TCP/IP套接字连接。
会话 Session 端点之间的命名对话。在一个会话上下文中,保证“恰好传递一次”。
信道 Channel 多路复用连接中的一条独立的双向数据流通道。为会话提供物理传输介质。
客户端 Client AMQP连接或者会话的发起者。AMQP是非对称的,客户端生产和消费消息,服务 器存储和路由这些消息。
服务节点 Broker 消息中间件的服务节点;一般情况下可以将一个RabbitMQ Broker看作一台 RabbitMQ 服务器。
端点 AMQP对话的任意一方。一个AMQP连接包括两个端点(一个是客户端,一个是服 务器)。
消费者 Consumer 一个从消息队列里请求消息的客户端程序。
生产者 Producer 一个向交换机发布消息的客户端应用程序。

以下是AMQP协议模型:

 Publisher 推送消息前先与Server建立连接,找到Virtual host,然后将消息推送至Exchange交换机。 而交换机与Message Queue有绑定关系(一个交换机相当于一个独立的虚拟机,而这个虚拟机内的各种独立的 应用就相当于一个Queue,这个Queue与交换机绑定),Consumer通过绑定的对队列,而交换机也绑定了队 列。发送者将消息发送给交换机,这样就能完成消息的推送了。

RabbitMQ优点:

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

RabbitMQ高性能的原因?

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

2.2 RabbitMQ 的安装

官方下载网址:https://www.rabbitmq.com/download.html

 2.2.1 下载的安装包

注意: 这里的安装包是centos7安装的包

2.2.2 安装步骤

1)将相关依赖以及安装包上传到linux系统中

 2)安装Erlang依赖包

rpm -ivh openssl-libs-1.0.2k-19.el7.x86_64.rpm --force #依赖库
rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm

3)安装RabbitMQ安装包(需要联网)

rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm #依赖库
rpm -ivh rabbitmq-server-3.7.18-1.el7.noarch.rpm
或者
yum install -y rabbitmq-server-3.7.18-1.el7.noarch.rpm

注意:默认安装完成后配置文件模板在:
/usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example目录中,
需要将配置文件复制到/etc/rabbitmq/目录中,并修改名称为rabbitmq.config

4)复制配置文件

cp /usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example
/etc/rabbitmq/rabbitmq.config

5)查看配置文件位置

ll /etc/rabbitmq/rabbitmq.config

6)修改配置文件

vim /etc/rabbitmq/rabbitmq.config

 

 7)执行如下命令,启动rabbitmq中的插件管理

rabbitmq-plugins enable rabbitmq_management # 开启web控制台的访问

 8) 启动RabbitMQ的服务

systemctl start rabbitmq-server # 开启服务
systemctl restart rabbitmq-server # 重启服务
systemctl stop rabbitmq-server # 停止服务

9)查看服务状态

systemctl status rabbitmq-server

 10)关闭防火墙

systemctl disable firewalld
systemctl stop firewalld
-----------------------------------------
或者放开对应端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent
service firewalld restart (重启服务)

11)访问web管理界面

http://192.168.147.128:15672/

 

2.3 RabbitMQ web管理界面

connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况。

channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。

Exchanges:交换机,用来实现消息的路由。

Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。

1)创建虚拟主机

#虚拟主机

为了让各个用户可以互不干扰的工作,RabbitMQ添加了虚拟主机(Virtual Host)的概念。

这其实就是一个独立的访问路径,不同用户使用不同路径,各自有自己的队列、交换机,互相不会影响。

 2)用户管理

 注意:默认新建的用户不能询问任何虚拟主机,需要设置用户和虚拟主机的绑定。

上面的Tags选项,其实是指定用户的角色,可选的有以下几个:

超级管理员(aministrator):可登陆管理控制台,可查看所有的信息,并且可以对用户,

策略(policy)进行操作。

监控者(monitoring):可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,磁盘使用情况等)

策略制定者(policymaker):可以登陆管理控制台,同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

普通管理者(management):仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

其他:无法登陆管理控制台,通常就是普通的生产者和消费者。

3)绑定虚拟主机和用户

进入虚拟机设置页面

命令行与管控台–基础到高级操作

1.rabbitmqctl stop_app:关闭应用

2.rabbitmqctl start_app:启动应用

3.rabbitmqctl status:节点状态

------------------------------------------------------

1.rabbitmqctl add_user username password:添加用户

2.rabbitmqctl list_users:列出所有用户

3.rabbitmqctl delete_user username:删除用户

4.rabbitmqctl clear_permissions -p vhostpath username:清除用户权限

5.rabbitmqctl list_user_permissions username:列出用户权限

6.rabbitmqctl change_password username newpassword:修改密码

7.rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*":设置用户权限

--------------------------------------------------------

1.rabbitmqctl add_vhost vhostpath:创建虚拟主机

2.rabbitmqctl list_vhosts:列出所有虚拟主机

3.rabbitmqctl list_permissions -p vhostpath:列出虚拟主机上所有权限

---------------------------------------------------------

1.rabbitmqctl list_queues:查看所有队列信息

2.rabbitmqctl -p vhostpath purge_queue blue:清除队列里的消息

----------------------------------------------------------

1.rabbitmqctl reset:移除所有数据,要在rabbitmqctl stop_app之后使用

2.rabbitmqctl join_cluster [-ram]:组成集群命令

3.rabbitmqctl cluster_status:查看集群状态

4. rabbitmqctl change_cluster_node_type disc | ram  修改集群节点的存储方式

5. rabbitmqctl  forget_cluster_node [-offline]   忘记节点(摘除节点)

集群配置失败,故障转移等情况下可以将启动失败的节点给移除掉,

它可以在不启动的情况下完成对节点的摘除

1.rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2...](修改节点名称)

注意:命令行的操作能做的,可视化界面也可以做。

#1.服务启动相关

systemctl start | restart | stop | status rabbitmq-server

#2.管理命令行 用来在不使用web管理界面情况下命令操作RabbitMQ

rabbitmqctl help 可以查看更多命令

#3.插件管理命令行

rabbitmq-plugins enable | list | disable

2.4 RabbitMQ支持的消息模型

官网地址:http://www.rabbitmq.com/

官方教程:http://www.rabbitmq.com/getstarted.html

消息中间件的消息分为两类传输模式:点对点模型、发布/订阅模型

RabbitMQ在此基础上进行细化,提供了7种消息模型,但是第6种其实是RPC,

并不是MQ,第7种是最新版本才有的,企业中一般不会使用最新版本,因此6,7就不介绍了。

  • 点对点模型:同一消息只能被一个消费者接收
  • 发布/订阅模型:同一消息可以被多个消费者接收

 

 

 使用rabbitMQ的原生代码,在开发中绝对不用,因为后面我们学习Spring整合RabbitMQ,

用于理解rabbitMQ五种消息模型

1)简单消息模型

 ACK消息确认机制

自动回执(消费者一旦监听到消息,立马通知rabbitmq删除队列消息)

  • 消费者一旦拿到消息,立马发送回执
  • 当此业务不是主要的业务,数据不敏感,就可以使用自动回执

手动回执(消费者处理完业务逻辑后,再通知rabbitmq删除队列消息)

  • 消费者拿到数据之后,根据处理的结果,再看是否要发送回执
  • 当此业务是主要业务,不执行成功就会影响其他的业务,这时候就要使用手动回执。

2)Work消息模型

3 ) 订阅模型-Fanout

 4)订阅模型-Direct

5)订阅模型-Topic 

 通配符规则:

  •  #  :匹配一个或多个词
  •  *  :匹配不多不少恰好1个词

举例:

  • pro.#:能够匹配pro.insert.add或者pro.insert
  • pro.*:只能匹配pro.insert

6)持久化机制

如何避免消息丢失?

1)消费者的ACK机制,可以防止消费者丢失消息。

2) 但是,如果在消费者消费之前,MQ就宕机了,消息就没了。

解决方案:MQ持久化机制

1.开启交换机持久化【生产者】

 2. 开启队列持久化【消费者】

 3.开启消息持久化【生产者】

注:以上内容为学习笔记,仅供学习交流

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>