【问题标题】:How many elasticsearch client connection should we create in the application我们应该在应用程序中创建多少个 elasticsearch 客户端连接
【发布时间】:2018-04-28 20:46:30
【问题描述】:

我正在使用 Golang 和 elastic client

下面是我的客户端创建逻辑:

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 -- 有点表示在服务请求后连接很快就死了

【问题讨论】:

  • 您在比较不同类型的客户端并将“连接”与“客户端”混淆。 docs 专门说NewClient, by default, is meant to be long-lived and shared across your application

标签: elasticsearch go


【解决方案1】:

这取决于应用程序。

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

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

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

请阅读documentationwiki 了解更多详情。

【讨论】:

  • 我在整个应用程序中使用了一个客户端对象(长时间运行)......并且还进行了负载测试,没有发现任何问题,这里给出的解释也很有意义......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多