You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@rocketmq.apache.org by zhangyubo_qq <80...@qq.com> on 2019/03/29 17:31:09 UTC

nameserver集群架构疑问

hi,请问nameserver两个问题:

1,nameserver集群节点间互不通讯,这个怎么保证节点里存储的数据一致性问题呢?
比如,不同nameserver节点存储的topic路由数据可能会不一致。而client会连其中一个节点

2,nameserver地址通过静态http地址可以获取,这个 “http://jmenv.tbsite.net:8080/rocketmq/nsaddr <http://jmenv.tbsite.net:8080/rocketmq/nsaddr>” 8080进程的源码在哪个module里啊,没找到?不清楚这个暴露web接口的进程,内部是否会对nameserver集群各节点数据一致性做判断并维护


from yb

Re: nameserver集群架构疑问

Posted by zhangyubo_qq <80...@qq.com>.
多谢解答

针对问题1:
NameServer集群节点互不通讯,无法做到强一致性,其思想类似于最终一致性。
如您所说,消费可能出现一定的问题,其实生产也一样。以生产为例:有可能从当前那台nameserver节点没找到topic的路由信息,看了下源码,
这块最终会将异常抛出给发送客户端(return new OMSRuntimeException("-1", String.format("Topic does not exist, Topic=%s, msgId=%s",
    topic, msgId), e);)
这块想问下,这种解决方案,是出于肯定会最终一致的考虑,所以希望用户监听异常,然后对消息发送不断重试直到成功吗?因为有的业务消息不能丢。
其次,底层实现这块,为什么在取不到路由信息的时候,不主动尝试下更换一个nameserver节点,也许就能取到数据了?


针对问题2:
nameserver地址通过静态http地址?
我想问的是,这个静态web服务的源码在哪里?是服务端serversocket,不是找怎么去调用该静态web服务的客户端代码。
也就是说我想看看提供查询地址列表的web服务端的代码逻辑,包括是怎么存储所有nameserver地址的,做没做持久化,有没有对nameserver集群状态做维护管理等

感谢您的回复



> 在 2019年3月30日,上午11:09,丁威 <dw...@126.com> 写道:
> 
> 针对问题1:
> NameServer集群节点互不通讯,这个怎么保证节点存储数据的一致性。
> 无法做到强一致性,其思想类似于最终一致性,极端情况下,例如NameServer出现所谓的网络分区,nameServer的数据会不一致,这样有可能导致消息消费出现一定的问题,但RocketMQ实践中,NameServer,Broker处在同一个网络,故发生无法最终一致性的情况几乎是不会发生的。
> 
> 
> 针对问题2:
> Broker通过固定地址获取NameServer的代码入口为:BrokerController,通过一个定时任务定时去拉取。
> <image.png>
> 
> 
> 
> 
> 
> 在 2019-03-30 01:31:09,"zhangyubo_qq" <80...@qq.com> 写道:
> hi,请问nameserver两个问题:
> 
> 1,nameserver集群节点间互不通讯,这个怎么保证节点里存储的数据一致性问题呢?
> 比如,不同nameserver节点存储的topic路由数据可能会不一致。而client会连其中一个节点
> 
> 2,nameserver地址通过静态http地址可以获取,这个 “http://jmenv.tbsite.net:8080/rocketmq/nsaddr <http://jmenv.tbsite.net:8080/rocketmq/nsaddr>” 8080进程的源码在哪个module里啊,没找到?不清楚这个暴露web接口的进程,内部是否会对nameserver集群各节点数据一致性做判断并维护
> 
> 
> from yb
> 
> 
>  


Re:nameserver集群架构疑问

Posted by 丁威 <dw...@126.com>.
针对问题1:
NameServer集群节点互不通讯,这个怎么保证节点存储数据的一致性。
无法做到强一致性,其思想类似于最终一致性,极端情况下,例如NameServer出现所谓的网络分区,nameServer的数据会不一致,这样有可能导致消息消费出现一定的问题,但RocketMQ实践中,NameServer,Broker处在同一个网络,故发生无法最终一致性的情况几乎是不会发生的。




针对问题2:
Broker通过固定地址获取NameServer的代码入口为:BrokerController,通过一个定时任务定时去拉取。






在 2019-03-30 01:31:09,"zhangyubo_qq" <80...@qq.com> 写道:

hi,请问nameserver两个问题:


1,nameserver集群节点间互不通讯,这个怎么保证节点里存储的数据一致性问题呢?
比如,不同nameserver节点存储的topic路由数据可能会不一致。而client会连其中一个节点


2,nameserver地址通过静态http地址可以获取,这个 “http://jmenv.tbsite.net:8080/rocketmq/nsaddr” 8080进程的源码在哪个module里啊,没找到?不清楚这个暴露web接口的进程,内部是否会对nameserver集群各节点数据一致性做判断并维护




from yb