集群部署多個 Tomcat 節點,負載均衡隨機分發請求。用戶在節點 A 執行方法 a() 後,需通知節點 B、C 等也執行 a()(可攜帶參數),實現集群內狀態同步或觸發業務邏輯。
| 方案 | 適用場景 | 實現複雜度 | 一致性保障 | 性能/擴展性 |
|---|---|---|---|---|
| HTTP 互相回調 | 節點固定、數據量小、業務允許最終一致性 | 低 | 弱(無重試/無序) | 節點增多時 O(N²) 連接,難擴展 |
| 共享緩存 (Redis/Memcached) | 高頻讀寫、需高性能、可接受最終一致性 | 中 | 最終一致性 | 極佳,單點 Redis 可支撐大規模集群 |
| 消息隊列 (Kafka/RocketMQ/RabbitMQ) | 高可靠、解耦、異步處理、需保證投遞 | 中高 | 最終一致性 (可配合事務消息) | 極佳,天然支持擴展與削峰填谷 |
| 分布式協調 (ZooKeeper/Etcd/Consul) | 強一致性要求、配置同步、領導者選舉、分布式鎖 | 高 | 強一致性 (CP) | 寫性能受限,適合元數據/協調而非高頻業務數據 |
| Session 復制 / Sticky Session | 僅需 Session 共享,非業務方法廣播 | 低 (配置級) | 最終一致性 | 僅限 Session 範圍,不適用於任意方法調用 |
@Autowired RocketMQTemplate mqTemplate;
public void executeAndNotify(MethodParams params) {
// 1. 執行本地業務
doLocalBusiness(params);
// 2. 發送同步消息到 Topic
SyncMessage msg = new SyncMessage("METHOD_A_SYNC", params);
mqTemplate.syncSend("cluster-sync-topic", msg); // 或異步 send
}
@Component
@RocketMQMessageListener(topic = "cluster-sync-topic", consumerGroup = "cluster-sync-group")
public class MethodSyncListener implements RocketMQListener<SyncMessage> {
@Override
public void onMessage(SyncMessage msg) {
if ("METHOD_A_SYNC".equals(msg.getType())) {
// 幂等性檢查(防重複消費)
if (alreadyProcessed(msg.getId())) return;
// 執行同步邏輯
doLocalBusiness(msg.getParams());
markProcessed(msg.getId());
}
}
}
asyncSend,消費者線程池隔離,不影響主業務響應。MessageQueue 選擇器 (如按用戶 ID hash),同一用戶操作進同一隊列。// 發布
redisTemplate.convertAndSend("channel:method-a", params);
// 訂閱 (每個節點啟動時註冊)
@Bean
MessageListenerAdapter listenerAdapter(RedisMessageListener listener) {
return new MessageListenerAdapter(listener, "onMessage");
}
@Component
public class RedisMessageListener {
public void onMessage(Message message, byte[] pattern) {
String body = new String(message.getBody());
MethodParams params = JSON.parseObject(body, MethodParams.class);
doLocalBusiness(params);
}
}
缺點: 無持久化、無 ACK 機制、消費者離線會丟消息,**不適合核心業務同步**。