如何等待Aerospike AsyncClient完成所有交易?

时间:2016-03-30 12:15:16

标签: java aerospike

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

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

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

    for(int 1-0; i< 10000000; i ++){       final int j = i;       executorService.execute(new Runnable(){         public void run(){           put(“test”,“binname”,“setname”,j,list1,list2,aerospikeClient);         }       }); }

  3.   

    private void put(String namespace,String setName,String binName,   String keyVlaue,                     列出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));             }

    1. 一旦执行人退出,我正在致电关闭方法
    2. public void closed(){         System.out.println(“=== 1”);

          if(aerospikeClient != null && aerospikeClient.isConnected())
              aerospikeClient.close();
          if(executorService != null && !executorService.isShutdown())
              executorService.shutdown();
      }
      
      1. 执行者服务和AsyncClient立即停止,之后没有插入,我丢失了提交的数据。

      2. 任何人都可以帮我解决这个问题吗?或建议我使用AsyncClient以及Aerospike udf功能的更好方法。

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

1 个答案:

答案 0 :(得分:2)

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

  • 拥有更多节点将有助于并行执行udfs,从而减少总体时间。
  • 如果在应用程序中实现udf的逻辑,请参阅性能。随着一些计算成本转移到客户端,Sever的工作量会减少。