节点选择器编辑

客户端以循环方式将每个请求发送到配置的节点之一。节点可以选择通过节点选择器进行过滤,该选择器需要在初始化客户端时提供。当启用嗅探时,这很有用,以防 HTTP 请求不应命中任何专用主节点。对于每个请求,客户端将运行最终配置的节点选择器以过滤节点候选者,然后从剩余的候选者中选择列表中的下一个节点。

RestClientBuilder builder = RestClient.builder(
        new HttpHost("localhost", 9200, "http"));
builder.setNodeSelector(new NodeSelector() { 
    @Override
    public void select(Iterable<Node> nodes) {
        /*
         * Prefer any node that belongs to rack_one. If none is around
         * we will go to another rack till it's time to try and revive
         * some of the nodes that belong to rack_one.
         */
        boolean foundOne = false;
        for (Node node : nodes) {
            String rackId = node.getAttributes().get("rack_id").get(0);
            if ("rack_one".equals(rackId)) {
                foundOne = true;
                break;
            }
        }
        if (foundOne) {
            Iterator<Node> nodesIt = nodes.iterator();
            while (nodesIt.hasNext()) {
                Node node = nodesIt.next();
                String rackId = node.getAttributes().get("rack_id").get(0);
                if ("rack_one".equals(rackId) == false) {
                    nodesIt.remove();
                }
            }
        }
    }
});

设置一个分配感知节点选择器,该选择器允许选择本地机架中的节点(如果有),否则转到任何其他机架中的任何其他节点。它充当首选项而不是严格要求,因为它在没有本地节点可用时会转到另一个机架,而不是在这种情况下返回没有节点,这将迫使客户端在没有来自首选机架的节点可用时恢复本地节点。

不一致地选择同一组节点的节点选择器将使循环行为不可预测,并且可能不公平。上面的首选项示例很好,因为它考虑了节点的可用性,这已经影响了循环的预测性。节点选择不应依赖于其他外部因素,否则循环将无法正常工作。