一般来说,exchange和queue都是由我们的业务程序在运行过程中连接到rabbitmq并创建的。然而也有些特殊的场景,要求业务程序在连接使用rabbitmq之前,相关的exchange和queue必须预先创建好。这个时候对于测试人员或者运维人员来说,通常的做法是在rabbitmq安装完成后,启用rabbitmq_management插件,然后在web控制台进行操作来创建exchange和queue,并完成绑定动作。
创新互联公司专业为企业提供宁国网站建设、宁国做网站、宁国网站设计、宁国网站制作等企业网站建设、网页设计与制作、宁国企业网站模板建站服务,10多年宁国做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。对于当前都是讲究自动化运维的时代,这种方式显然是不能自动化的。那么一些可能的改进的方式是搞个rabbitmq的客户端写个小程序,比如python的pika,通过在脚本中调用这些程序,并传递相应的参数完成exchange,queue的创建以及对应的绑定操作。
其实通过rabbitmq本身提供的rabbitmqctl命令,同样能完成exchange和queue的创建,例如:
rabbitmqctl eval \'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"test-topic">>}, topic, true, false, false, []).\' rabbitmqctl eval \'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"test-queue">>}, true, false, [], none).\' 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函数,该函数具体声明为:
declare(XName, Type, Durable, AutoDelete, Internal, Args). XName: exchange的名称, 具体格式为 {resource, VHost, exchange, Name} VHost为虚拟主机的名称 Name为exchange的名称 注意 VHost 和 Name 限定为binary形式, 即<<>> Type: exchange的类型, 可选值为 direct, headers, topic, fanout Durable: 是否需要持久化, true表示持久化, false为非持久化 AutoDelete: 是否自动删除, true表示自动删除, false为非自动删除 Internal: 是否为rabbitmq内部使用, true表示是内部使用, false表示不是内部使用 Args: exchange的其他选项参数, 一般设置为 [] 补充说明:
自动删除的触发条件是:当绑定到该exchange上的所有queue和exchange都已经解除绑定时,rabbitmq自动删除该exchange。
内部使用是指:客户端不能直接向该exchange投递消息,只能由rabbitmq自己向这个exchange投递消息,一般用于exchange到exchange的绑定。另外,rabbitmq的trace机制使用的exchange也是internal类型。
queue的创建应调用rabbit_amqqueue模块的declare函数,该函数具体声明为:
declare(QueueName, Durable, AutoDelete, Args, Owner). QueueName: queue的名称, 具体格式为 {resource, VHost, queue, Name} VHost为虚拟主机的名称, Name为queue的名称 Durable: 是否需要持久化, true表示持久化, false为非持久化 AutoDelete: 是否自动删除, true表示自动删除, false为非自动删除 Args: queue的其他选项参数, 包括消息的优先级, ttl, 队列的长度等, 一般设置为 [] Owner: 用于queue的独占模式, 一般设置为 none
创建绑定关系是调用rabbit_binding模块的add函数,该函数具体声明为:add(Binding) Binding: 绑定关系, 可以是exchange到exchange, 也可以是exchange到queue 具体格式为 {binding, Source, Key, Destination, Args} Source 为 消息源, 必须为exchange: {resource, VHost, exchange, Name} Key 为 routing-key Destination 为目的 {resource,VHost,exchange,XName} 或者 {resource, VHost, queue, QName} Args 为其他选项参数, 一般设置为 []
回过头来再看看前面例子中的命令,应该就不陌生了:)
=====================================================总结:通过rabbitmqctl eval可以在命令行模式下完成exchange,queue的创建及绑定操作。这样配合shell脚本能较好的达到自动化的方式。