rabbitmq--通过rabbitmqctl创建exchange和queue

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

rabbitmq--通过rabbitmqctl创建exchange和queue
⼀般来说,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">>}, <<"*">>, {resource, <<"/">>, queue, <<"test-queue">>}, []}).'
这三条命令执⾏后的最终结果是:在 / 虚拟主机下创建了topic类型的,持久化的,名为 test-topic的exchange,创建了持久化的,名为 test-queue 的queue,该队列以 * 的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.
Name为exchange的名称
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的使⽤的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脚本能较好的达到⾃动化的⽅式。

相关文档
最新文档