1)选择RabbitMQ,而不是ActiveMQ/ZeroMQ/Apache Qpid的原因:
(1)RabbitMQ难以置信的容易安装和使用。
(2)除了Qpid外,RabbitMQ是唯一实现了AMQP标准的代理服务器。
(3)正是由于Erlang,RabbitMQ集群不可思议的简单。
(4)RabbitMQ比竞争对手更可靠,更能防止崩溃。
2、安装和运行(CentOS 7)
1)由于RabbitMQ是采用Erlang编写的,因此需要先安装该语言库:
[root@localhost ~]# wget
...
[root@localhost ~]# tar -zxvf otp_src_19.1.tar.gz
...
[root@localhost ~]# cd otp_src_19.1/
# 若运行configure脚本时出现"No curses library functions found"错误,则执行yum install ncurses-devel
[root@localhost otp_src_19.1]# ./configure
...
[root@localhost otp_src_19.1]# make && make install
...
# erl命令输出如下信息时,表示安装成功
[root@localhost otp_src_19.1]# erl
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V8.1 (abort with ^G)
1>
2)安装RabbitMQ
(1)从获得压缩包(如rabbitmq-server-3.6.6.tar.xz),解压得到rabbitmq-server-3.6.6目录。
(2)进入该目录,执行make && make install。
3)运行:
[root@localhost rabbitmq-server-3.6.6]# bash ./deps/rabbit/scripts/rabbitmq-server
RabbitMQ 3.6.6. Copyright (C) 2007-2016 Pivotal Software, Inc.
## ## Licensed under the MPL. See
## ##
########## Logs: /var/log/rabbitmq/rabbit@localhost.log
###### ## /var/log/rabbitmq/rabbit@localhost-sasl.log
##########
Starting broker...
completed with 0 plugins.
此时可执行如下命令检查服务器状态:
# 输出代理服务器的状态、运行中的应用程序和节点等
[root@localhost rabbitmq-server-3.6.6]# bash ./deps/rabbit/scripts/rabbitmqctl status
Status of node rabbit@localhost ...
[{pid,25640},
{running_applications,[{rabbit,"RabbitMQ","3.6.6"},
{mnesia,"MNESIA CXC 138 12","4.14.1"},
{os_mon,"CPO CXC 138 46","2.4.1"},
{rabbit_common,[],"3.6.6"},
{xmerl,"XML parser","1.3.12"},
{ranch,"Socket acceptor pool for TCP protocols.",
"1.2.1"},
{sasl,"SASL CXC 138 11","3.0.1"},
{stdlib,"ERTS CXC 138 10","3.1"},
{kernel,"ERTS CXC 138 10","5.1"}]},
{os,{unix,linux}},
... ...
3、基本概念
1)AMQP:高级消息队列协议。
从概念上来讲,AMQP消息路由必须有三部分:交换器、队列和绑定。生产者把消息发布到交换器上;消息最终到达队列,并被消费者接收;绑定决定了消息如何从路由器路由到特定的队列。
2)信道
你必须首先连接到Rabbit,才能消费或者发布消息。一旦TCP连接打开(通过了认证),应用程序就可以创建一条AMQP信道。信道是建立在“真实的”TCP连接内的虚拟连接。AMQP命令都是通过信道发送出去的。每条信道都会被指派一个唯一ID。
引入信道概念的原因:主要是对操作系统来说建立和销毁TCP会话是非常昂贵的开销。在一条TCP连接上创建多条信道,而不是创建多条TCP连接,既可以满足性能方面的要求,又能确保各个信道数据的私密性,就像拥有独立连接一样。
3)消息:包含有效载荷(payload)和标签(label)。有效载荷就是你想要传输的数据。标签描述了有效载荷,并且RabbitMQ用它来决定谁将获得消息的拷贝。
消费者接收到的每一条消息都必须进行确认:或者通过AMQP的basic.ack命令显式发送确认,或者在订阅到队列时将auto_ack参数设置为true。