节点选择器
编辑节点选择器编辑
客户端以循环方式将每个请求发送到配置的节点之一。节点可以选择通过节点选择器进行过滤,该选择器需要在初始化客户端时提供。当启用嗅探时,这很有用,以防 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(); } } } } });
设置一个分配感知节点选择器,该选择器允许选择本地机架中的节点(如果有),否则转到任何其他机架中的任何其他节点。它充当首选项而不是严格要求,因为它在没有本地节点可用时会转到另一个机架,而不是在这种情况下返回没有节点,这将迫使客户端在没有来自首选机架的节点可用时恢复本地节点。 |
不一致地选择同一组节点的节点选择器将使循环行为不可预测,并且可能不公平。上面的首选项示例很好,因为它考虑了节点的可用性,这已经影响了循环的预测性。节点选择不应依赖于其他外部因素,否则循环将无法正常工作。