.NET 客户端注意事项和最佳实践
以下章节提供了有关使用 .NET 客户端的注意事项和最佳实践的信息。
将 OpenSearch.Client 注册为单例
通常,您应该将 OpenSearch.Client 设置为单例。OpenSearch.Client 管理与服务器的连接以及集群中节点的状态。此外,每个客户端的设置都涉及大量配置。因此,创建一次 OpenSearch.Client 实例并将其重复用于所有 OpenSearch 操作是有益的。该客户端是线程安全的,因此同一实例可以由多个线程共享。
异常
以下是 .NET 客户端可能抛出的异常类型
OpenSearchClientException
是一个已知异常,它发生在请求管道中(例如,达到超时)或 OpenSearch 中(例如,格式错误的查询)。如果它是 OpenSearch 异常,则ServerError
响应属性包含 OpenSearch 返回的错误。UnexpectedOpenSearchClientException
是一个未知异常(例如,反序列化期间的错误),并且是 OpenSearchClientException 的子类。- 当 API 未正确使用时,会抛出系统异常。
节点
要创建节点,请将其构造函数中传入一个 Uri
对象
var uri = new Uri("http://example.org/opensearch");
var node = new Node(uri);
首次创建时,节点是主节点候选,其 HoldsData
属性设置为 true。上面创建的节点的 AbsolutePath
属性是 "/opensearch/"
:追加了一个尾随斜杠,以便可以轻松组合路径。如果未指定,默认 Port
为 80。
如果节点具有相同的端点,则认为它们相等。在检查节点是否相等时,不考虑元数据。
连接池
连接池是 IConnectionPool
的实例,负责管理 OpenSearch 集群中的节点。我们建议使用单个 ConnectionSettings
对象创建单例客户端。客户端及其 ConnectionSettings
的生命周期与应用程序的生命周期相同。
以下是连接池类型。
- SingleNodeConnectionPool
SingleNodeConnectionPool
是默认连接池,如果在 ConnectionSettings
构造函数中没有传递任何连接池,则使用它。如果您集群中只有一个节点或集群将负载均衡器作为入口点,请使用 SingleNodeConnectionPool
。SingleNodeConnectionPool
不支持嗅探或 ping,并且不会将节点标记为死节点或活节点。
- CloudConnectionPool
CloudConnectionPool
是 SingleNodeConnectionPool
的子类,它接受 Cloud ID 和凭据。与 SingleNodeConnectionPool
类似,CloudConnectionPool
不支持嗅探或 ping。
- StaticConnectionPool
StaticConnectionPool
用于小型集群,当您不想打开嗅探以了解集群拓扑时。StaticConnectionPool
不支持嗅探,但可以支持 ping。
- SniffingConnectionPool
SniffingConnectionPool
是 StaticConnectionPool
的子类。它是线程安全的,支持嗅探和 ping。SniffingConnectionPool
可以在运行时重新播种,并且您可以在播种时指定节点角色。
- StickyConnectionPool
StickyConnectionPool
设置为返回第一个活动节点,然后该节点在请求之间保持不变。它可以利用 Uri
或 Node
对象的枚举进行播种。StickyConnectionPool
不支持嗅探但支持 ping。
- StickySniffingConnectionPool
StickySniffingConnectionPool
是 SniffingConnectionPool
的子类。与 StickyConnectionPool
类似,它返回第一个活动节点2,然后该节点在请求之间保持不变。StickySniffingConnectionPool
支持嗅探和排序,以便您的应用程序的每个实例可以偏好不同的节点。节点具有与其关联的权重,并且可以按权重排序。
重试
如果请求未成功,它会自动重试。默认情况下,重试次数是 OpenSearch.Client 在您的集群中已知节点的数量。重试次数也受超时参数的限制,因此 OpenSearch.Client 会在超时期限内尽可能多次重试请求。
要设置最大重试次数,请在 ConnectionSettings
对象的 MaximumRetries
属性中指定该数字。
var settings = new ConnectionSettings(connectionPool).MaximumRetries(5);
您还可以设置 RequestTimeout
来指定单个请求的超时时间,以及 MaxRetryTimeout
来指定所有重试尝试的时间限制。在下面的示例中,RequestTimeout
设置为 4 秒,MaxRetryTimeout
设置为 12 秒,因此查询的最大尝试次数为 3 次。
var settings = new ConnectionSettings(connectionPool)
.RequestTimeout(TimeSpan.FromSeconds(4))
.MaxRetryTimeout(TimeSpan.FromSeconds(12));
故障转移
如果您使用包含多个节点的连接池,如果请求返回 502 (Bad Gateway)、503 (Service Unavailable) 或 504 (Gateway Timeout) HTTP 错误响应代码,则会重试该请求。如果响应代码是 400-501 或 505-599 范围内的错误代码,则不重试该请求。
如果响应代码在 2xx 范围内,或者响应代码具有此请求的预期值之一,则认为响应有效。例如,404 (Not Found) 是检查索引是否存在请求的有效响应。