昨天一个开发朋友说很着急安装消息中间件rabbitMQ,但是安装过程有点恶心,但说是要培训什么的。让我帮忙看一下!那我总结一下这个消息中间件吧。
1.消息队列的相关概念:
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。
2.rabbitmq的简单介绍:
rabbitmq是采用Erlang(一种通用的面向并发的编程语言)编写的符合AMQP(Advanced Message Queuing Protocol-高级消息队列协议)规范的消息中间件。诞生于金融行业,现在广泛应用于企业级的分布式应用中。
3.rabbitMQ的结构图:
详细解释:
从模型抽象上来说其工作过程:生产者(clientA/B)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者(client1/2/3)。
producer(publisher):消息的生产者,也是一个向交换器发布消息的客户端应用程序。
Exchange:交换器,实现对消息的路由,生产者投递消息后最先到达exchange,由exchange决定将消息投递到那个queue,消息正确投递之前需要将exchange和queue进行绑定。
Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
Rabbit Server:虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP(Advanced Message Queuing Protocol-高级消息队列协议) 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
consumer:消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
4.exchange模式:
Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct、fanout、topic、headers 。headers 匹配 AMQP(Advanced Message Queuing Protocol-高级消息队列协议) 消息的 header 而不是路由键,此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了,所以直接看另外三种类型:
1)direct
消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。路由键与队列名完全匹配,如果一个队列绑定到交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”,也不会转发“dog.guard”等等。它是完全匹配单播的模式。
2)fanout-广播模式
每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 类型转发消息是最快的。
3)topic
topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“*”。*匹配0个或多个单词,#匹配不多不少一个单词
4)header
按照消息头投递到队列,不考虑routing key。
5.rabbitMQ的安装:
相关的环境: centos 6.5
默认端口:
client端通信口5672
管理口15672
server间内部通信口25672
erlang发现口:4369
1)安装erlang-7.3
从源码编译安装Erlang,有三个库或工具是必须的:
一是完整的GCC编译器环境
二是Ncurses开发库
三是ODBC开发库
下载:
wget http://www.erlang.org/download/otp_src_18.3.tar.gz
tar zvxf otp_src_18.3.tar.gz
cd otp_src_18.3/
./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smmp-support --enable-kernel-poll --enable-hipe --without-javac
--enable-smmp-support启用对称多处理支持
--enable-threads启用异步线程支持
--enable-sctp启用流控制协议支持
--with-ssl openssl的扩展库
--enable-kernel-poll启用Linux内核poll
--enable-hipe启用高性能Erlang
(java编译器编译,可以去掉了--without-javac)
遇到的报错:
解决方法:
yum install unixODBC-devel -y
再次执行
./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smmp-support --enable-kernel-poll --enable-hipe --without-javac
make
make install
添加环境变量:
echo 'export PATH=$PATH:/usr/local/erlang/bin' >> /etc/profile
source /etc/profile
查看安装结果:
2)安装rabbitmq-3.6.12
下载和安装:
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-generic-unix-3.6.12.tar.xz
yum install xz -y
tar xf rabbitmq-server-generic-unix-3.6.12.tar.xz
mv rabbitmq_server-3.6.12 /usr/local/rabbitmq_server
启动命令
进入sbin目录
cd rabbitmq_server-3.6.12/sbin
开启节点
./rabbitmqctl start_app
启用web管理界面
./rabbitmq-plugins enable rabbitmq_management
#启动命令,该命令ctrl+c后会关闭服务
./rabbitmq-server
#在后台启动Rabbit
./rabbitmq-server -detached
#关闭服务
./rabbitmqctl stop
用户相关的命令
#添加用户
#rabbitmqctl add_user Username Password
./rabbitmqctl add_user rabbitadmin 123456
#分配用户标签
#rabbitmqctl set_user_tags User Tag#[administrator]:管理员标签
./rabbitmqctl set_user_tags rabbitadmin administrator
#列出用户
./rabbitmqctl list_users
#删除用户
rabbitmqctl delete_user 用户名
#修改密码
rabbitmqctl change_password 用户名 密码
Vhost 相关的命令:
#添加vhost
./rabbitmqctl add_vhost vhost_name
#删除vhost
./rabbitmqctl delete_vhost vhost_name
#查看vhost
./rabbitmqctl list_vhosts
#设置权限
./rabbitmqctl set_permissions -p vhost username ".*" ".*" ".*" ##权限位对应为 config read write
读:有关消费消息的任何操作,包括清除整个队列(需要绑定操作成功)
写:发布消息(需要绑定操作成功)
配置:队列和交换器的创建和删除
#查看权限
./rabbitmqctl list_permissions -p vhost
#删除权限
rabbitmqctl delete_permission -p vhost username
web界面登录效果图:
访问地址:http://ip:15672
报错信息汇总:
解决方法:
abbitmqctl start_app
rabbitmq-plugins enable rabbitmq_management