我正在使用 Aerospike AsyncClient 和 Aerospike UDF 模块使用多线程在 Aerospike 2 节点集群中插入 1000 万条记录。我遵循的步骤是:
创建了 10 个线程的执行器服务,所有线程将使用相同的 AsyncClient
运行循环 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/