我正在使用 Golang & elastic client .
下面是我的客户端创建逻辑:
if client, err := elastic.NewClient(elastic.SetURL(ElasticsearchURL)); err != nil {
// Handle error
logger.Error.Println(err)
return nil
} else {
return client
}
什么是正确的做法:
- 在整个应用程序中保持客户端对象单例?
- 为每个请求创建和关闭客户端?
我对以下链接中违反直觉的答案感到困惑:
- where-to-close-an-elasticsearch-client-connection - 建议每个应用一个连接
- how-many-transport-clients-can-a-elasticsearch-cluster-have - 建议每个应用一个连接
- elasticsearch-how-to-query-for-number-of-connections -- 某种程度上表示连接在服务请求后迅速终止
最佳答案
这取决于应用。
在 99% 的用例中,您有一个正常的、长时间运行的应用程序。那么你应该只用 elastic.NewClient
创建一个客户端.您可以在您的代码中传递它,它应该始终有效,即使在不同的 goroutine 中也是如此。这将创建一个长期运行的客户端,它有几个好处。例如。它将在后台运行健康检查,以防止 Elastic 向不健康或死节点发送请求。
但是,如果您有一个短期运行的应用程序(例如 AWS Lambda 或 Cloud Functions),您可能需要请求级别的“连接”。在那种特定情况下,您可以使用 elastic.NewSimpleClient
.虽然每次都要创建一个新客户端,但它的开销要多一些。它不会做任何健康检查和其他事情。
不要为每个请求创建一个带有 elastic.NewClient
的新客户端,因为对 NewClient
的任何调用都会创建一组 goroutines,你很快就会用完资源,如果你这样做的话。
请阅读documentation和 wiki了解更多详情。
关于elasticsearch - 我们应该在应用程序中创建多少个 elasticsearch 客户端连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48991297/