【问题标题】:Getting Aerospike timeout with multiple java client in application在应用程序中使用多个 java 客户端获取 Aerospike 超时
【发布时间】:2021-10-28 10:50:40
【问题描述】:

目前我在我的应用程序中使用 Aerospike。 当我为每个事务创建新的 java 客户端并且我没有关闭它时,我遇到了很多超时问题,如下所示,因此连接数量急剧增加。

Aerospike Error: (9) Client timeout: timeout=1000 iterations=1 failedNodes=0 failedConns=0

所以为了解决这个超时问题,我没有对客户端、读写策略进行任何更改,我只创建了一个客户端,将它的实例存储在某个变量中,并将同一个客户端用于所有事务(get 或 put要求)。 现在我想了解从多个客户端转移到一个客户端如何解决我的超时问题。 这些连接如何没有自动关闭。

【问题讨论】:

    标签: aerospike


    【解决方案1】:

    AerospikeClient 构造函数为集群中的所有节点请求对等点、分区映射和机架,并初始化连接池和异步事件循环。这是一个昂贵的过程,仅意味着在应用程序启动时每个集群执行一次。 AerospikeClient 是线程安全的,因此可以在线程之间共享实例。

    如果不调用 AerospikeClient close(),则不会关闭位于池中的连接(每个节点至少一个连接池)。 AerospikeClient 中没有 finalize() 方法。

    第一个事务通常需要创建新连接。这会增加延迟并可能导致超时。

    【讨论】:

      【解决方案2】:

      客户端做的不仅仅是应用程序的事务。它还监视集群的更改,以便它可以维护每个事务的一跳。另外,我相信当我们初始化客户端时,我们会创建一个初始套接字池。

      预计大多数应用只需要一个全局客户端。

      【讨论】:

      • Java 客户端有选项 - minConnsPerNode -(默认 0) - 保持一定数量的套接字始终打开。在流量稀疏时提供帮助 - 当您收到事务请求时,您不会产生创建新套接字的时间开销。对于连续流量,套接字会保留,因为它们仅在 55 秒空闲时间后被丢弃。正如您正确指出的那样,实例化客户端对象非常耗时,并且预计在应用程序的整个生命周期中都是“单例”。不推荐为每个数据库事务实例化和销毁客户端对象。
      猜你喜欢
      • 2017-12-03
      • 1970-01-01
      • 2020-10-01
      • 2018-06-08
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      相关资源
      最近更新 更多