RocketMq namesvr 最佳实践
Apache RocketMQ中,name servers被设计用来协调分布式系统的每个部分,协调主要是完成topic路由信息管理。
管理包含两部分
- Brokers 定期更新在name server中的 meta data 。
- Name servers 是提供服务的客户端,包括producer,consumer和包含最新路由信息的命令行客户端。
因此, 运行brokers和clients之前,需要通过一个nsv地址告诉它们如何去访问nsv,有四个方法:
程序方式
在Broker里,我们可以在配置文件指定:namesrvAddr=name-server-ip1:port;name-server-ip2:port。
在 producers 和 consumers, 我们可以按照下面的方法指定:
DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
producer.setNamesrvAddr("name-server1-ip:port;name-server2-ip:port");
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name");
consumer.setNamesrvAddr("name-server1-ip:port;name-server2-ip:port");
如果用命令行,可以这样:
sh mqadmin command-name -n name-server-ip1:port;name-server-ip2:port -X OTHER-OPTION
A simple example is: sh mqadmin -n localhost:9876 clusterList assuming to query cluster info on the name server node.
如果你集成了admin工具在你的dashboard,你可以这样:
DefaultMQAdminExt defaultMQAdminExt = new DefaultMQAdminExt("please_rename_unique_group_name");
defaultMQAdminExt.setNamesrvAddr("name-server1-ip:port;name-server2-ip:port");
Java 参数
还可以在启动前通过指定java 参数rocketmq.namesrv.addr
环境参数
设置NAMESRV_ADDR环境参数
HTTP Endpoint
如果你没有按照之前上面的几种方式来设置, Apache RocketMQ还可以访问下面的HTTP 端点来获取更新nsv(每两分钟,最初延迟十秒)。
通常,接口是:
你可以重写在java参数中 jmenv.tbsite.net: rocketmq.namesrv.domain, 还可以通过这个重写: rocketmq.namesrv.domain.subgroup
如果在生产环境运行,这种方式比较推荐。因为它给你很大的方便,可以动态增加去除nsv节点而不需要重启broker和客户端。
优先级
Programmatic Way > Java Options > Environment Variable > HTTP Endpoint