Java 如何并行处理Iterables.partition(…)结果以与BatchGetItemAPI一起使用?

Java 如何并行处理Iterables.partition(…)结果以与BatchGetItemAPI一起使用?,java,java-8,amazon-dynamodb,Java,Java 8,Amazon Dynamodb,我试图调用BatchGetItem从DynamoDB检索项目。作为输入,我们可以得到多达1000个键(或少至1个键)的列表。这些键与DynamoDB表的hashKey一致 由于BatchGetItemAPI每次调用最多只接收100个项目,因此我尝试将请求拆分为每个仅包含100个项目的批,并行进行调用,然后再次将结果合并到单个集合中 对于那些不熟悉DynamoDB的人,他们仍然可以就一个非常精简的版本(第一个示例)提供建议,我将不胜感激!否则,请参见下面第二个更准确的示例 第一个示例-非常精简 p

我试图调用BatchGetItem从DynamoDB检索项目。作为输入,我们可以得到多达1000个键(或少至1个键)的列表。这些键与DynamoDB表的hashKey一致

由于BatchGetItemAPI每次调用最多只接收100个项目,因此我尝试将请求拆分为每个仅包含100个项目的批,并行进行调用,然后再次将结果合并到单个集合中

对于那些不熟悉DynamoDB的人,他们仍然可以就一个非常精简的版本(第一个示例)提供建议,我将不胜感激!否则,请参见下面第二个更准确的示例

第一个示例-非常精简

public Set<SomeResultType> retrieveSomething(Set<String> someSet) {
   ImmutableSet.Builder<SomeResultType> resultBuilder = ImmutableSet.builder();

   // FIXME - how to parallelize? 
   for (List<Map<String, String>> batch : Iterables.partition(someSet, 100)) {
       result = callSomeLongRunningAPI(batch);
       resultBuilder.addAll(result.getItems());
   }
   return resultBuilder.build();
}
publicset-retrieveSomething(Set-someSet){
ImmutableSet.Builder resultBuilder=ImmutableSet.Builder();
//修复-如何并行化?
for(列表批:Iterables.partition(someSet,100)){
结果=callSomeLongRunningAPI(批次);
resultBuilder.addAll(result.getItems());
}
返回resultBuilder.build();
}
第二个示例-更接近我的实际问题- 下面是我目前正在做的一个精简的虚拟版本(因此,请原谅格式/样式问题)。它目前可以工作并获取所有项,但我不知道如何使批处理(请参阅FIXME)并行执行并最终在单个集合中结束。由于性能在我试图构建的系统中非常重要,因此任何帮助此代码更高效的提示都将不胜感激

public Set<SomeResultType> retrieveSomething(Set<String> someIds) {
    if (someIds.isEmpty()) {
        // handle this here
    }

    Collection<Map<String, AttributeValue>> keyAttributes = someIds.stream()
            .map(id -> ImmutableMap.<String, AttributeValue>builder()
                    .put(tableName, new AttributeValue().withS(id)).build())
            .collect(ImmutableList.toImmutableList());

    ImmutableSet.Builder<SomeResultType> resultBuilder = ImmutableSet.builder();
    Map<String, KeysAndAttributes> itemsToProcess;
    BatchGetItemResult result;

    // FIXME - make parallel?
    for (List<Map<String, AttributeValue>> batch : Iterables.partition(keyAttributes, 100)) {
        KeysAndAttributes keysAndAttributes = new KeysAndAttributes()
                .withKeys(batch)
                .withAttributesToGet(...// some attribute names);

        itemsToProcess = ImmutableMap.of(tableName, keysAndAttributes);
        result = this.dynamoDB.batchGetItem(itemsToProcess);

        resultBuilder.addAll(extractItemsFromResults(tableName, result));
    }

    return resultBuilder.build());
}
public Set retrieveSomething(Set-someid){
if(someid.isEmpty()){
//在这里处理
}
Collection keyAttributes=someIds.stream()
.map(id->ImmutableMap.builder()
.put(tableName,新的AttributeValue().with(id)).build())
.collect(ImmutableList.toImmutableList());
ImmutableSet.Builder resultBuilder=ImmutableSet.Builder();
映射项停止处理;
BatchGetItemResult结果;
//修正-使平行?
for(列表批:Iterables.partition(keyAttributes,100)){
KeysandAttribute KeysandAttribute=新的KeysandAttribute()
.带钥匙(批次)
.withAttributesToGet(…//某些属性名称);
ItemStopProcess=ImmutableMap.of(表名、键和属性);
结果=this.dynamoDB.batchGetItem(ItemStopProcess);
addAll(extractItemsFromResults(tableName,result));
}
返回resultBuilder.build());
}

无论是超级精简的案件或第二个例子的帮助将不胜感激!谢谢

我不明白。是什么阻止了你创建线程池、提交任务、等到任务完成后再将它们粘到一个集合上?@Eugene:事实是我不知道如何做,也不知道使用单个集合这样做是安全的?好吧,这不是一个编码服务站点。。。你必须展示你尝试过的东西。我不知道我在哪里要求别人为我编码。我上面提供的代码行是否还不够尝试?我在征求关于如何尝试并行处理批处理的建议。我把它剥离到我遇到的基本问题上,希望能有一些想法和反馈,找到一个干净的解决方案,因为到目前为止我所尝试的一切看起来都很混乱,而且不是线程安全的。@Eugene显然OP并没有要求任何人为它们编写代码,而是寻求建议并展示他们迄今为止所做的尝试。我不明白。是什么阻止了你创建线程池、提交任务、等到任务完成后再将它们粘到一个集合上?@Eugene:事实是我不知道如何做,也不知道使用单个集合这样做是安全的?好吧,这不是一个编码服务站点。。。你必须展示你尝试过的东西。我不知道我在哪里要求别人为我编码。我上面提供的代码行是否还不够尝试?我在征求关于如何尝试并行处理批处理的建议。我把它剥离到我遇到的基本问题上,希望能有一些想法和反馈,找到一个干净的解决方案,因为到目前为止我所尝试的一切看起来都很混乱,而且不是线程安全的。@Eugene显然OP并没有要求任何人为它们编写代码,而是寻求建议,并展示他们迄今为止所做的尝试。