前言
本地緩存和業(yè)務(wù)請(qǐng)求在同一臺(tái)機(jī)器上,相對(duì)于Redis讀寫(xiě)速度非趁祝快盹兢,對(duì)于一些變更頻率低捆探、實(shí)時(shí)性要求低的數(shù)據(jù),可以放在本地緩存中斤吐,提升訪問(wèn)速度搔涝。 使用本地緩存能夠減少和Redis類(lèi)集中式緩存間的數(shù)據(jù)交互,減少網(wǎng)絡(luò)I/O開(kāi)銷(xiāo)和措,降低這一過(guò)程中在網(wǎng)絡(luò)通信上的耗時(shí)庄呈,同時(shí)減輕對(duì)Redis類(lèi)集中式緩存訪問(wèn)壓力。
解決方案
服務(wù)是多節(jié)點(diǎn)部署的臼婆,要保證是本地緩存一致性的,就要短時(shí)間內(nèi)操作所有服務(wù)幌绍。
方案1-MQ廣播消息
redis發(fā)布訂閱功能實(shí)現(xiàn)同理
方案2-Zookeeper Watcher機(jī)制
Tomcat Watcher監(jiān)聽(tīng)
@Service
public class ZkDataListenerImpl implements IZkDataListener {
@Override
public void handleDataChange(String dataPath, Object data) throws Exception {
String type = getType(data);
if (type.equals("update")) {
//更新緩存
}
if (type.equals("delete")) {
//刪除緩存
}
}
}
方案3-RPC框架廣播調(diào)用(如dubbo廣播調(diào)用方式)
<dubbo:service cluster="broadcast" />
實(shí)現(xiàn)邏輯
- 循環(huán)調(diào)用所有的實(shí)例
- 如果有發(fā)生異常則記錄異常保存
- 只要有異常颁褂,則拋出異常,如果沒(méi)有則返回執(zhí)行結(jié)果
源碼
public class BroadcastClusterInvoker<T> extends AbstractClusterInvoker<T> {
private static final Logger logger = LoggerFactory.getLogger(BroadcastClusterInvoker.class);
public BroadcastClusterInvoker(Directory<T> directory) {
super(directory);
}
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public Result doInvoke(final Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
// 檢查 invokers 是否為空
checkInvokers(invokers, invocation);
// 將invokers 塞到context中
RpcContext.getContext().setInvokers((List) invokers);
RpcException exception = null;
Result result = null;
// 遍歷invokers 執(zhí)行傀广, 結(jié)果只要最后一個(gè)不報(bào)錯(cuò)的result
for (Invoker<T> invoker : invokers) {
try {
result = invoker.invoke(invocation);
} catch (RpcException e) {
exception = e;
logger.warn(e.getMessage(), e);
} catch (Throwable e) {
exception = new RpcException(e.getMessage(), e);
logger.warn(e.getMessage(), e);
}
}
// 如果出現(xiàn)一個(gè)異常颁独, 拋出異常
if (exception != null) {
throw exception;
}
return result;
}
}
方案4-分布式任務(wù)調(diào)度的廣播執(zhí)行任務(wù)
廣播執(zhí)行表示一個(gè)任務(wù)實(shí)例會(huì)廣播到該分組所有Worker上執(zhí)行,當(dāng)所有Worker都執(zhí)行完成伪冰。
方案對(duì)比
方案 | 特點(diǎn) |
---|---|
MQ廣播消息 | 有消息積壓誓酒、消息順序的問(wèn)題 |
Zookeeper Watcher機(jī)制 | Zookeeper本身適合讀多寫(xiě)少的場(chǎng)景 |
RPC框架廣播調(diào)用(如dubbo廣播調(diào)用方式) | 循環(huán)調(diào)用所有的實(shí)例,所有要考慮實(shí)例過(guò)多的情況 |
分布式任務(wù)調(diào)度的廣播執(zhí)行任務(wù) | 便于定時(shí)發(fā)布 |