Fanout Exchange——不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
Direct Exchange——处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog ”的消息才被转发,不会转发dog.puppy ,也不会转发dog.guard ,只会转发dog 。
Topic Exchange——将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate ”,但是“audit.* ” 只会匹配到“audit.irs ”
1.1 理
讲解的很详细
http://hwcrazy.com/34195c9068c811e38a44000d601c5586/be62fc2668c811e3adba000d601c5586/
RabbitMQ提供了四种Exchange:fanout,direct,topic,header
Direct Exchange
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。
2.RabbitMQ
mac 安装
http://my.oschina.net/u/998693/blog/547873
下载 然后 host添加,然后 运行
2.1 启动 web插件
没有启动 要启动
./ rabbitmq-plugins enable rabbitmq_management
2.2 启动 ./rabbitmq-server restart
2.2.1 账户设置
一下都执行一遍
这个 并不是 admin 很有可能无法登陆
添加
/Users/Downloads/rabbitmq_server-3.5.7/sbin/rabbitmqctl add_user bayern 123456
/Users/Downloads/rabbitmq_server-3.5.7/sbin/rabbitmqctl set_admin bayern
删除
/Users/Downloads/rabbitmq_server-3.5.7/sbin/rabbitmqctl delete_user guest
权限
/Users/Downloads/rabbitmq_server-3.5.7/sbin/rabbitmqctl set_permissions -p "/" bayern "." "." ".*"
*mac 一些坑*
1.用户login failed
添加用户时要这样操作
rabbitmqctl add_user test test
rabbitmqctl set_user_tags test administrator
rabbitmqctl set_permissions -p devhost dev ".*" ".*" ".*"
http://stackoverflow.com/questions/22850546/cant-access-rabbitmq-web-management-interfac e-after-fresh-install
注:当前用户 test 只是在 vhos‘/’ 下
(1) 新增一个用户
rabbitmqctl add_user Username Password
(2) 删除一个用户
rabbitmqctl delete_user Username
(3) 修改用户的密码
rabbitmqctl change_password Username Newpassword
(4) 查看当前用户列表
rabbitmqctl list_users
RabbitMQ Demo
/Users/Downloads/rabbitmq_server-3.5.7/sbin/rabbitmqctl
add_vhost RabbitMQ.Demo.host
/Users/Downloads/rabbitmq_server-3.5.7/sbin/rabbitmqctl
set_permissions -p "RabbitMQ.Demo.host" bayern "." "." ".*"
关于login_failed的一些操作 (登陆账户设置)
还有**官方**更详细的介绍
https://www.rabbitmq.com/man/rabbitmqctl.1.man.html
[此处输入链接的描述][2]
2.4 进入 http://127.0.0.1:15672/ web控制台
easy_install:
$ easy_install pip
rabbitmq-server 安装方法
http://blog.csdn.net/i_bruce/article/details/39555417
sudo lsof -n -P| grep :5672 查看 5672 端口
停止 已经运行的 rabbit
sudo rabbitmqctl stop
Unbutu
安装
方法一
sudo apt-get install rabbitmq-server
sudo pip install pika
安装以及测试 实现简单的 收发 hello 这个相对 mac 感觉简单点啊,没mac复杂
mac 也可通过安装 pika 实现同类操作
进入web管理
参考这个
http://blog.csdn.net/i_bruce/article/details/39555417 但是
通过 rabbitmq官网安装 deb
使用 apt-get 安装 erlang
这篇文章有些安装还是比较麻烦的
The default connection URL connects to the / virtual host as guest
using the guest password on localhost port 5672. Note the forwardslash
in the URL is encoded to %2F::
Connect to a host rabbit1 as the user www-data using the password
rabbit_pwd on the virtual host web_messages::
Connecting via SSL is pretty easy too. To connect via SSL for the
previous example, simply change the scheme to amqps. If you do not
specify a port, Pika will use the default SSL port of 5671::
If you're looking to tweak other parameters, such as enabling
heartbeats, simply add the key/value pair as a query string value. The
following builds upon the SSL connection, enabling heartbeats every 30
seconds::
3.1.1.1
使用**pika登录**时 python要无论是localhost还是 远程端口都是**5672**
**默认连接**:
本地:
默认账号 是guest 密码 guest
guest只能本地用
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
使用账号
例如
账号 mactest 密码 test
本地连接
connection =
pika.BlockingConnection(pika.URLParameters('amqp://mactest:test@localhost:5672/%2F'))
*远程*
connection =
pika.BlockingConnection(pika.URLParameters('amqp://mactest:test@192.168.1.134:5672/%2F'))
%2F表示是默认的vhost(“/”),如有设置vhost 需要设置为相应的参数
3.2.1
model--1
在没有建立consumer 和publisher关系时容易出现混乱
1. 建立通讯时。一个主机注册localhost:5672 receive.py
另一个远程建立 192....:5672 send py
两个可以实现通讯,
但是这时候主机如果发起一个 send.py 那么远程的 send.py就会无效。
没有建立关系,或者指定vhost的时候就会出现这样的问题。一个recevie只 能对应一个send
所以可以 其一 在用户下面为其设定 特有的vhost
rabbitmqctl set_permissions -p / test ".*" ".*" ".*"
这里的 是跟host “/”
modle--2
无法连接第二个账号,log现实 vhost refused to user
添加远程访问
http://blog.haohtml.com/archives/15249
仔细看一下。vhost的名字。
vhost不要乱加. 最好从 web端添加 vhost
3.2pika demo
3.2.1 consueme 就是 接受者
publish 发布者
遇到的问题
pip install ..
return
_setlocale(category, locale)
queue过多
容易出问题需要重启
读取json
time.sleep(location.count('.'))
阻塞,直到location全部读完。。
注意 路径问题。rabbit sshcommand 默认的 路径 是 /root
任何文件操作的 都要加 /**/.. 文件路径
查看队列 list
rabbitmqctl list_queues
更多用法及参数,可以执行如下命令查看
rabbitmqctl
python nohub
nohup python -u test.py > out.log &
本来想测试下nohup的用法,去执行一个python脚本:nohup python test.py > out.log &
结果郁闷啊,怎么都查看不到输出!
python的输出又缓冲,导致out.log并不能够马上看到输出。
-u参数,使得python不启用缓冲。
nohup python -u rabbit_compress.py > rabbit.log &
disconnect 的问题
因为用mq做自动化,执行一个耗时任务,执行完毕才 接受下一个,开始总是 会断开,很纠结。后来使用
while (True):
所有逻辑
强制执行。重开。算是解决耗时任务带来的问题吧