java - 如何等待 Aerospike AsyncClient 完成所有事务?

标签 java aerospike

我正在使用 Aerospike AsyncClient 和 Aerospike UDF 模块使用多线程在 Aerospike 2 节点集群中插入 1000 万条记录。我遵循的步骤是:

  1. 创建了 10 个线程的执行器服务,所有线程将使用相同的 AsyncClient

  2. 运行循环 1000 万次并使用以下代码调用执行命令

    for(int 1-0; i < 10000000; i++) { 最终 int j = i; executorService.execute(new Runnable() { 公共(public)无效运行(){ put("test", "binname", "setname", j, list1, list2, aerospikeClient); } }); }

private void put(String namespace, String setName, String binName, String keyVlaue, List campaignsIdsToBeAdd, List campaignsIdToBeRemoved, AsyncClient aerospikeClient) { Key key = new Key(namespace, setName, keyVlaue); aerospikeClient.execute(writePolicy, new WriteHandler(), key, "aerospike_udf", "update_record", Value.get(campaignsIdsToBeAdd), Value.get(campaignsIdToBeRemoved), Value.get(binName)); }

  • 一旦执行器退出,我就会调用 close 方法
  • 公共(public)无效关闭(){ System.out.println("=== 1");

        if(aerospikeClient != null && aerospikeClient.isConnected())
            aerospikeClient.close();
        if(executorService != null && !executorService.isShutdown())
            executorService.shutdown();
    }
    
  • 执行器服务和 AsyncClient 立即停止,之后不会发生任何插入,并且我会丢失提交的数据。

  • 谁能帮我解决这个问题吗?或者建议我使用 AsyncClient 和 Aerospike udf 函数的更好方法。

  • 我尝试使用同步客户端执行此操作,但插入所有值需要 70 分钟,但我想在 5 分钟内完成。当我尝试在多个线程之间使用同步客户端时,它会抛出客户端超时异常

  • 最佳答案

    似乎您正在运行的 udfs 比常规读/写操作慢。因此,即使您等待异步调用完成,您最终也可能需要 5 分钟以上的时间。您需要调整集群的大小以满足您的性能需求。因此,您还需要考虑非编程替代方案。

    • 拥有更多节点将有助于并行执行 udf,从而减少总体时间。
    • 如果您在应用程序中实现 udf 的逻辑,请查看性能。由于一些计算成本转移给客户端,服务器的工作量将减少。

    关于java - 如何等待 Aerospike AsyncClient 完成所有事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36308579/

    相关文章:

    java - Spring MVC - 实现 aerospike session

    java - feign.RetryableException 包装了哪些异常?

    java - clojure 中的 Scala 类

    java.lang.Object.wait() - "Any and all"同步声明?

    go - 如何使用 aerospike 客户端进行“触摸获取”

    java - Aerospike 给出旧值但不提供更新值的罕见情况

    java - Apache Spark 数据集。 foreach 与 Aerospike 客户端

    php 和 aerospike - 设置数据时出错

    java - Lombok 问题 - 找不到 org.projectlombok

    java - 使用netbeans根据数据库添加jpanel的动态