博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊Elasticsearch RestClient的NodeSelector
阅读量:7246 次
发布时间:2019-06-29

本文共 6695 字,大约阅读时间需要 22 分钟。

本文主要研究一下Elasticsearch RestClient的NodeSelector

NodeSelector

elasticsearch-7.0.1/client/rest/src/main/java/org/elasticsearch/client/NodeSelector.java

public interface NodeSelector {    /**     * Select the {@link Node}s to which to send requests. This is called with     * a mutable {@link Iterable} of {@linkplain Node}s in the order that the     * rest client would prefer to use them and implementers should remove     * nodes from the that should not receive the request. Implementers may     * iterate the nodes as many times as they need.     * 

* This may be called twice per request: first for "living" nodes that * have not been blacklisted by previous errors. If the selector removes * all nodes from the list or if there aren't any living nodes then the * {@link RestClient} will call this method with a list of "dead" nodes. *

* Implementers should not rely on the ordering of the nodes. */ void select(Iterable

nodes); /* * We were fairly careful with our choice of Iterable here. The caller has * a List but reordering the list is likely to break round robin. Luckily * Iterable doesn't allow any reordering. */ /** * Selector that matches any node. */ NodeSelector ANY = new NodeSelector() { @Override public void select(Iterable
nodes) { // Intentionally does nothing } @Override public String toString() { return "ANY"; } }; /** * Selector that matches any node that has metadata and doesn't * have the {@code master} role OR it has the data {@code data} * role. */ NodeSelector SKIP_DEDICATED_MASTERS = new NodeSelector() { @Override public void select(Iterable
nodes) { for (Iterator
itr = nodes.iterator(); itr.hasNext();) { Node node = itr.next(); if (node.getRoles() == null) continue; if (node.getRoles().isMasterEligible() && false == node.getRoles().isData() && false == node.getRoles().isIngest()) { itr.remove(); } } } @Override public String toString() { return "SKIP_DEDICATED_MASTERS"; } };}复制代码

  • NodeSelector接口定义了select方法,它接收mutable的Iterable,然后具体实现会选择性删除node;它定义了ANY、SKIP_DEDICATED_MASTERS两个匿名实现类,其中ANY的select方法不做任何操作;SKIP_DEDICATED_MASTERS的select方法会删除date为false、ingest为false的master node;除此之外还有HasAttributeNodeSelector、PreferHasAttributeNodeSelector两个实现类

HasAttributeNodeSelector

elasticsearch-7.0.1/client/rest/src/main/java/org/elasticsearch/client/HasAttributeNodeSelector.java

public final class HasAttributeNodeSelector implements NodeSelector {    private final String key;    private final String value;    public HasAttributeNodeSelector(String key, String value) {        this.key = key;        this.value = value;    }    @Override    public void select(Iterable
nodes) { Iterator
itr = nodes.iterator(); while (itr.hasNext()) { Map
> allAttributes = itr.next().getAttributes(); if (allAttributes == null) continue; List
values = allAttributes.get(key); if (values == null || false == values.contains(value)) { itr.remove(); } } } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } HasAttributeNodeSelector that = (HasAttributeNodeSelector) o; return Objects.equals(key, that.key) && Objects.equals(value, that.value); } @Override public int hashCode() { return Objects.hash(key, value); } @Override public String toString() { return key + "=" + value; }}复制代码
  • HasAttributeNodeSelector实现了NodeSelector接口,其构造器接收key、value参数,其select方法会删除node的attributes没有该key或者该key对应的value为null的node

PreferHasAttributeNodeSelector

elasticsearch-7.0.1/client/rest/src/main/java/org/elasticsearch/client/PreferHasAttributeNodeSelector.java

public final class PreferHasAttributeNodeSelector implements NodeSelector {    private final String key;    private final String value;    public PreferHasAttributeNodeSelector(String key, String value) {        this.key = key;        this.value = value;    }    @Override    public void select(Iterable
nodes) { boolean foundAtLeastOne = false; for (Node node : nodes) { Map
> attributes = node.getAttributes(); if (attributes == null) { continue; } List
values = attributes.get(key); if (values == null) { continue; } if (values.contains(value)) { foundAtLeastOne = true; break; } } if (foundAtLeastOne) { Iterator
nodeIterator = nodes.iterator(); while (nodeIterator.hasNext()) { Map
> attributes = nodeIterator.next().getAttributes(); if (attributes == null) { continue; } List
values = attributes.get(key); if (values == null || !values.contains(value)) { nodeIterator.remove(); } } } } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } PreferHasAttributeNodeSelector that = (PreferHasAttributeNodeSelector) o; return Objects.equals(key, that.key) && Objects.equals(value, that.value); } @Override public int hashCode() { return Objects.hash(key, value); } @Override public String toString() { return key + "=" + value; }}复制代码
  • PreferHasAttributeNodeSelector实现了NodeSelector接口,其构造器接收key、value参数,其select方法会先遍历nodes设置foundAtLeastOne,如果foundAtLeastOne为true才会删除node的attributes没有该key或者该key对应的value为null的node

小结

  • NodeSelector接口定义了select方法,它接收mutable的Iterable,然后具体实现会选择性删除node;它定义了ANY、SKIP_DEDICATED_MASTERS两个匿名实现类,其中ANY的select方法不做任何操作;SKIP_DEDICATED_MASTERS的select方法会删除date为false、ingest为false的master node
  • HasAttributeNodeSelector实现了NodeSelector接口,其构造器接收key、value参数,其select方法会删除node的attributes没有该key或者该key对应的value为null的node
  • PreferHasAttributeNodeSelector实现了NodeSelector接口,其构造器接收key、value参数,其select方法会先遍历nodes设置foundAtLeastOne,如果foundAtLeastOne为true才会删除node的attributes没有该key或者该key对应的value为null的node

doc

转载于:https://juejin.im/post/5cdc2fc96fb9a032012452ce

你可能感兴趣的文章
Adapter 适配器模式(设计模式03)
查看>>
前端调错(一)---ajax返回数据成功,却进入error方法
查看>>
Java千百问_05面向对象(009)_java的多态性都有什么表现
查看>>
SQL Server分页3种方案比拼[转]
查看>>
《从零开始学Swift》学习笔记(Day 25)——类和结构体定义
查看>>
C语言函数
查看>>
iCalendar格式中关于RRule的解析和生成
查看>>
程序员的量化交易之路(15)--Cointrader之EntityBase类(3)
查看>>
Maven使用笔记(二)Eclipse中maven项目添加依赖
查看>>
跟我一起数据挖掘(9)——R语言
查看>>
Silverlight实用窍门系列:49.Silverlight中管理独立存储--Isolated Storage【附带实例源码】...
查看>>
PostgreSQL standby in 64bit to 32bit or reverse enviroment
查看>>
架构师画像
查看>>
一分钟了解阿里云产品:消息队列
查看>>
(二十三)变量名的命名
查看>>
如何保证摘除公网EIP的容器服务VPC集群可以正常访问公网
查看>>
linux进程状态浅析
查看>>
【JavaScript】DOM节点常用方法介绍02
查看>>
异步操作系列之Generator函数与Async函数
查看>>
水平无限循环弹幕的实现
查看>>