1.访问ES的方式
访问es的方式有两种,一种是http方式,还有一种是java客户端方式。
其中Java客户端又分为:
1.1.Node client:
节点客户端实际上是一个集群中的节点(但不保存数据,不能成为主节点)。因为它是一个节点,它知道整个集群状态(所有节点驻留,分片分布在哪些节点,数据在集群中的具体位置等等),这意味着它可以执行 APIs 而且少了一个网络跃点。能够直接转发请求到对应的节点上。
1.2.Transport Client:
传输客户端作为一种轻量级客户端,本身不加入集群,只是简单的发送请求到远端集群中的节点,作为一个集群和应用程序之间的通信层。它知道 API 并能自动帮你在节点之间轮询,帮你嗅探集群等等。但它是集群 外部的 ,和 REST 客户端类似。我们访问的节点负责收集各节点返回的数据(query fetch merge),最后一起返回给客户端。
构造transportClient时候,需要指定sniff是否为true
if (this.settings.getAsBoolean("client.transport.sniff", false)) { this.nodesSampler = new SniffNodesSampler(); } else { this.nodesSampler = new SimpleNodeSampler(); }
这里先提一下:节点通信有5种类型:Recovery Bulk Reg State Ping
SniffNodesSampler:client会主动发现集群里的其他节点,会创建fully connect(每两个节点间建立5种连接)
SimpleNodeSampler:ping listedNodes中的所有node,区别在于这里创建的都是light connect(简单的ping和查询连接)
注意:在ES7中不建议使用Transport Client,在ES8中去除Transport Client用Java High Level REST Client代替
访问远端集群,尽量以轮询方式访问目标节点
2.如何选择JAVA客户端
如果要将应用程序和 Elasticsearch 集群进行解耦,传输客户端是一个理想的选择。例如,如果您的应用程序需要快速的创建和销毁到集群的连接,传输客户端比节点客户端”轻”,因为它不是一个集群的一部分。类似地,如果您需要创建成千上万的连接,你不想有成千上万节点加入集群。传输客户端( TC )将是一个更好的选择。
另一方面,如果你只需要有少数的、长期持久的对象连接到集群,客户端节点可以更高效,因为它知道集群的布局。但是它会使你的应用程序和集群耦合在一起,所以从防火墙的角度,它可能会构成问题。