我们有一个第三方应用程序以非常高的速度生成数据并将其存储在多个环形缓冲区(hazelcast 集群)中。
消费者应用程序(另一个第三方应用程序)使用此 java hazelcast 库来读取环形缓冲区数据。它调用
final byte[] item = ringbuffer.readOne(sequence)
api 进行读取。事实证明这非常慢。在高峰负载期间,消费者需要一天多的时间才能读取所有数据。
从 hazelcast 集群并发读取数据的一般策略是什么?有没有我可以查看的 java 参考资料?
谢谢。
我从未使用过 Hazelcast,但作为一名 Java 开发人员对这个问题很感兴趣。 我查看了 Hazelcast 文档页面,发现有一个部分提到了批量读取数据,你可以尝试一下。
以下方法将帮助您实现这一目标:
CompletionStage<ReadResultSet<E>> readManyAsync(
long startSequence,
int minCount,
int maxCount,
IFunction<E, Boolean> filter);
此方法的参数的含义在文档的参考链接中有更详细的解释。
long sequence = rb.headSequence();
for(;;) {
CompletionStage<ReadResultSet<String>> f = rb.readManyAsync(sequence, 1, 10, null);
CompletionStage<Integer> readCountStage = f.thenApplyAsync(rs -> {
for (String s : rs) {
System.out.println(s);
}
return rs.readCount();
});
sequence += readCountStage.toCompletableFuture().join();
}
这个还提供了一个过滤器,可用于在从环形缓冲区获取数据时过滤数据。 就像在 readOne 方法中一样,您获取数据并在其后进行过滤。
参考链接:https://docs.hazelcast.com/hazelcast/5.3/data-structs/ringbuffer#reading-batched-items