RabbitMQ&Python

作者: ReanCool | 来源:发表于2016-11-21 16:50 被阅读696次

    1. RabbitMQ简介
      http://www.searchsoa.com.cn/showcontent_43337.htm

    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的一些操作 (登陆账户设置)

    http://www.cnblogs.com/mingaixin/p/4134920.html

    还有**官方**更详细的介绍 
    https://www.rabbitmq.com/man/rabbitmqctl.1.man.html
    [此处输入链接的描述][2]
    

    2.4 进入 http://127.0.0.1:15672/ web控制台

    pip 安装 卸载等
    http://www.xuebuyuan.com/593678.html

    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
    

    http://www.01happy.com/ubuntu-rabbitmq-and-python-practice/
    今天再次整理一下,有些忘记了,查看原链接就行

    安装以及测试 实现简单的 收发 hello 这个相对 mac 感觉简单点啊,没mac复杂
    mac 也可通过安装 pika 实现同类操作

    进入web管理
    参考这个
    http://blog.csdn.net/i_bruce/article/details/39555417 但是
    通过 rabbitmq官网安装 deb
    使用 apt-get 安装 erlang
    这篇文章有些安装还是比较麻烦的

    有时候 plugin 一直无法激活 要在当前 rabbitmq中去关闭 sudo rabbitmqctl stop
    然后再enable --->启动
    3.测试
    3.1
    http://yidao620c.iteye.com/blog/1947338
    一些发送接收
    pika
    3.1.1
    python pika的一些一些guide 参考 github docs--examples
    https://github.com/pika/pika
    http://pika.readthedocs.io/en/0.10.0/examples/using_urlparameters.html
    %2f是'/ '的URL编码
    using_urlparameters 的连接参考
    例如:
    scheme://username:password@host:port/virtual_host?key=value&key=value

    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::

    amqp://guest:guest@localhost:5672/%2F

    Connect to a host rabbit1 as the user www-data using the password
    rabbit_pwd on the virtual host web_messages::

    amqp://www-data:rabbit_pwd@rabbit1/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::

    amqps://www-data:rabbit_pwd@rabbit1/web_messages

    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::

    amqps://www-data:rabbit_pwd@rabbit1/web_messages?heartbeat=30

    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

    连接测试
    很不错的
    http://yidao620c.iteye.com/blog/1947338

    3.2pika demo
    3.2.1 consueme 就是 接受者
    publish 发布者

    遇到的问题

    pip install ..

    return
    _setlocale(category, locale)

    http://stackoverflow.com/questions/36394101/pip-install-locale-error-unsupported-locale-setting

    queue过多
    容易出问题需要重启

    读取json

    http://blog.chinaunix.net/uid-9525959-id-3074355.html
    注意json 格式不要错

     time.sleep(location.count('.'))
     阻塞,直到location全部读完。。
     
     注意 路径问题。rabbit sshcommand 默认的 路径 是 /root
     任何文件操作的 都要加 /**/.. 文件路径
     
     
     查看队列 list
     rabbitmqctl list_queues
     
     更多用法及参数,可以执行如下命令查看
     rabbitmqctl
    

    ffmpeg http://www.tuicool.com/articles/Ivyie2e


    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):
    
        所有逻辑
    

    强制执行。重开。算是解决耗时任务带来的问题吧

    相关文章

      网友评论

        本文标题: RabbitMQ&Python

        本文链接:https://www.haomeiwen.com/subject/eipupttx.html