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的创建,例如:

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脚本能较好的达到自动化的方式。




  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RabbitMQ和NetMQ都是消息队列(Message Queue)的实现,但它们有不同的设计目标和实现方式。 RabbitMQ是一个开源的AMQP(Advanced Message Queuing Protocol)消息代理,它使用Erlang语言编写,具有高可用性、可扩展性和可靠性。RabbitMQ支持多种消息协议,包括AMQP、STOMP、MQTT等,可以在多种编程语言中使用,如Java、Python、Ruby等。RabbitMQ的核心概念是ExchangeQueue和Binding,它们共同构成了消息路由的基础。Exchange用于接收消息并将其路由到一个或多个Queue中,Binding则定义了ExchangeQueue之间的关系。 NetMQ是一个轻量级的消息队列库,它使用C#语言编写,基于ZeroMQ协议实现。NetMQ的设计目标是提供高性能、低延迟的消息传递,支持多种消息模式,如Request-Reply、Publish-Subscribe、Push-Pull等。NetMQ的核心概念是Socket,它是消息传递的基本单元,可以通过不同的Socket类型实现不同的消息模式。 下面是一个使用RabbitMQ的例子,演示如何启动一个集群并添加新的节点: 1.首先,在三台服务器上分别安装RabbitMQ,并将rabbitmq.conf和cookie文件拷贝到相应的目录中。 2.在mq1上启动RabbitMQ节点: ```shell rabbitmq-server -detached ``` 3.在mq2和mq3上启动RabbitMQ节点,并将它们加入到mq1的集群中: ```shell rabbitmq-server -detached rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@mq1 rabbitmqctl start_app ``` 4.现在,我们让mq4也加入进来: ```shell rabbitmq-queues add_member "quorum.queue" "rabbit@mq4" ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值