节点选择器

编辑

客户端以轮询方式将每个请求发送到配置的节点之一。可以选择通过节点选择器过滤节点,该节点选择器需要在初始化客户端时提供。当启用嗅探时,这很有用,以防止 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();
                }
            }
        }
    }
});

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

未始终如一地选择同一组节点的节点选择器将使轮询行为变得不可预测,并且可能不公平。上面的偏好示例是可以接受的,因为它考虑了节点可用性,而节点可用性已经影响了轮询的可预测性。节点选择不应依赖于其他外部因素,否则轮询将无法正常工作。