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

标签 elasticsearch go

我正在使用 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 -- 某种程度上表示连接在服务请求后迅速终止

最佳答案

这取决于应用。

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

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

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

请阅读documentationwiki了解更多详情。

关于elasticsearch - 我们应该在应用程序中创建多少个 elasticsearch 客户端连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48991297/

相关文章:

json - 反序列化 "oneOf"结构的 Json 数组

Go 编译的二进制文件不会在 Ubuntu 主机上的 alpine docker 容器中运行

windows - 如何更改 "go build"的构建路径?

go - 如何做 Mock Go-lang GRPC 方法

json - 从Elasticsearch索引创建Atom或RSS格式的搜索页面,以JSON返回结果

elasticsearch - Elasticsearch快照到s3

go - 如何解决golang中 "missing Location in call to Date"的错误

elasticsearch - doc_values如何在ElasticSearch中工作

php - OR和And不能按预期工作

python - 如何获取所有包含elasticsearch-dsl查询关键字的结果?