【介紹】
RabbitMQ是流行的開源消息隊列系統,用erlang語言開發
RabbitMQ是AMQP(進階消息隊列協定)的标準實作
【安裝】
方式:yum/rpm
系統環境
[root@log_server scripts]# ifconfig | sed -n 's#.*inet addr:\(.*\) B.*#\1#gp'
192.168.100.20
[root@log_server scripts]# cat /etc/issue | grep -i cent
CentOS release 6.4 (Final)
[root@log_server scripts]# yum repolist |grep epel
* epel: mirrors.aliyun.com
epel Extra Packages for Enterprise Linux 6 - x86_64 12,244
[root@log_server scripts]#
<code>yum </code><code>install</code> <code>-y rabbitmq-server</code>
安裝成功後,檢視插件清單
<code>/usr/lib/rabbitmq/bin/rabbitmq-plugins</code> <code>list</code>
啟動rabbitmq_management插件
<code>/usr/lib/rabbitmq/bin/rabbitmq-plugins</code> <code>enable</code> <code>rabbitmq_management</code>
啟動程式
<code> </code><code>/etc/init</code><code>.d</code><code>/rabbitmq-server</code> <code>start</code>
【驗證】
<code>[root@log_server scripts]</code><code># netstat -tulnp |grep 15672</code>
<code>tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 3877</code><code>/beam</code><code>.smp </code>
<code>[root@log_server scripts]</code><code># ps -ef |grep rabbit</code>
<code>root 3837 1 0 11:30 pts</code><code>/2</code> <code>00:00:00 </code><code>/bin/sh</code> <code>/etc/init</code><code>.d</code><code>/rabbitmq-server</code> <code>start</code>
<code>root 3868 3837 0 11:30 pts</code><code>/2</code> <code>00:00:00 </code><code>/bin/bash</code> <code>-c </code><code>ulimit</code> <code>-S -c 0 ></code><code>/dev/null</code> <code>2>&1 ; </code><code>/usr/sbin/rabbitmq-server</code>
<code>root 3869 3868 0 11:30 pts</code><code>/2</code> <code>00:00:00 </code><code>/bin/sh</code> <code>/usr/sbin/rabbitmq-server</code>
<code>root 3876 3869 0 11:30 pts</code><code>/2</code> <code>00:00:00 </code><code>su</code> <code>rabbitmq -s </code><code>/bin/sh</code> <code>-c </code><code>/usr/lib/rabbitmq/bin/rabbitmq-server</code>
<code>rabbitmq 3877 3876 0 11:30 ? 00:00:55 </code><code>/usr/lib64/erlang/erts-5</code><code>.8.5</code><code>/bin/beam</code><code>.smp -W w -K </code><code>true</code> <code>-A30 -P 1048576 -- -root </code><code>/usr/lib64/erlang</code> <code>-progname erl -- -home </code><code>/var/lib/rabbitmq</code> <code>-- -pa </code><code>/usr/lib/rabbitmq/lib/rabbitmq_server-3</code><code>.1.5</code><code>/sbin/</code><code>..</code><code>/ebin</code> <code>-noshell -noinput -s rabbit boot -sname rabbit@log_server -boot start_sasl -kernel inet_default_connect_options [{nodelay,</code><code>true</code><code>}] -sasl errlog_type error -sasl sasl_error_logger </code><code>false</code> <code>-rabbit error_logger {</code><code>file</code><code>,</code><code>"/var/log/rabbitmq/rabbit@log_server.log"</code><code>} -rabbit sasl_error_logger {</code><code>file</code><code>,</code><code>"/var/log/rabbitmq/rabbit@log_server-sasl.log"</code><code>} -rabbit enabled_plugins_file </code><code>"/etc/rabbitmq/enabled_plugins"</code> <code>-rabbit plugins_dir </code><code>"/usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/../plugins"</code> <code>-rabbit plugins_expand_dir </code><code>"/var/lib/rabbitmq/mnesia/rabbit@log_server-plugins-expand"</code> <code>-os_mon start_cpu_sup </code><code>false</code> <code>-os_mon start_disksup </code><code>false</code> <code>-os_mon start_memsup </code><code>false</code> <code>-mnesia </code><code>dir</code> <code>"/var/lib/rabbitmq/mnesia/rabbit@log_server"</code>
<code>rabbitmq 3951 3877 0 11:30 ? 00:00:00 inet_gethost 4</code>
<code>rabbitmq 3952 3951 0 11:30 ? 00:00:00 inet_gethost 4</code>
<code>root 19143 1770 0 14:02 pts</code><code>/2</code> <code>00:00:00 </code><code>grep</code> <code>rabbit</code>
<code>[root@log_server scripts]</code><code>#</code>
【配置】
預設配置不需要配置
如果有需要/etc/rabbitmq/ 下可以建立
【常見指令】
檢視列隊清單
<code>rabbitmqctl list_queues</code>
檢視預設 vhost為 "/"下的列隊
<code>rabbitmqctl list_queues -p </code><code>"/"</code>
檢視vhost清單
<code>rabbitmqctl list_vhosts</code>
增加/删除vhost
<code>rabbitmqctl add_vhost vhost_andy</code>
<code>rabbitmqctl delete_vhost <VHostPath></code>
增加使用者
<code>rabbitmqctl add_user andy </code><code>'12qwaszx'</code>
檢視使用者
<code>rabbitmqctl list_users</code>
<code>[root@log_server scripts]</code><code># rabbitmqctl list_users</code>
<code>Listing </code><code>users</code> <code>...</code>
<code>andy []</code>
<code>guest [administrator]</code>
将使用者綁定到vhost_andy 這個vhost上,并賦予對<conf> <write> <read>的權限,使用者是對某個vhost的管理權限關聯起來的
<code>rabbitmqctl set_permissions -p vhost_andy andy </code><code>".*"</code> <code>".*"</code> <code>".*"</code>
檢視使用者權限
<code>rabbitmqctl list_user_permissions andy</code>
[root@log_server scripts]# rabbitmqctl list_user_permissions andy
Listing permissions for user "andy" ...
vhost_andy .* .* .*
...done.
【web管理連接配接】
<a href="http://192.168.100.20:15672/" target="_blank">http://192.168.100.20:15672/</a>
guest/guest登入
<a href="http://s1.51cto.com/wyfs02/M00/7F/A4/wKiom1cm8APyAnHGAACKr32lUtw375.png" target="_blank"></a>
【python程式模拟生産者】
來自最簡單的模型P-mq--C
<a href="http://s5.51cto.com/wyfs02/M01/7F/A2/wKioL1cm-YvSTP2wAAAiVPxc1zo857.png" target="_blank"></a>
cat send.py
<code>#!/usr/bin/env python</code>
<code>#encoding==utf-8</code>
<code>#http://cuidehua.blog.51cto.com</code>
<code>#from http://www.rabbitmq.com/tutorials/tutorial-one-python.html</code>
<code>import</code> <code>pika</code>
<code>connection </code><code>=</code> <code>pika.BlockingConnection(pika.ConnectionParameters(</code>
<code> </code><code>host</code><code>=</code><code>'localhost'</code><code>))</code>
<code>channel </code><code>=</code> <code>connection.channel()</code>
<code>channel.queue_declare(queue</code><code>=</code><code>'hello'</code><code>)</code>
<code>channel.basic_publish(exchange</code><code>=</code><code>'',</code>
<code> </code><code>routing_key</code><code>=</code><code>'hello'</code><code>,</code>
<code> </code><code>body</code><code>=</code><code>'Hello World!'</code><code>)</code>
<code>print</code><code>(</code><code>" [x] Sent 'Hello World!'"</code><code>)</code>
<code>connection.close()</code>
模拟發送100條消息到queue=hello的這個列隊中
<code>for</code> <code>i </code><code>in</code> <code>{1..100};</code><code>do</code> <code>python send.py ;</code><code>done</code>
指令檢視隊列:(不指定vhost 列隊在預設的vhost "/"中)
[root@log_server scripts]# rabbitmqctl list_queues -p "/"
Listing queues ...
hello 100
web端檢視
<a href="http://s1.51cto.com/wyfs02/M00/7F/A4/wKiom1cm-dmiPi7mAABezq7IVCk156.png" target="_blank"></a>
【python程式模拟消費者進行消費】
[root@log_server scripts]# cat receive.py
<code>#encoding=utf-8</code>
<code>#定義回調函數</code>
<code>def</code> <code>callback(ch, method, properties, body):</code>
<code> </code><code>print</code><code>(</code><code>" [x] Received %r"</code> <code>%</code> <code>body)</code>
<code>channel.basic_consume(callback,</code>
<code> </code><code>queue</code><code>=</code><code>'hello'</code><code>,</code>
<code> </code><code>no_ack</code><code>=</code><code>True</code><code>)</code>
<code>print</code><code>(</code><code>' [*] Waiting for messages. To exit press CTRL+C'</code><code>)</code>
<code>channel.start_consuming()</code>
執行消費,并等待messages! 直到ctrl+c 終止
<code>python receive.py</code>
再次檢視隊列
[root@log_server scripts]# rabbitmqctl list_queues -p "/"
hello 0
【常見啟動報錯】
/etc/init.d/rabbitmq-server 腳本調用的是 rabbitmqctl
常見問題:
root@log_server scripts]# /etc/init.d/rabbitmq-server stop
Stopping rabbitmq-server: RabbitMQ is not running
rabbitmq-server.
[root@log_server scripts]# rabbitmqctl stop
Stopping and halting node rabbit@log_server ...
Error: unable to connect to node rabbit@log_server: nodedown
DIAGNOSTICS
===========
nodes in question: [rabbit@log_server]
hosts, their running nodes and ports:
- unable to connect to epmd on log_server: address (cannot connect to host/port)
current node details:
- node name: rabbitmqctl23829@log_server
- home dir: /var/lib/rabbitmq
- cookie hash: UtT55njEKHItAnmjDeoV+A==
解釋原因:
分析 rabbitmqctl --help 中的第一段
Usage:
rabbitmqctl [-n <node>] [-q] <command> [<command options>]
Options:
-n node
-q
Default node is "rabbit@server", where server is the local host. On a host
named "server.example.com", the node name of the RabbitMQ Erlang node will
usually be rabbit@server (unless RABBITMQ_NODENAME has been set to some
non-default value at broker startup time). The output of hostname -s is usually
the correct suffix to use after the "@" sign. See rabbitmq-server(1) for
details of configuring the RabbitMQ broker.
Quiet output mode is selected with the "-q" flag. Informational messages are
suppressed when quiet mode is in effect.
Commands:
stop [<pid_file>]
stop_app
start_app
wait <pid_file>
reset
force_reset
rotate_logs <suffix>
原因是不能解析 本主機,原因是 預設作為解析的節點和 本機的hostname -s 結果一緻
解決方法:隻要把hostname -s的結果 加入到/etc/hosts中即可
[root@log_server ~]# hostname -s
log_server
正常停止的結果:
[root@log_server ~]# rabbitmqctl stop
正常啟動的結果:
[root@log_server ~]# /etc/init.d/rabbitmq-server start
Starting rabbitmq-server: SUCCESS
可以檢視的日志
/var/log/rabbit/
本文轉自殘劍部落格51CTO部落格,原文連結http://blog.51cto.com/cuidehua/1769460如需轉載請自行聯系原作者
cuizhiliang