项目背景:
实时 Flink任务中,需要实现不停实时任务,清除关联维表的本地缓存。
方案:
方案采用 Zookeeper 的配置中心的功能,即当需要清除正在运行 Flink App 的维表本地缓存时,通过web端配置 Zookeeper 指定节点上的配置值,Flink App 上 Watch 指定节点上的值,一旦发生变化,Flink 即清除本地维表数据缓存。
Zookeeper特性背景
Curator提供了三种Watcher(Cache)来监听结点的变化
- Path Cache : 监控一个ZNode的子节点. 当一个子节点增加, 更新,删除时, Path Cache会改变它的状态, 会包含最新的子节点, 子节点的数据和状态
- Node Cache : 只是监听某一个特定的节点
- Tree Cache : 可以监控整个树上的所有节点,类似于PathCache和NodeCache的组合
demo说明:
* PathCacheE : PathCache 的实现
* NodeCacheE : NodeCache 的实现
* TreeCacheE : TreeCache 的实现
项目中各个Flink任务对应各自的ZK节点,所以采用 Node Cache 即可
PathCacheE:监控一个ZNode的子节点
/**
* Path Cache用来监控一个ZNode的子节点. <br>
* 当一个子节点增加, 更新,删除时, Path Cache会改变它的状态, 会包含最新的子节点, 子节点的数据和状态,而状态的变更将通过PathChildrenCacheListener通知。
*/
public class PathCacheE {
/**
* 监控 PATH 子节点的变化
*/
private static final String PATH = "/example/pathCache";
public static void main(String[] args) throws Exception {
TestingServer server = new TestingServer();
new Thread(new ClientListenerTask(server)).start();
Thread.sleep(500);
new Thread(new ClientProviderTask(server)).start();
}
/**
* 负责监控子节点的变化(增加, 更新,删除)
*/
private static class ClientListenerTask implements Runnable {
private TestingServer server;
ClientListenerTask(TestingServer server) {
this.server = server;
}
@Override
public void run() {
try {
CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new ExponentialBackoffRetry(1000, 3));
client.start();
PathChildrenCac