原创 如何構建高可用的系統(三):服務治理篇

在如何構建高可用的系統(一):Overview中, 我提到了以下幾點: 系統依賴的一切下游系統都是不可靠的, 它們隨時可能出問題 系統的上游可能有多個, 而且每個上游的行爲都是不可預知的。如果某個上游抽風把我的系統搞崩, 那麼就會影

原创 如何構建高可用的系統(二): 消除單點與自動故障轉移

前一篇文章我們講到, 一切單點都是不可靠的, 如果系統中某個地方可能會出問題(就算概率很低),那麼它遲早會出問題。 也就是我們常說的Murphy’s Law。如果要提高系統的可用性, 那麼就必須儘可能消滅掉系統中所有的單點,並且在發生

原创 如何構建高可用的系統(一):Overview

1. What 在聊如何構建高可用系統之前,我們需要對"可用"下一個定義。 業界常用SLA(Service Level Agreement)來描述一個系統的可用性, SLA包含很多信息(服務內容、故障恢復時間、可用性等), 在這裏

原创 全球異地多活架構設計(二): 數據層的支持

要做到全球異地多活, 一定要在數據層支持多機房寫入, 並且對大多數業務場景提供最終一致性的解決方案。原因如下: 跨洲的網絡延遲在100ms的數量級,如果只有單點寫, 對於用戶體驗是種災難 對於高頻操作來說, 如果做強一致性,那麼任

原创 如何寫一個RPC框架(三):服務註冊與服務發現

在後續一段時間裏, 我會寫一系列文章來講述如何實現一個RPC框架(我已經實現了一個示例框架, 代碼在我的github上)。 這是系列第三篇文章, 主要講述了服務註冊和服務發現這一塊。 在系列的第一篇文章中提到,我們的RPC框架需要有一

原创 如何寫一個RPC框架(五):服務器端實現

在後續一段時間裏, 我會寫一系列文章來講述如何實現一個RPC框架(我已經實現了一個示例框架, 代碼在我的github上)。 這是系列第五篇文章, 主要講述了服務器端的實現。 在前面的幾篇文章裏, 我們已經實現了客戶端創建proxy b

原创 《設計數據密集型應用/DDIA》精要翻譯(六) :分佈式系統中的問題

這一章我們會討論分佈式系統中一些常見的問題,在下一章中我們會討論這些問題的解決辦法。 1.故障與部分失敗 在分佈式系統中,系統的部分組件常常會以以某種未知的方式被破壞,我們稱之爲部分失敗/部分故障。而我們的目標就是在不可靠的組件上構建

原创 《設計數據密集型應用/DDIA》精要翻譯(四) :副本機制

從這一章開始,我們就正式從單機應用轉向了分佈式應用的旅程! ps: 其實DDIA這書我1月份已經看完了,只不過那會兒實在沒有心力去翻譯。前段時間太太太忙了,對幾千萬日活的系統做了技術棧遷移、跨洲數據中心無縫平移。後續也會寫文章來分享我們

原创 對微信《Scalable Overload Control for Large-scale Microservice Architecture》論文的解讀

這幾年微服務大行其道,隨之而來也伴隨着很多問題: 服務註冊和發現(常見解決方案如Consul, ZK, etcd) 熔斷和降級 (如Hystrix) … 在服務過載時, 一個常見的解決方案是熔斷。以前的熔斷方案基本都是各個服務獨自處

原创 《設計數據密集型應用/DDIA》精要翻譯(五) :事務

1. 事務的ACID 雖然ACID我們已經說濫了,這裏我想再說一下一致性和隔離性。 一致性 一致性在不同的術語中有不同的含義: 在前面那篇博客中,我們討論了副本之間的一致性(比如最終一致性、讀已之寫一致性等) 在CAP中,一致性表示可線

原创 一次頻繁Full GC的排查過程

問題描述 最近公司的線上監控系統給我推送了一些kafka lag持續增長的消息,我上生產環境去看了相應的consumer的情況,發現幾臺機器雖然還在處理消息,但是速度明顯慢了很多。 問題猜測與驗證 我猜測是JVM頻繁做Full GC,導致

原创 Netty線程模型

《Netty實戰》這本書對於Netty的線程模型講的還是太淺了,後來我找到一篇不錯的文章: 原文鏈接 1. 背景 1.1. Java線程模型的演進 1.1.1. 單線程 時間回到十幾年前,那時主流的CPU都還是單核(

原创 如何寫一個RPC框架(四):網絡通信之客戶端篇

在後續一段時間裏, 我會寫一系列文章來講述如何實現一個RPC框架(我已經實現了一個示例框架, 代碼在我的github上)。 這是系列第四篇文章, 主要講述了客戶端和服務器之間的網絡通信問題。 模型定義 我們需要自己來定義RPC通信所傳

原创 如何寫一個RPC框架(二):利用Bean容器和動態代理簡化客戶端代碼

在後續一段時間裏, 我會寫一系列文章來講述如何實現一個RPC框架(我已經實現了一個示例框架, 代碼在我的github上)。 這是系列第二篇文章, 主要講述瞭如何利用Spring以及Java的動態代理簡化調用別的服務的代碼。 在本系列第

原创 Netty實戰讀書筆記二:ChannelHandler和ChannelPipeline

ChannelHandler家族 Channel生命週期 Interface Channel 定義了一組和 ChannelInboundHandler API 密切相關的簡單但 功能強大的狀態模型,表 6-1 列出了 Channel 的這