我们应该在应用程序中创建多少个elasticsearch客户端连接

时间:2018-02-26 14:57:27

标签: elasticsearch go

我正在使用Golang& elastic client

Bellow是我的客户创建逻辑:

if client, err := elastic.NewClient(elastic.SetURL(ElasticsearchURL)); err != nil {
    // Handle error
    logger.Error.Println(err)
    return nil
} else {
    return client
}

正确的做法是什么:

  • 将客户端对象单例保留在应用程序中吗?
  • 为每个请求创建并关闭客户端?

我对以下链接中违反直觉的答案感到困惑:

  1. where-to-close-an-elasticsearch-client-connection - 建议每个应用一个连接
  2. how-many-transport-clients-can-a-elasticsearch-cluster-have - 建议每个应用一个连接
  3. elasticsearch-how-to-query-for-number-of-connections - 表示连接在服务请求后很快死亡

1 个答案:

答案 0 :(得分:1)

这取决于应用程序。

在99%的用例中,您拥有一个正常的,长期运行的应用程序。然后,您应该只使用elastic.NewClient创建一个客户端。您可以在代码中传递它,它应该始终有效,即使在不同的goroutines中也是如此。这将创建一个长期运行的客户端,它有几个好处。例如。它将在后台运行健康检查,以防止Elastic向不健康或死亡的节点发送请求。

但是,如果您有一个短期运行的应用程序(类似AWS Lambda oder Cloud Functions),您可能需要一个"连接"在请求级别。在这种特定情况下,您可以使用elastic.NewSimpleClient。虽然每次都在创建一个新客户端,但它有更多的开销。它不会做任何健康检查和其他事情。

请勿为每个请求创建一个elastic.NewClient的新客户端,因为对NewClient的任何调用都会创建一组goroutine,如果您这样做,您将很快耗尽资源。

请阅读documentationwiki了解详情。