物理內(nèi)存也稱為主存,大多數(shù)計(jì)算機(jī)用的主存都是動(dòng)態(tài)隨機(jī)訪問(wèn)內(nèi)存(DRAM)。只有內(nèi)核才可以直接訪問(wèn)物理內(nèi)存。那么,進(jìn)程要訪問(wèn)內(nèi)存時(shí),該怎么辦呢?Linux 內(nèi)核給每個(gè)進(jìn)程都提供...
CS架構(gòu)Android 平臺(tái)第一個(gè)想到的就是 ContentProvider:一個(gè)單獨(dú)進(jìn)程管理數(shù)據(jù),數(shù)據(jù)同步不易出錯(cuò),簡(jiǎn)單好用易上手。然而它的問(wèn)題也很明顯,就是一個(gè)字慢:?jiǎn)?dòng)...
1.讀寫形式通過(guò) mmap 內(nèi)存映射文件,提供一段可供隨時(shí)寫入的內(nèi)存塊,App 只管往里面寫數(shù)據(jù),由操作系統(tǒng)負(fù)責(zé)將內(nèi)存回寫到文件,不必?fù)?dān)心 crash 導(dǎo)致數(shù)據(jù)丟失。 2.存...
當(dāng)評(píng)估利弊時(shí),架構(gòu)師必須保證聯(lián)系上下文來(lái)做決策。不然,外部因素會(huì)不合時(shí)宜地影響到分析。經(jīng)常,一個(gè)解決方案有很多有利的地方,但缺乏致勝的能力,以致無(wú)法成功。架構(gòu)師必須確保他們權(quán)...
用一句簡(jiǎn)單的話來(lái)說(shuō)就是:Netty封裝了JDK的NIO,讓你用得更方便,不用再寫一大堆復(fù)雜的代碼了。 Netty作為一個(gè)高性能的 NIO通信框架,涉及的知識(shí)點(diǎn)包括網(wǎng)絡(luò)通信、多...
我們根據(jù)分布式架構(gòu)中組件的不同交互模式定義了3個(gè)維度的耦合約束:通信方式、一致性要求和協(xié)調(diào)方式 Saga這個(gè)概念的出現(xiàn)早于微服務(wù),最初是用來(lái)描述早期分布式系統(tǒng)中數(shù)據(jù)庫(kù)鎖的作用...
Kafka中存在大量的延時(shí)操作,比如延時(shí)生產(chǎn)、延時(shí)拉取和延時(shí)刪除等。Kafka并沒(méi)有使用JDK自帶的Timer或DelayQueue來(lái)實(shí)現(xiàn)延時(shí)的功能,而是基于時(shí)間輪的概念自定...
說(shuō)到緩存,你應(yīng)該不陌生。相對(duì)于磁盤操作,基于內(nèi)存的緩存對(duì)耗時(shí)敏感的高并發(fā)應(yīng)用來(lái)說(shuō),在性能方面的提升是非常明顯的。同樣是 1MB 的數(shù)據(jù)讀取,從磁盤讀取的耗時(shí),比從內(nèi)存讀取的耗...
HMAC驗(yàn)簽(帶密鑰的Hash摘要算法) 雖然簡(jiǎn)單的哈希計(jì)算可以有效防止令牌失竊,但不能防止寫訪問(wèn)權(quán)限的攻擊者插入偽造令牌。大多數(shù)的數(shù)據(jù)庫(kù)在設(shè)計(jì)上并沒(méi)有考慮提供恒定時(shí)間比較措...
UUID(Universally Unique Identifier,通用唯一標(biāo)識(shí)碼)不依賴于任何第三方系統(tǒng),所以在性能和可用性上都比較好,我一般會(huì)使用它生成 Request...
在比較兩個(gè)流式處理系統(tǒng)時(shí),要著重考慮使用場(chǎng)景是什么。以下是一些需要考慮的應(yīng)用類別。 攝取 攝取的目的是將數(shù)據(jù)從一個(gè)系統(tǒng)移動(dòng)到另一個(gè)系統(tǒng),并在傳輸過(guò)程中對(duì)數(shù)據(jù)進(jìn)行一些修改,使其...
微服務(wù)并不是很多人認(rèn)為的那樣又簡(jiǎn)單又輕量級(jí)。要做好微服務(wù),這些基礎(chǔ)設(shè)施都是必不可少的,否則微服務(wù)就會(huì)變成一個(gè)焦油坑,讓業(yè)務(wù)和團(tuán)隊(duì)在里面不斷掙扎且無(wú)法自拔。因此也可以說(shuō),微服務(wù)...
既要考慮發(fā)生分區(qū)時(shí)需要保證的是CP還是還是AP,還需要考慮在沒(méi)有發(fā)生分區(qū)時(shí),如何保證CA的問(wèn)題。我們可以在分區(qū)故障解決時(shí),讓系統(tǒng)重新恢復(fù)CA狀態(tài)。 以用戶系統(tǒng)為例,假如我們選...
兩階段提交第一,2PC 是一個(gè)阻塞式協(xié)議。當(dāng) 2PC 的一個(gè)參與者,在階段 1 做出了“是”的回復(fù)后,參與者將不能單方面放棄,它必須等待協(xié)調(diào)者的決定,也就意味著參與者所有占用...
Raft算法Raft 把這個(gè)一致性的算法分解成了幾個(gè)部分,一個(gè)是領(lǐng)導(dǎo)選舉(Leader Selection),一個(gè)是日志復(fù)制(Log Replication),一個(gè)是安全性(...
1.主從分片我們上面討論的主從復(fù)制模型,是基于每一個(gè)副本都有全量的數(shù)據(jù)集的,如果我們將這個(gè)主從復(fù)制的粒度變小一點(diǎn),比如可以指定每一個(gè)副本最大為 128 M,對(duì)于全量數(shù)據(jù)集按 ...
分布式鎖的本質(zhì)是在獨(dú)立集群外的一個(gè)存儲(chǔ)系統(tǒng),設(shè)置一個(gè)值,并標(biāo)記所有權(quán),表明這個(gè)資源我占用了。 在分布式鎖的場(chǎng)景中,部分失敗和異步網(wǎng)絡(luò)這兩個(gè)問(wèn)題是同時(shí)存在的。如果一個(gè)進(jìn)程獲得了...
學(xué)了那么多基礎(chǔ)理論和代碼,這里來(lái)看看實(shí)際使用過(guò)程中會(huì)使用的一些常用實(shí)踐: 一.異步轉(zhuǎn)同步。異步轉(zhuǎn)同步,需要把回調(diào)轉(zhuǎn)為等待。因此可以通過(guò)前面提到的鎖的阻塞的方式來(lái)實(shí)現(xiàn)??梢酝ㄟ^(guò)...
Actor 使用單線程處理消息,所以不會(huì)出現(xiàn)并發(fā)問(wèn)題。你可以把 Actor 內(nèi)部的工作模式想象成只有一個(gè)消費(fèi)者線程的生產(chǎn)者 - 消費(fèi)者模式。所以,在 Actor 模型里,發(fā)送...
ThreadLocal顧名思義,就是每個(gè)線程保存一份只有自己能訪問(wèn)的對(duì)象,避免了不同線程對(duì)同一個(gè)線程的競(jìng)爭(zhēng)。所以核心在于如何隱藏一個(gè)對(duì)象的可見性,來(lái)保證只有指定的線程能訪問(wèn)到...