使用 CacheJdbcPojoStore / 延迟客户端节点点燃服务器节点

Ignite Server Node with CacheJdbcPojoStore / Delay Client Node

我正在使用 Spring 和 Ignite Spring 来 运行 一个非常简单的集群,由一个服务器节点和多个具有不同域逻辑的客户端节点组成。

点燃配置:

客户端节点连接到服务器节点后,它会执行一些特定于域的检查以验证数据完整性。如果我首先启动服务器节点,等待加载所有数据然后启动客户端节点,这会非常有效。

我的问题:如果我首先启动客户端节点,它们无法连接到服务器节点,因为它尚未启动。他们耐心地等待服务器节点出现。如果我现在启动服务器节点,客户端节点会在 Ignition.start(cfg) 在服务器节点上完成后直接连接,但是 BEFORE CacheJdbcPojoStores 完成加载它们的数据。因此,特定于域的完整性检查确实会失败,因为缓存中还没有数据。

我的目标:我需要一种方法来确保客户端节点只能连接到服务器节点 AFTER 所有数据都是加载到服务器节点。这将简化部署过程以及大量本地开发,因为启动节点没有严格的顺序。

到目前为止我尝试了什么:摆弄 ignite.cluster().state(ClusterState.INACTIVE) 以及设置手动控制的 BaselineTopology。可悲的是,这两种方法都简单地将集群声明为尚未准备就绪,因此我什至无法创建缓存,更不用说加载数据了。

我的问题:有什么办法可以实现:

  1. 连接到服务器节点的启动进程,这样我就可以在它加入集群之前加载数据
  2. 在加载数据之前声明服务器节点“尚未准备好”。

使用一种可用的数据结构,如 AtomicLong or Semaphore 来模拟准备状态。不需要内部挂钩。

在下面添加了一个示例:

客户:

while (true) {
    // try get "myAtomic" and check its value
    IgniteAtomicLong atomicLong = ignite.atomicLong("myAtomic", 0, false);
    if (atomicLong != null && atomicLong.get() == 1) {
        
        // initialization is complete
        break;
    }

    // not ready
    Thread.sleep(1000);
}

服务器:

...

//loading is complete, create atomic sequence and set its value to 1
ignite.atomicLong("myAtomic", 1, true);
...

更新#2

而不是 self-written-loop 包括 Thread.sleep,可以调用 latch.await()。参见:countdownlatch