最近研究ICE通话器使用间接代理情况下,对endpoints的选择机制上有一些模糊,仔细读了ICE的代码,才搞清了它的原理:
Ice使用直接代理时不必多说;
Ice通话器在采用间接代理时,首先从Grid的Locator获得真实服务的Endpoint地址列表,(取回的个数可在grid的xml配置文件中设置。(<load-balancing type="round-robin" n-replicas="0"/>,0全部,1返回1个,n指定个数)
无论选择何种设置,客户端会保存endpoints的列表(可能是多个ip端口地址),此时客户端
如果设置为App.Proxy.EndpointSelection= Random 则将endpoints序列随机重新排序,并选择第一个作为首先连接地址(如果配置order,则不进行随机重排);连接动作是一个异步操作,连接失败会按照列表依次重试;如果连接成功,该通话器的每次调用,(checkcast)时,只对连接有效性进行一下验证,如果连接正常则直接使用,及时客户端有多个endpoint的列表,也不会进行的选择(估计是出于效率的考虑)。
如果n-replicas=”1”(ice默认)哪么endpoints的选择工作就在服务端进行了。
可以得出结论:一般情况应该采用grid负载均衡的方式,当建立不同的通话器的时候,就可以自动选择到不同的endpoint。(服务端,客户端都可选择默认设置 n-replicas="1")