ElasticSearch:Jest vs Rest vs TransportClient vs NodeClient

use*_*246 5 elasticsearch

我已经浏览了https://www.elastic.co/blog/found-interfacing-elasticsearch-picking-client上的官方文档

但它没有给出任何基准或性能数据来帮助客户进行选择.我发现设置TransportClient设置NodeClient非常简单,因为它的文档也非常稀少,几乎没有任何示例.

因此,如果有人已经在选择客户端时做了一些基准测试,我会非常感谢并且更多地关注调整已建立的客户端而不是评估要选择的客户端.

我们的应用程序是一个重量级的应用程序,我们计划为此设置一个50-shard,50-replica ES集群.

Val*_*Val 5

所有这些客户端都可以进行查询,并且各有利弊(以下列表并不详尽):

  • 一个节点客户端提供了一个单跳到集群中,但因为它也将是集群的一部分,它也可以促使集群内太多喋喋不休
  • 传输客户端是未集群的一部分,因此,需要一个两跳往返,并在以循环方式一次一个节点(从其构造期间提供的列表)进行通信
  • 笑话基本上是ES REST接口缺少的客户端
  • 如果您觉得不需要Jest提供的所有功能,而只是想与几个端点进行交互,则最好使用Spring REST模板,Apache HTTP等来创建自己的REST客户端。

如果您要使用大量写入的应用程序,我建议您甚至根本不要使用任何这些客户端。主要原因是它们本质上都是同步的,如果您的架构或网络的任何组件由于某种原因而发生故障,那么您将丢失数据,这可能不是您的选择。

如果您要提取大量数据,通常可以采用异步方式,即将数据存储在临时(但持久)队列(Kafka,Redis,JMS等)中,然后让另一个进程将其流式传输到ES。有很多方法可以做到这一点,但是一个非常简单的方法就是使用Logstash

无论您决定将数据存储在Kafka还是JMS或Redis中,都可以让Logstash使用数据并将其流式传输到ES,即让Logstash担心繁重的写操作,这非常好。这可以很容易地实现

使用这种经过良好调整的设置,您可以处理非常重的写入负载,而不必担心要使用哪个客户端以及如何调整它。不过,这个问题仍然可以查询,但由于在您的情况下写部分至关重要,因此您需要使其牢固,唯一的严肃方法是进行异步操作,并让经过良好开发和测试的ETL(例如Logstash,或流利,等等)为您做到。

更新

值得注意的是,从ES 5.0开始,将有一个新的Java REST客户端可用。