服務(wu)(wu)間通信的(de)效率與(yu)可靠(kao)性(xing)是系統性(xing)能和穩定(ding)性(xing)的(de)關鍵。遠程(cheng)過程(cheng)調用(yong)(RPC)作為(wei)跨(kua)(kua)進程(cheng)、跨(kua)(kua)機(ji)器交互的(de)核心機(ji)制(zhi),其(qi)傳(chuan)(chuan)輸(shu)協議的(de)設計至關重(zhong)要。一個優秀(xiu)的(de)RPC傳(chuan)(chuan)輸(shu)協議需要應(ying)對三大挑戰:1)跨(kua)(kua)語言(yan)、跨(kua)(kua)平臺的(de)數據表示(shi)與(yu)解析;2)保障(zhang)網絡傳(chuan)(chuan)輸(shu)的(de)完整(zheng)性(xing)、順序性(xing)與(yu)效率;3)在服務(wu)(wu)間建立清晰統一的(de)調用(yong)約定(ding)。 本文將從 H ...
開發規范(fan)(fan)的整(zheng)理 RESTful Api規范(fan)(fan) 軟(ruan)件分(fen)層設(she)計(ji) 數據實(shi)體劃(hua)分(fen) 分(fen)層設(she)計(ji)主流技(ji)術(shu)棧(zhan) 1. RESTful Api規范(fan)(fan) 自解釋(shi),不要(yao)用(yong)駝峰,小寫,單(dan)詞之(zhi)間用(yong)減(jian)號,URL路(lu)徑使用(yong)單(dan)數還是(shi)復數沒有要(yao)求,推(tui)薦復數 用(yong)戶(hu)列表 GET /users 用(yong)戶(hu)1的內容 GET /users/1 用(yong)戶(hu)1的評(ping)論列 ...
本文(wen)介(jie)紹了(le)在賬(zhang)務插件(jian)(jian)開發中,如何通(tong)(tong)(tong)過“面(mian)向接口(kou)編程”實現(xian)異步轉賬(zhang)完成后(hou)的回調通(tong)(tong)(tong)知機制。通(tong)(tong)(tong)過定義(yi)回調接口(kou) `TransferCallback`,賬(zhang)務組件(jian)(jian)在異步操作完成后(hou)可通(tong)(tong)(tong)知上層應用進行后(hou)續業(ye)務處理。文(wen)章提供了(le)純 Java 和 Spring 兩種實現(xian)方式的代碼示(shi)例,展示(shi)了(le)接口(kou)在插件(jian)(jian)化架構中的重要(yao)作用,... ...
Kafka 消(xiao)息(xi)隊(dui)列 Apache Kafka是一(yi)個開(kai)源的分布(bu)式消(xiao)息(xi)隊(dui)列,由LinkedIn公司開(kai)發并于(yu)2011年貢獻給Apache軟件基(ji)金會(hui)。Kafka被(bei)設計用(yong)來處(chu)理千億量級的實時數據,被(bei)廣泛(fan)應(ying)用(yong)于(yu)互聯網大規模數據處(chu)理平臺中。 Kafka強大的數據吞吐量,其中最(zui)重要部(bu)分在于(yu)它的消(xiao)息(xi)日(ri)志格式的設計, ...
RocksDB LSM樹 RocksDB是Meta (Facebook) 開源的高性能持久化鍵值存(cun)(cun)儲(chu)庫,源于Google的LevelDB,并(bing)針對SSD和服務器工作負載進(jin)行了(le)深度優(you)化。它廣(guang)泛應用于需要處理海量(liang)數(shu)(shu)據(億級(ji)甚至更高)并(bing)要求(qiu)高寫入(ru)吞吐的場(chang)景。 RocksDB 以 kv 對集合的形式存(cun)(cun)儲(chu)數(shu)(shu)據, ...
存(cun)(cun)儲(chu)引(yin)擎(qing)(qing) 存(cun)(cun)儲(chu)引(yin)擎(qing)(qing)是數據(ju)庫(ku)管(guan)理系統(DBMS)或鍵(jian)值(zhi)存(cun)(cun)儲(chu)系統的核心組(zu)件,它定(ding)義了數據(ju)在持久化(hua)(hua)存(cun)(cun)儲(chu)介質上如何組(zu)織、存(cun)(cun)儲(chu)、檢索和(he)(he)管(guan)理。不(bu)同的存(cun)(cun)儲(chu)引(yin)擎(qing)(qing)針對特定(ding)負載(如讀密(mi)(mi)集型、寫密(mi)(mi)集型、混(hun)合型)和(he)(he)數據(ju)模(mo)型(如關系型、鍵(jian)值(zhi)型、文(wen)檔型)進(jin)行優化(hua)(hua)。 目前常見的存(cun)(cun)儲(chu)引(yin)擎(qing)(qing)使用的存(cun)(cun)儲(chu)數據(ju)結構(gou)有(you)如下幾(ji)種。 1)哈希表( ...
我今天在(zai)和 GPT 討(tao)論之前(qian)說過的(de)新想法(fa):把 Tolk 拆分(fen),拆分(fen)為: 入口(kou):用于接入其他程序。 兼容現(xian)存的(de)入口(kou):主(zhu)要是(shi) Tolk.dll、TolkDotNet.dll、Tolk.jar;nvda.dll 等。再加一個 http 的(de)接口(kou)用于測試。這部分(fen)是(shi)最大的(de)改動,可(ke)以降低維護(hu)成本,也能更好的(de)支持多 ...
I/O緩存 局(ju)部(bu)(bu)性(xing)(xing)原理(li)(li) 局(ju)部(bu)(bu)性(xing)(xing)原理(li)(li)(Principle of Locality)指在程序執行過(guo)程中,傾向于訪(fang)(fang)問(wen)某些(xie)局(ju)部(bu)(bu)特定的數據(ju)或指令,而不(bu)(bu)是隨機地訪(fang)(fang)問(wen)整個內存空間。這是緩存技(ji)術得以有效(xiao)的根本(ben)原因。 1)時間局(ju)部(bu)(bu)性(xing)(xing)(Temporal Locality):如果一個數據(ju)項被(bei)訪(fang)(fang)問(wen),那么在不(bu)(bu)久(jiu)的將來它(ta)很可能 ...
在數據暴漲(zhang)時(shi)代,如何高效(xiao)存儲(chu)(chu)和管理海量數據已成為應用系(xi)統的(de)核(he)心挑戰。這不(bu)(bu)僅關(guan)乎讀寫性能(neng),更(geng)涉及并發場景下性能(neng)與持久化之間的(de)平衡。要應對(dui)這一挑戰,既(ji)需(xu)要理解不(bu)(bu)同存儲(chu)(chu)介質的(de)物理特性與性能(neng)邊界,也需(xu)通過數據結構、存儲(chu)(chu)模型與操作系(xi)統機制的(de)協同設計(ji),達成技(ji)術上(shang)的(de)最優平衡。 本文將從計(ji)算(suan)機系(xi)統的(de)分層存儲(chu)(chu)體(ti)系(xi)這一 ...
方(fang)法(fa)(fa)內聯 方(fang)法(fa)(fa)內聯(Method Inlining)是編譯(yi)器(qi)在進行優化時(shi),將被調(diao)用(yong)(yong)方(fang)法(fa)(fa)的(de)代碼直接嵌入到(dao)(dao)調(diao)用(yong)(yong)點(dian),以替(ti)代方(fang)法(fa)(fa)調(diao)用(yong)(yong)指令的(de)過程(cheng)(cheng)。它不僅消(xiao)除(chu)了方(fang)法(fa)(fa)調(diao)用(yong)(yong)的(de)開銷,還(huan)為(wei)后(hou)續的(de)優化(如(ru)常量傳播、死代碼消(xiao)除(chu)等)創(chuang)造了條件。 Java程(cheng)(cheng)序的(de)方(fang)法(fa)(fa)調(diao)用(yong)(yong)會涉及到(dao)(dao)如(ru)下步(bu)驟: 1)保存當前方(fang)法(fa)(fa)的(de)程(cheng)(cheng)序計數器(qi)(返回地(di)址 ...
逃逸分析(Escape Analysis)是一種靜態程序分析技術(shu),主要用(yong)于(yu)判定對(dui)象的(de)可見范圍(Visibility)與生命周期(Lifetime)。該技術(shu)是現代(dai)即(ji)時(shi)編譯器實現局部化優化、提(ti)升內存(cun)使用(yong)效率、降低同步成本的(de)基礎。 通俗來說,逃逸分析的(de)核心在(zai)于(yu)回答這(zhe)樣(yang)一個問(wen)題:某個對(dui)象是否可能“逃逸”出它 ...
機器(qi)相(xiang)(xiang)關的(de)編譯優化(hua) 與機器(qi)相(xiang)(xiang)關的(de)編譯優化(hua)常見的(de)有指令(ling)選擇(Instruction Selection)、寄存器(qi)分(fen)配(Register Allocation)、窺孔優化(hua)(Peephole Optimization)等。這些機器(qi)級(ji)優化(hua)通(tong)常發生在(zai)中間表示(shi)向(xiang)目標代(dai)(dai)碼生成(cheng)之間的(de)后端(duan)編譯階段(duan)。 與源代(dai)(dai)碼層面的(de)優 ...
中間表(biao)達形(xing)式 編譯(yi)器(qi)(qi)通常被(bei)劃分(fen)為(wei)前(qian)端(duan)(duan)編譯(yi)器(qi)(qi)和(he)后端(duan)(duan)編譯(yi)器(qi)(qi)兩個部分(fen)。前(qian)端(duan)(duan)編譯(yi)器(qi)(qi)負責對(dui)源代碼進行詞法分(fen)析、語法分(fen)析和(he)語義分(fen)析,生(sheng)(sheng)成中間表(biao)達形(xing)式(Intermediate Representation ,IR)。這種由前(qian)端(duan)(duan)生(sheng)(sheng)成的IR被(bei)稱為(wei)高(gao)級中間表(biao)達形(xing)式(High Intermediate Represen ...
HotSpot虛擬機(ji)內部集(ji)成了兩個即(ji)(ji)時編(bian)譯(yi)器,分別被稱為C1編(bian)譯(yi)器(Client Compiler/ Quick Complier)和C2編(bian)譯(yi)器(Server Compiler)。自Java 9起,-server模(mo)式(即(ji)(ji)啟用C2編(bian)譯(yi)器或分層編(bian)譯(yi))是默認選項,-client選項通常會被忽略(lve)。 C1編(bian)譯(yi) ...
Java虛(xu)擬(ni)機(ji)采(cai)用的是(shi)基(ji)于(yu)(yu)棧(zhan)(zhan)的指(zhi)令集架構,這(zhe)(zhe)意味著Java虛(xu)擬(ni)機(ji)主要通(tong)過解(jie)(jie)釋執行(xing)(xing)基(ji)于(yu)(yu)棧(zhan)(zhan)的字(zi)節碼(ma)來運行(xing)(xing)Java程序。盡(jin)管Java虛(xu)擬(ni)機(ji)采(cai)取了一(yi)些優(you)化(hua)(hua)措施,如棧(zhan)(zhan)頂緩存(cun)(Stack Top Cache),將(jiang)棧(zhan)(zhan)頂元(yuan)素緩存(cun)到寄存(cun)器中(zhong)以減少對內存(cun)的頻(pin)繁訪(fang)問,但這(zhe)(zhe)些優(you)化(hua)(hua)手段并不能從根(gen)本上解(jie)(jie)決基(ji)于(yu)(yu)棧(zhan)(zhan)的指(zhi)令集執行(xing)(xing)效率 ...
基(ji)于(yu)棧的運(yun)行(xing)方式 Java虛(xu)擬機的執(zhi)行(xing)過程基(ji)于(yu)字(zi)節碼指令(ling),可以(yi)將其(qi)視為對操(cao)(cao)(cao)作系統(tong)的一種抽象(xiang)模(mo)擬。Java虛(xu)擬機具有(you)自己的指令(ling)集和(he)運(yun)行(xing)環(huan)境,包(bao)括(kuo)(kuo)堆(Heap)、棧(Stack)、方法區(qu)(Method Area)等。因此,Java虛(xu)擬機的指令(ling)操(cao)(cao)(cao)作流程與(yu)處(chu)理器的指令(ling)操(cao)(cao)(cao)作流程有(you)許多相似之處(chu),主要包(bao)括(kuo)(kuo)取指令(ling)、 ...
Java虛擬機(ji)(Java Virtual Machine,JVM)是Java生態(tai)的(de)(de)基石(shi),不(bu)僅承(cheng)載著(zhu)“一次編(bian)(bian)寫,隨處運行”的(de)(de)核心(xin)使命,還通過即時編(bian)(bian)譯優(you)化(hua)機(ji)制,彌合抽(chou)(chou)象(xiang)層與性(xing)能間的(de)(de)差(cha)距(ju)。字節碼的(de)(de)通用(yong)性(xing)雖帶來效(xiao)率損耗,但Java虛擬機(ji)借助動態(tai)探(tan)測熱(re)點代碼、分層編(bian)(bian)譯策(ce)略和即時優(you)化(hua)技術(shu),不(bu)斷彌補抽(chou)(chou)象(xiang)造(zao)成(cheng)的(de)(de)性(xing)能 ...
有(you)序性(xing):代(dai)碼執行的幻覺 前面講(jiang)到通(tong)過緩(huan)存(cun)一致性(xing)協議,來保障(zhang)共(gong)享(xiang)(xiang)變(bian)量的可(ke)見性(xing)。那么是否還有(you)其(qi)他情況(kuang),導致對共(gong)享(xiang)(xiang)變(bian)量操作不符合預期結果(guo)。可(ke)以看下(xia)面的代(dai)碼: private int a, b; private int x, y; public void test() { Thread t1 = new T ...
隨著多核(he)架構(gou)的(de)(de)普及,并(bing)發(fa)(fa)編程已成(cheng)為開發(fa)(fa)者(zhe)不可或缺的(de)(de)核(he)心技能(neng)。在(zai)學習過(guo)程中(zhong),開發(fa)(fa)者(zhe)常(chang)會遇到這(zhe)樣(yang)的(de)(de)困惑:正確編寫的(de)(de)單線程代碼,為何在(zai)并(bing)發(fa)(fa)環境下可能(neng)瞬(shun)間失效?看(kan)似有(you)序(xu)的(de)(de)語句執行(xing)后,為何結果卻混(hun)亂不堪?這(zhe)些問題,都指向了編程領(ling)域的(de)(de)一個關鍵課題——內(nei)存模型。 本文以Java語言為例,剖析共享數(shu)據在(zai)并(bing)發(fa)(fa)環境中(zhong)的(de)(de) ...
并(bing)發編程藝(yi)術 內存模型(xing)——連接代(dai)碼(ma)與硬件的契約 以可見性、有序性、原子性為基礎,通過happens - before規(gui)則(ze)和volatile/synchronized同步機制,探討處理器優化與并(bing)發安全的關系,介(jie)紹多線程程序底層運行邏輯。 并(bing)發原語——在混沌中建立(li)秩(zhi)序 對比Java與Golang并(bing)發哲學 ...