一、rabbitmq介绍
1、什么是MQ
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。
RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难。他遵循Mozilla Public License开源协议。
2、MQ的特点
MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。
3、使用场景
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
4、RabbitMQ的几个概念
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
消息队列的使用过程大概如下:
(1)客户端连接到消息队列服务器,打开一个channel。
(2)客户端声明一个exchange,并设置相关属性。
(3)客户端声明一个queue,并设置相关属性。
(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
(5)客户端投递消息到exchange。
exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
5、持久化
RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:
(1)exchange持久化,在声明时指定durable => 1
(2)queue持久化,在声明时指定durable => 1
(3)消息持久化,在投递时指定delivery_mode => 2(1是非持久化)
如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。
参考链接:https://baike.baidu.com/item/rabbitmq/9372144?fr=aladdin
二、安装配置
1、说明
在CentOS 6.x 系统上如果安装了epel源,那么使用yum安装的版本(版本较低)是:
erlang: erlang-R14B-04.3.el6.x86_64,
rabbitmq: rabbitmq-server-3.1.5-1.el6.noarch
官网提供的erlang源可以安装高版本的erlang,地址:官网提供的rabbitmq不同版本的rpm包下载地址:
2、这里使用rpm包安装
rpm 包下载地址:
rabbimq http://www.rabbitmq.com/download.html
erlang http://www.rabbitmq.com/releases/erlang/
下载的版本;
rabbitmq-server-3.6.12-1.el6.noarch.rpm
erlang-19.0.4-1.el6.x86_64.rpm
3、开始安装
#rpm -ivh erlang-19.0.4-1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:erlang ########################################### [100%]
#rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm
warning: rabbitmq-server-3.6.12-1.el6.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 6026dfca: NOKEY
error: Failed dependencies:
socat is needed by rabbitmq-server-3.6.12-1.el6.noarch
4、安装依赖
#yum install socat -y
安装的版本:socat-1.7.2.3-1.el6.x86_64.rpm socat地址:http://www.dest-unreach.org/socat/
注:最新版本是socat-1.7.3.2
然后重新安装就ok了。
#rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm
5、查看状态
#service rabbitmq-server status
Status of node rabbit@web2
Error: unable to connect to node rabbit@web2: nodedown
DIAGNOSTICS
===========
attempted to contact: [rabbit@web2]
rabbit@web2:
* connected to epmd (port 4369) on web2
* epmd reports: node 'rabbit' not running at all
no other nodes on web2
* suggestion: start the node
current node details:
- node name: 'rabbitmq-cli-62@web2'
- home dir: /var/lib/rabbitmq
- cookie hash: iKf4SylsmaagF3webf7oww==
6、启动
# service rabbitmq-server start
Starting rabbitmq-server: SUCCESS #大概需要20s左右
rabbitmq-server.
查看启动情况
#netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 21602/beam.smp #进程
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 21164/epmd #
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3172/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1324/master
tcp 0 0 :::5672 :::* LISTEN 21602/beam.smp #进程
tcp 0 0 :::4369 :::* LISTEN 21164/epmd #
tcp 0 0 :::22 :::* LISTEN 3172/sshd
tcp 0 0 ::1:25 :::* LISTEN 1324/master
查看进程启动情况
# ps aux | grep "rabbit"
rabbitmq 21164 0.0 0.0 10832 452 ? S 09:54 0:00 /usr/lib64/erlang/erts-8.0.3/bin/epmd -daemon
root 21390 0.0 0.1 108448 1216 pts/0 S 09:55 0:00 /bin/sh /etc/init.d/rabbitmq-server start
root 21392 0.0 0.1 108180 1408 pts/0 S 09:55 0:00 /bin/bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /usr/sbin/rabbitmq-server
root 21394 0.0 0.1 108180 1468 pts/0 S 09:55 0:00 /bin/sh /usr/sbin/rabbitmq-server
root 21412 0.0 0.1 145016 1560 pts/0 S 09:55 0:00 su rabbitmq -s /bin/sh -c /usr/lib/rabbitmq/bin/rabbitmq-server
rabbitmq 21417 0.0 0.1 106080 1492 ? Ss 09:55 0:00 /bin/sh /usr/lib/rabbitmq/bin/rabbitmq-server
rabbitmq 21602 3.4 6.3 2809660 63476 ? Sl 09:55 0:05 /usr/lib64/erlang/erts-8.0.3/bin/beam.smp -W w -A 64 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -K
true -B i -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/ebin -noshell -noinput -s rabbit boot
-sname rabbit@web2 -boot start_sasl -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger
{file,"/var/log/rabbitmq/rabbit@web2.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbit@web2-sasl.log"} -rabbit enabled_plugins_file
"/etc/rabbitmq/enabled_plugins" -rabbit plugins_dir "/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/plugins" -rabbit plugins_expand_dir
"/var/lib/rabbitmq/mnesia/rabbit@web2-plugins-expand" -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir
"/var/lib/rabbitmq/mnesia/rabbit@web2" -kernel inet_dist_listen_min 25672 -kernel inet_dist_listen_max 25672
rabbitmq 21698 0.2 0.0 4060 492 ? Ss 09:55 0:00 erl_child_setup 65535
rabbitmq 21738 0.0 0.0 10796 548 ? Ss 09:55 0:00 inet_gethost 4
rabbitmq 21739 0.0 0.0 17124 816 ? S 09:55 0:00 inet_gethost 4
##########################################
7、增加用户
因为默认的guest/guest用户只能在本地登录,所以先用命令行创建一个admin/admin123,并让他成为管理员。
#rabbitmqctl add_user admin admin123 #创建一个admin用户
Creating user "admin"
#rabbitmqctl set_user_tags admin administrator #让其成为管理员
Setting tags for user "admin" to [administrator]
# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" #给用户admin授予默认vhost "/" 上read/write/configure权限
Setting permissions for user "admin" in vhost "/"
8、开启web管理
#rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
amqp_client
cowlib
cowboy
rabbitmq_web_dispatch
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@web2... started 6 plugins.
查看管理界面端口
# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 21602/beam.smp
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 21164/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3172/sshd
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 21602/beam.smp #多了一个15672的管理端口
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1324/master
tcp 0 0 :::5672 :::* LISTEN 21602/beam.smp
tcp 0 0 :::4369 :::* LISTEN 21164/epmd
tcp 0 0 :::22 :::* LISTEN 3172/sshd
tcp 0 0 ::1:25 :::* LISTEN 1324/master
进入管理界面
#http://ip:15672 #输入刚才创建的admin用户和密码登录即可,登录成功后如下图9、再次查看rabbitmq的状态
#service rabbitmq-server status
Status of node rabbit@web2
[{pid,21602},
{running_applications,
[{rabbitmq_management,"RabbitMQ Management Console","3.6.12"},
{rabbitmq_management_agent,"RabbitMQ Management Agent","3.6.12"},
{rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.6.12"},
{amqp_client,"RabbitMQ AMQP Client","3.6.12"},
{cowboy,"Small, fast, modular HTTP server.","1.0.4"},
{cowlib,"Support library for manipulating Web protocols.","1.0.2"},
{inets,"INETS CXC 138 49","6.3.2"},
{rabbit,"RabbitMQ","3.6.12"},
{mnesia,"MNESIA CXC 138 12","4.14"},
{rabbit_common,
"Modules shared by rabbitmq-server and rabbitmq-erlang-client",
"3.6.12"},
{compiler,"ERTS CXC 138 10","7.0.1"},
{syntax_tools,"Syntax tools","2.0"},
{ranch,"Socket acceptor pool for TCP protocols.","1.3.0"},
{os_mon,"CPO CXC 138 46","2.4.1"},
{xmerl,"XML parser","1.3.11"},
{ssl,"Erlang/OTP SSL application","8.0.1"},
{public_key,"Public key infrastructure","1.2"},
{crypto,"CRYPTO","3.7"},
{asn1,"The Erlang ASN1 compiler version 4.0.3","4.0.3"},
{sasl,"SASL CXC 138 11","3.0"},
{stdlib,"ERTS CXC 138 10","3.0.1"},
{kernel,"ERTS CXC 138 10","5.0.1"}]},
{os,{unix,linux}},
{erlang_version,
"Erlang/OTP 19 [erts-8.0.3] [source] [64-bit] [smp:2:2] [async-threads:64] [hipe] [kernel-poll:true]\n"},
{memory,
[{connection_readers,0},
{connection_writers,0},
{connection_channels,0},
{connection_other,2832},
{queue_procs,2832},
{queue_slave_procs,0},
{plugins,1116208},
{other_proc,19703672},
{metrics,193464},
{mgmt_db,379664},
{mnesia,61768},
{other_ets,2322160},
{binary,451464},
{msg_index,41368},
{code,26125918},
{atom,1033401},
{other_system,24906497},
{total,76341248}]},
{alarms,[]},
{listeners,[{clustering,25672,"::"},{amqp,5672,"::"},{http,15672,"::"}]},
{vm_memory_calculation_strategy,rss},
{vm_memory_high_watermark,0.4},
{vm_memory_limit,411552972},
{disk_free_limit,50000000},
{disk_free,18090979328},
{file_descriptors,
[{total_limit,65435},
{total_used,2},
{sockets_limit,58889},
{sockets_used,0}]},
{processes,[{limit,1048576},{used,325}]},
{run_queue,0},
{uptime,5852},
{kernel,{net_ticktime,60}}]10、如果是centos7系统,对erlang版本要求也比较高,可以使用官网提供的yum源来安装:
https:///rabbitmq/erlang-rpm
[rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0 enabled=1 安装 #yum install erlang -y #rpm -ivh rabbitmq-server-3.7.5-1.el7.noarch.rpm
#cat /etc/yum.repos.d/rabbitmq-erlang.repo

















