做为中间件,消息队列是分布式应用间交换信息的重要组件。消息队列可驻留在内存或磁盘上,队列可以存储消息直到他们被应用程序读走。RabbitMQ是众多消息队列(Message Queue)中的一员,常见的有Kafak、ZeroMQ、ActiveMQ、RocketMQ,各自有各自的特点。
RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。
1)几个概念
2) 关系结构
3) 一些问题
1. 长短链接的问题
长链接只得是客户端在登录服务端的时候只有一个登录的过程,登录成功之后不再断开连接,直到整体的业务流程结束。顾名思义,短链接都是每次业务数据交互的时候均会发生登陆和登出的过程。
问题:rabbit-c客户端的长连接的目前还没搞清楚怎么实现。
2. Channel和socket的问题
RabbitMQ在建立连接一个socket连接之后,可以在该socket的链路上建立多个通道(channal),数据流动都是在Channel中进行的。操作系统建立和关闭tcp连接有很大的代价,但是建立channel不会消耗太多的资源。
登录RabbitMQ主页:http://www.rabbitmq.com/install-windows.html ,下载需要的Erlang语言包和RabbitMQ服务端,如下图所示下载相应包。
安装过程没有特殊的步骤,安装过程详细链接:https://blog.csdn.net/qq_33382113/article/details/78853680
1) 安装Erlang
2) 安装RabbitMQ服务端
在windows环境下不使用默认的存储db和log的目录时,需要对配置项进行设置。对于已经安装好的服务来说需要重新设置一下即可,新安装的环境在安装时做一些选项并后续操作就可以实现。
(1)未安装Rabbit-server服务
a、在安装Rabbit-server服务时,注意不要勾选复选框【Rabbit-service】直接下一步,直到安装完成,如下图。
b 、用管理员权限打开命令行,进入安装目录\sbin\下(此时服务和插件应均未启动)。
执行命令1:set RABBITMQ_BASE=C:\Program Files\RabbitMQ Server\data【C:…为DB和Log的目录,此处为了方便,把所有的数据放到了data文件夹下】
执行命令2:rabbitmq-service install
c、启动服务及插件等
(2)已经安装Rabbit-server服务
a、停止服务和插件
b、 用管理员权限打开命令行,进入服务的安装目录,执行2.2.2-1-step2两个命令
c、启动服务及插件
1)启用web管理插件
(1)使用命令行,进入安装目录:RabbitMQ Server\rabbitmq_server-3.7.7\sbin\,执行指令:rabbitmq-plugins enable rabbitmq_management
(2)重启服务
2)登录web管理界面
默认情况下用户只能在本地使用浏览器:http://127.0.0.1:15672/ 登录管理界面,默认使用guest账户,密码同名。
可以修改文件使不同的机器也可以登录web管理页面进行管理,具体操作:
打开【…\rabbitmq_server-3.7.7\ebin\rabbit.app】文件,查找【loopback_users】字段,将字段的值删掉,如下所示。
重启服务和启动插件之后即可在别的机器访问。
3)DB和日志
在windows下安装之后默认的DB持久化存储和日志文件均生成在C盘的\Appdata\Roaming\中,需要注意的是如果设置了数据持久化,随着数据的增多,当达到最大的时候,Rabbit服务会崩溃,可以手动设置到制定的目录。
数据持久化目录:…\AppData\Roaming\RabbitMQ\db
数据日志目录:…\AppData\Roaming\RabbitMQ\log\
RabbitMQ提供了丰富的接口供各种语言下使用,主流的有:java,python,ruby,.Net,PHP…等,对于C/C++我们使用rabbit-c库。主页客户端:http://www.rabbitmq.com/devtools.html 链接
1)Rabbit-c客户端源码下载和编译
2) 库及编译环境
下载直接编译的环境,用vs2015打开之后直接编译即可,在\bin目录下有librabbitmq.lib静态库和rabbitmq.dll动态库,工程下载地址:https://github.com/luciferofwg/RabbitMQ
1) 常见的三种模式
常见的模式有三种:direct、fanout和topic。三种模式性能关系:fanout>direct>topic,具体的实现实例详见:https://github.com/luciferofwg/RabbitMQ-Demo
2) direct模式
driect模式是需要将一个队列绑定到交换机上,要求改消息与一个特定的路由键完全匹配。这是一个完整的匹配,如果一个队列绑定到该交换机上要求路由键为“dog”,则只有被标记为“dog”的消息才被交换机转发,不会转发dog.puppy,只会转发dog。
任何转发到direct模式的exchange的消息都会被转发到RouteKey中指定的Queue
3) Fanout模式
Fanout模式不处理路由键,只需要将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机的绑定的所有的队列上。类似于广播,每一个队列均获得了一份复制的数据。Fanout模式是转发消息最快的。
4) Topic模式
5)不同用户权限隔离
(1)虚拟主机
vhost是rabbitmq分配权限的最小细粒度。比如我们可以为一个用户分配一个可以访问哪个或者哪一些vhost的权限。
a、Web管理创建vHost
以guest用户登录web界面,选择admin页签,右侧选择virtual Host栏,在“add a new virtual host”下的name处填写virtual host的名称即可。如下图:
b、命令行创建vHost
(2)用户级别和权限管理
通过vHost可以为不同的用户提供消息的隔离,使用户只能对自己权限内的进行查看或者操作。从而达到权限控制的问题。
1.用户的创建
Rabbit中用户分了5个等级,每个等级拥有不同的权限。依次:其他、普通管理员(management)、策略制定者(policymaker)、监控者(monitoring)、超级管理员(administrator),下面分别对以上用户类型简单说明。
1)其他:无法登陆控制台,通常是普通的生产者或者消费者
2) 普通管理员:可登陆管理控制台,只能看到当前权限下的exchange,队列等信息
3) 策略制定者:可登陆控制台,同时可以对policy进行管理。但无法看到节点信息
4) 监控者:可登陆控制台,可查看所有的信息,并对用户、策略进行操作
5) 超级管理员:可登陆控制台,可查看所有的信息,可以对用户、策略进行操作
一般可以创建普通用户作为客户端来使用rabbitMQ。以guest管理员身份登录,选择admin—user—Add a user(填写用户信息)—Add user即可。
新创建的用户,此时没有可访问的vHost,需要给当前用户添加vHost权限(此时可以创建当前用户的vHost,具体操作见4.2.1)。
权限分配
进入virtual host管理界面,选择用户的vhost目录,点击进入。
设置该virtual Host的可操作的用户。
设置完成之后new_guest用户拥有了对virtual host admin的操作权限(读写)。
用户权限的小结
1) 用户A只访问vHostA,用户B只访问vHostB,互相隔离,互不可见
2) 用户A,用户B同时访问vHost,A(B)可见B(A)创建Queue的信息
未完待续……