主备服务器及Spring Boot REST API集群数据同步轻量方案咨询
需求实现方案说明
你提到的三个组件中,Atomix、Hazelcast均可满足无独立中间件、内嵌到Spring Boot API、集群数据同步+广播的需求,ZooKeeper需要独立部署集群,不属于轻量内嵌方案,不推荐使用。
1. Hazelcast 实现示例(更推荐,生态更成熟)
Hazelcast是嵌入式内存网格,无需额外部署服务,集成后集群节点自动发现,原生支持分布式数据结构、节点广播、数据自动同步。
1.1 引入依赖
<!-- pom.xml 依赖 --> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> <version>5.3.2</version> </dependency> <dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast-spring</artifactId> <version>5.3.2</version> </dependency>
1.2 Hazelcast配置类
@Configuration public class HazelcastConfig { @Bean public HazelcastInstance hazelcastInstance() { Config config = new Config(); // 集群名称,同一集群的节点名称必须一致 config.setClusterName("api-sync-cluster"); // 自动发现同网段下的集群节点 config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(true); // 配置分布式Map,用于跨节点同步数据,自动备份到其他节点 MapConfig mapConfig = new MapConfig("sync-data-map"); mapConfig.setBackupCount(1); // 每个数据备份1份到其他节点,实现主备同步 config.addMapConfig(mapConfig); return Hazelcast.newHazelcastInstance(config); } }
1.3 数据同步与广播功能实现
@Service public class ClusterSyncService { private final HazelcastInstance hazelcastInstance; // 分布式Map,所有节点数据自动同步 private final IMap<String, Object> syncDataMap; // 广播主题,所有节点都能收到消息 private final ITopic<Object> broadcastTopic; public ClusterSyncService(HazelcastInstance hazelcastInstance) { this.hazelcastInstance = hazelcastInstance; this.syncDataMap = hazelcastInstance.getMap("sync-data-map"); this.broadcastTopic = hazelcastInstance.getTopic("broadcast-topic"); // 注册广播消息监听器,本节点收到其他节点的广播消息时触发 broadcastTopic.addMessageListener(message -> { Object msgContent = message.getMessageObject(); // 自定义处理接收到的广播消息逻辑 System.out.println("收到集群广播消息:" + msgContent); }); } // 写入同步数据,自动同步到所有集群节点 public void putSyncData(String key, Object value) { syncDataMap.put(key, value); } // 读取同步数据 public Object getSyncData(String key) { return syncDataMap.get(key); } // 向所有集群节点广播消息 public void broadcastMsg(Object msg) { broadcastTopic.publish(msg); } // 周期性同步任务,配合Spring @Scheduled使用 @Scheduled(fixedRate = 30000) // 每30秒执行一次全量同步校验 public void periodicSync() { // 自定义周期性同步逻辑,比如校验本地数据和分布式Map数据一致性 syncDataMap.forEach((k, v) -> { // 本地数据校验更新逻辑 }); } }
2. Atomix 实现示例
Atomix是嵌入式分布式系统框架,同样支持无外部依赖的内嵌部署,提供强一致的分布式数据结构和消息广播能力。
2.1 引入依赖
<dependency> <groupId>io.atomix</groupId> <artifactId>atomix-core</artifactId> <version>3.1.12</version> </dependency>
2.2 Atomix配置与启动
@Configuration public class AtomixConfig { @Bean(destroyMethod = "stop") public Atomix atomixInstance() { return Atomix.builder() .withClusterId("api-sync-cluster") .withMemberId("node-" + UUID.randomUUID()) .withAddress(new Address("0.0.0.0", 5679)) .withMulticastDiscovery() // 多播自动发现节点 .build() .start() .join(); } }
2.3 功能实现
@Service public class AtomixSyncService { private final Atomix atomix; private final DistributedMap<String, Object> syncMap; private final DistributedTopic<Object> broadcastTopic; public AtomixSyncService(Atomix atomix) { this.atomix = atomix; this.syncMap = atomix.<String, Object>mapBuilder("sync-data-map") .withReplicationFactor(2) .build() .join(); this.broadcastTopic = atomix.<Object>topicBuilder("broadcast-topic") .build() .join(); // 监听广播消息 broadcastTopic.subscribe(msg -> { System.out.println("收到广播消息:" + msg); }); } // 写入同步数据 public void putSyncData(String key, Object value) { syncMap.put(key, value).join(); } // 广播消息 public void broadcast(Object msg) { broadcastTopic.publish(msg).join(); } }
内容的提问来源于stack exchange,提问作者laxman mva
相关产品推荐
相关产品推荐

