Hazelcast集群合并完成全节点通知获取方案问询
Hazelcast集群迁移/合并完成通知实现方案
内置监听实现方案
Hazelcast原生提供了集群事件监听能力,无需额外引入第三方组件即可实现全节点的合并完成通知获取:
- 核心监听接口:
MigrationListener
该监听器可以捕获全部分区迁移、合并的生命周期事件,当集群所有节点的分区重分配、裂脑恢复数据合并动作全部执行完成后,会触发migrationFinished回调,所有存活的集群节点都会同步收到该事件通知。
参考注册代码:HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(); hazelcastInstance.getCluster().addMigrationListener(new MigrationListener() { @Override public void migrationStarted(MigrationState state) { // 迁移启动回调,可在此处暂停强一致要求的业务操作 } @Override public void migrationFinished(MigrationState state) { // 所有分区迁移、合并完成回调,所有节点都会触发 // 此处可恢复业务操作,避免读取过期数据 // 可通过state.getCompletedMigrations()获取完成的迁移任务数做校验 } @Override public void replicaMigrationCompleted(MigrationEvent event) { // 单个分区副本迁移完成回调,按需使用 } @Override public void replicaMigrationFailed(MigrationEvent event) { // 单个分区副本迁移失败回调,按需处理异常 } }); - 裂脑场景补充监听:
MembershipListener
如果是网络中断后恢复的裂脑合并场景,可搭配成员监听接口判断事件类型:节点重加入集群时会先触发memberAdded回调,之后才会启动合并迁移流程,两个监听器配合即可区分是新节点加入还是裂脑恢复的合并场景。
参考注册代码:hazelcastInstance.getCluster().addMembershipListener(new MembershipListener() { @Override public void memberAdded(MembershipEvent membershipEvent) { // 新节点/裂脑恢复节点加入回调,可打标记录当前为合并周期 } @Override public void memberRemoved(MembershipEvent membershipEvent) { // 节点离线回调,按需处理 } });
业务侧注意事项
- 若开启了自定义裂脑合并策略
SplitBrainMergePolicy,所有数据冲突合并逻辑执行完成后才会触发migrationFinished回调,无需额外监听合并策略执行状态。 - 迁移完成后如果要进一步保证数据一致性,对强一致要求的业务数据可主动调用
IMap.get()拉取最新值,避免本地缓存的旧值影响业务逻辑。
内容的提问来源于stack exchange,提问作者Stephan Steiner
相关产品推荐
相关产品推荐

