正如文档中所述,Ignite 提供了系统线程池来处理缓存相关操作。 我的问题是数据放置,但流式和批量加载不是解决方案,因为数据来自多个客户端通过 REST 查询,并且需要对每个查询进行快速写入确认。
所以我正在寻找一种并行执行 cache.put() 操作的方法。第一个问题是——简单的 cache.put() 不是并行执行的吗? 我发现我可以调用 Ignite 自定义 ExecutorService,如下所示:
ExecutorService exec = ignite.executorService();
<...>
exec.submit(new IgniteRunnable() {
@Override public void run() {
System.out.println("data put");
cache.put(i, somedataobj);
}});
然后所有放置操作在所有节点上并行执行(因为我在所有节点的控制台输出中看到“数据放置”)。但是我认为并行放置不是一个合适的方法,因为数据首先发送到工作节点,然后才被放入。
另一种方法是像这样使用 Java 普通固定线程池:
ExecutorService exec = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
int t = i;
DataClass dataobj = data().build();
exec.submit(new IgniteRunnable() {
@Override public void run() {
System.out.println("data put");
cache.put(t, dataobj);
}});
}
exec.shutdown();
exec.awaitTermination(0, TimeUnit.MILLISECONDS);
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime);
但随后我遇到了另一个问题 - 数据加载速度非常快(我得到的 elapsedTime 很小),但出现在缓存中的时间很晚(当我通过 ignite visor 执行 cache -a
时,我看到缓存如何规模正在增长)
如何正确地并行放置数据?如何使用 Ignite 系统线程池并行放置数据?
最佳答案
只需使用异步 API,例如 IgniteCache.putAsync 方法: https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/IgniteCache.html#putAsync(K,%20V)
关于java - Ignite 线程池使用 - 如何正确地将数据并行放入缓存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49003821/