e2

滴滴侠,fai抖

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一般来说,exchange和queue都是由我们的业务程序在运行过程中连接到rabbitmq并创建的。然而也有些特殊的场景,要求业务程序在连接使用rabbitmq之前,相关的exchange和queue必须预先创建好。这个时候对于测试人员或者运维人员来说,通常的做法是在rabbitmq安装完成后,启用rabbitmq_management插件,然后在web控制台进行操作来创建exchange和queue,并完成绑定动作。

对于当前都是讲究自动化运维的时代,这种方式显然是不能自动化的。那么一些可能的改进的方式是搞个rabbitmq的客户端写个小程序,比如python的pika,通过在脚本中调用这些程序,并传递相应的参数完成exchange,queue的创建以及对应的绑定操作。

其实通过rabbitmq本身提供的rabbitmqctl命令,同样能完成exchange和queue的创建,例如:

 

  1.  
    rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"test-topic">>}, topic, true, false, false, []).'
  2.  
     
  3.  
    rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"test-queue">>}, true, false, [], none).'
  4.  
     
  5.  
    rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"/">>, exchange, <<"test-topic">>}, <<"*.com.cn">>, {resource, <<"/">>, queue, <<"test-queue">>}, []}).'

这三条命令执行后的最终结果是:在 / 虚拟主机下创建了topic类型的,持久化的,名为 test-topic的exchange,创建了持久化的,名为 test-queue 的queue,该队列以 *.com.cn 的routing key绑定到了 test-topic这个exchange上。

=================================================================

对于 rabbitmqctl eval 官网的文档里解释是:计算任意的erlang表达式的值。


其实知道一点erlang语法的,一眼就可以看出上面的例子里,其实就是一个Module:Function(Arg)的调用。

这里需要注意:括号后的那个 . 可别忘了。

那么了解了这些后,剩下的就是exchange,queue创建及绑定动作应该调用哪个模块的哪个函数导出函数,参数的意义和格式是怎样的。

exchange的创建调用rabbit_exchange的declare函数,该函数具体声明为:

  1.  
    declare(XName, Type, Durable, AutoDelete, Internal, Args).
  2.  
     
  3.  
    XName: exchange的名称, 具体格式为 {resource, VHost, exchange, Name}
  4.  
    VHost为虚拟主机的名称
  5.  
    Nameexchange的名称
  6.  
    注意 VHost 和 Name 限定为binary形式, 即<<>>
  7.  
    Type: exchange的类型, 可选值为 direct, headers, topic, fanout
  8.  
    Durable: 是否需要持久化, true表示持久化, false为非持久化
  9.  
    AutoDelete: 是否自动删除, true表示自动删除, false为非自动删除
  10.  
    Internal: 是否为rabbitmq内部使用, true表示是内部使用, false表示不是内部使用
  11.  
    Args: exchange的其他选项参数, 一般设置为 []

补充说明:

自动删除的触发条件是:当绑定到该exchange上的所有queue和exchange都已经解除绑定时,rabbitmq自动删除该exchange。

内部使用是指:客户端不能直接向该exchange投递消息,只能由rabbitmq自己向这个exchange投递消息,一般用于exchange到exchange的绑定。另外,rabbitmq的trace机制使用的exchange也是internal类型。

queue的创建应调用rabbit_amqqueue模块的declare函数,该函数具体声明为:

  1.  
    declare(QueueName, Durable, AutoDelete, Args, Owner).
  2.  
     
  3.  
    QueueName: queue的名称, 具体格式为 {resource, VHost, queue, Name}
  4.  
    VHost为虚拟主机的名称, Name为queue的名称
  5.  
    Durable: 是否需要持久化, true表示持久化, false为非持久化
  6.  
    AutoDelete: 是否自动删除, true表示自动删除, false为非自动删除
  7.  
    Args: queue的其他选项参数, 包括消息的优先级, ttl, 队列的最大长度等, 一般设置为 []
  8.  
    Owner: 用于queue的独占模式, 一般设置为 none

 

创建绑定关系是调用rabbit_binding模块的add函数,该函数具体声明为:

 

  1.  
    add(Binding)
  2.  
     
  3.  
    Binding: 绑定关系, 可以是exchange到exchange, 也可以是exchange到queue
  4.  
     
  5.  
    具体格式为 {binding, Source, Key, Destination, Args}
  6.  
    Source 为 消息源, 必须为exchange: {resource, VHost, exchange, Name}
  7.  
    Key 为 routing-key
  8.  
    Destination 为目的 {resource,VHost,exchange,XName} 或者 {resource, VHost, queue, QName}
  9.  
    Args 为其他选项参数, 一般设置为 []

回过头来再看看前面例子中的命令,应该就不陌生了:)

=====================================================

总结:通过rabbitmqctl eval可以在命令行模式下完成exchange,queue的创建及绑定操作。这样配合shell脚本能较好的达到自动化的方式。




posted on 2019-09-06 20:39  纯黑Se丶  阅读(1554)  评论(0编辑  收藏  举报