elasticsearch NodeBuilder与TranportClient

对于其他弹性搜索开发者来说可能是一个非常简单(和愚蠢)的问题,这两者之间有什么区别?

我正在从Java webapp连接到远程elasticsearch服务器,到目前为止我一直在使用TransportClient,但我想知道是否可以使用NodeBuilder,或者NodeBuilder应该只用于嵌入式客户端?

如果两者中的任何一个都可用于连接到远程ES服务器,哪一个在内存和性能方面应该更好?

如果有人能指出我连接到远程ES服务器的NodeBuilder示例会很棒,因为我没有任何幸运的发现。

谢谢。

NodeBuilder还可用于连接到群集。

Node node = nodeBuilder().clusterName("yourcluster").client(true).node(); Client client = node.client(); 

它将作为另一个节点加入集群,并将了解整个拓扑。 使用节点,您可以使用多播来发现其他正在运行的节点。

我的观点是我更喜欢使用TransportClient不是NodeClient因为其他集群节点在TransportClient停止时不会收到无用的信息。 当NodeClient停止时,每个节点必须知道即使他们不必管理它,因为它不保存任何数据。 另外,我在调试模式中看到NodeClient启动的Threads比TransportCLient多。 所以我认为TransportClient的内存占用较少。

顺便说一句,如果你使用Spring,你可以使用spring-elasticsearch工厂。 如果没有,您可以随时查看源代码,了解我如何管理NodeClient与TransportClient。

希望这可以帮助。

编辑2016-03-09 :不应使用NodeClient 。 如果需要,人们应该创建一个客户端节点(使用node.data: falsenode.master: false启动node.data: false节点)并使用TransportClient在本地连接到它。

如果我正确理解文档,那么使用节点客户端是有益的,至少如果你有分片:

使用[Node]客户端的好处是,操作自动路由到需要执行操作的节点,而不执行“双跳”。 例如,索引操作将自动在最终存在的分片上执行。

VS

它[传输客户端]不加入群集,而只是获取一个或多个初始传输地址,并在每个操作上以循环方式与它们通信(尽管大多数操作可能是“两跳”操作)。

正如我所解释的那样,使用一个节点(最好是客户端设置为true)加入集群然后在该节点上使用Client,您将直接将请求发送到集群中的正确节点。

使用TransportClient,您将连接到任何节点,然后该节点将请求重定向(或可能转发请求,不确定)到正确的节点(“两跳”)

在网络流量和节点负载方面,使用Node Client应该更有效。

此外,人们应该知道Node客户端加入了完整的网状集群,并且也成为了一个代理服务器,因此其他客户端也可以连接到它,并且能够服务器插件站点,这在锁定集群时需要考虑。

节点客户端可用于进行分散收集,因此可以减轻数据节点的某些处理。

不确定传输客户端是否也分散聚集。