使用 CacheJdbcPojoStore / 延迟客户端节点点燃服务器节点
Ignite Server Node with CacheJdbcPojoStore / Delay Client Node
我正在使用 Spring 和 Ignite Spring 来 运行 一个非常简单的集群,由一个服务器节点和多个具有不同域逻辑的客户端节点组成。
点燃配置:
- 所有节点都通过
TcpCommuncationSpi
、TcpDiscoverySpi
和 TcpDiscoveryVmIpFinder
连接。 TcpDiscoveryVmIpFinder.setAddresses
只包含服务器节点。
- 服务器节点配置了多个
CacheJdbcPojoStore
,使用ignite.cache("mycachename").loadCache(null)
调用Ignition.start(cfg)
后加载数据库数据。
客户端节点连接到服务器节点后,它会执行一些特定于域的检查以验证数据完整性。如果我首先启动服务器节点,等待加载所有数据然后启动客户端节点,这会非常有效。
我的问题:如果我首先启动客户端节点,它们无法连接到服务器节点,因为它尚未启动。他们耐心地等待服务器节点出现。如果我现在启动服务器节点,客户端节点会在 Ignition.start(cfg)
在服务器节点上完成后直接连接,但是 BEFORE CacheJdbcPojoStores
完成加载它们的数据。因此,特定于域的完整性检查确实会失败,因为缓存中还没有数据。
我的目标:我需要一种方法来确保客户端节点只能连接到服务器节点 AFTER 所有数据都是加载到服务器节点。这将简化部署过程以及大量本地开发,因为启动节点没有严格的顺序。
到目前为止我尝试了什么:摆弄 ignite.cluster().state(ClusterState.INACTIVE)
以及设置手动控制的 BaselineTopology。可悲的是,这两种方法都简单地将集群声明为尚未准备就绪,因此我什至无法创建缓存,更不用说加载数据了。
我的问题:有什么办法可以实现:
- 连接到服务器节点的启动进程,这样我就可以在它加入集群之前加载数据
- 在加载数据之前声明服务器节点“尚未准备好”。
使用一种可用的数据结构,如 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
我正在使用 Spring 和 Ignite Spring 来 运行 一个非常简单的集群,由一个服务器节点和多个具有不同域逻辑的客户端节点组成。
点燃配置:
- 所有节点都通过
TcpCommuncationSpi
、TcpDiscoverySpi
和TcpDiscoveryVmIpFinder
连接。TcpDiscoveryVmIpFinder.setAddresses
只包含服务器节点。 - 服务器节点配置了多个
CacheJdbcPojoStore
,使用ignite.cache("mycachename").loadCache(null)
调用Ignition.start(cfg)
后加载数据库数据。
客户端节点连接到服务器节点后,它会执行一些特定于域的检查以验证数据完整性。如果我首先启动服务器节点,等待加载所有数据然后启动客户端节点,这会非常有效。
我的问题:如果我首先启动客户端节点,它们无法连接到服务器节点,因为它尚未启动。他们耐心地等待服务器节点出现。如果我现在启动服务器节点,客户端节点会在 Ignition.start(cfg)
在服务器节点上完成后直接连接,但是 BEFORE CacheJdbcPojoStores
完成加载它们的数据。因此,特定于域的完整性检查确实会失败,因为缓存中还没有数据。
我的目标:我需要一种方法来确保客户端节点只能连接到服务器节点 AFTER 所有数据都是加载到服务器节点。这将简化部署过程以及大量本地开发,因为启动节点没有严格的顺序。
到目前为止我尝试了什么:摆弄 ignite.cluster().state(ClusterState.INACTIVE)
以及设置手动控制的 BaselineTopology。可悲的是,这两种方法都简单地将集群声明为尚未准备就绪,因此我什至无法创建缓存,更不用说加载数据了。
我的问题:有什么办法可以实现:
- 连接到服务器节点的启动进程,这样我就可以在它加入集群之前加载数据
- 在加载数据之前声明服务器节点“尚未准备好”。
使用一种可用的数据结构,如 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