天天看點

rabbitmq的安裝和指令介紹及python程式模拟生産者和消費者

【介紹】

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 &gt;</code><code>/dev/null</code> <code>2&gt;&amp;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 &lt;VHostPath&gt;</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上,并賦予對&lt;conf&gt; &lt;write&gt; &lt;read&gt;的權限,使用者是對某個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 &lt;node&gt;] [-q] &lt;command&gt; [&lt;command options&gt;] 

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 [&lt;pid_file&gt;]

    stop_app

    start_app

    wait &lt;pid_file&gt;

    reset

    force_reset

    rotate_logs &lt;suffix&gt;

原因是不能解析 本主機,原因是 預設作為解析的節點和 本機的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