节点选择器

编辑

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

设置一个分配感知的节点选择器,允许在任何可用的情况下选择本地机架中的节点,否则转到任何其他机架中的任何其他节点。它充当首选项而不是严格的要求,因为它在没有本地节点可用时会转到另一个机架,而不是在这种情况下返回任何节点,这将使客户端在任何首选机架中的节点都不可用时强制重新激活本地节点。

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