當前位置:首頁 » 硬碟大全 » 並發系統緩存設計
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

並發系統緩存設計

發布時間: 2022-12-09 16:06:50

Ⅰ 高性能高並發網站架構,教你搭建Redis5緩存集群

一、Redis集群介紹

Redis真的是一個優秀的技術,它是一種key-value形式的Nosql內存資料庫,由ANSI C編寫,遵守BSD協議、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 Redis最大的特性是它會將所有數據都放在內存中,所以讀寫速度性能非常好。Redis是基於內存進行操作的,性能較高,可以很好的在一定程度上解決網站一瞬間的並發量,例如商品搶購秒殺等活動。

網站承受高並發訪問壓力的同時,還需要從海量數據中查詢出滿足條件的數據,需要快速響應,前端發送請求、後端和mysql資料庫交互,進行sql查詢操作,讀寫比較慢,這時候引入Redis ,把從mysql 的數據緩存到Redis 中,下次讀取時候性能就會提高;當然,它也支持將內存中的數據以快照和日誌的形式持久化到硬碟,這樣即使在斷電、機器故障等異常情況發生時數據也不會丟失,Redis能從硬碟中恢復快照數據到內存中。

Redis 發布了穩定版本的 5.0 版本,放棄 Ruby的集群方式,改用 C語言編寫的 redis-cli的方式,是集群的構建方式復雜度大大降低。Redis-Cluster集群採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接。

為了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證集群不會掛掉。

redis-cluster投票:容錯,投票過程是集群中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為當前master節點掛掉。

集群中至少應該有奇數個節點,所以至少有三個節點,每個節點至少有一個備份節點,所以下面使用6節點(主節點、備份節點由redis-cluster集群確定)。6個節點分布在一台機器上,採用三主三從的模式。實際應用中,最好用多台機器,比如說6個節點分布到3台機器上,redis在建立集群時為自動的將主從節點進行不同機器的分配。

二、單機redis模式

下載源碼redis5.0並解壓編譯

wget http://download.redis.io/releases/redis-5.0.0.tar.gz

tar xzf redis-5.0.0.tar.gz

cd redis-5.0.0

make

redis前端啟動需要改成後台啟動.

修改redis.conf文件,將daemonize no -> daemonize yes

vim redis.conf

啟動redis

/www/server/redis/src/redis-server /www/server/redis/redis.conf

查看redis是否在運行

ps aux|grep redis

現在是單機redis模式完成。

三、redis集群模式:

1.創建6個Redis配置文件

cd /usr/local/

mkdir redis_cluster //創建集群目錄

cd redis_cluster

mkdir 7000 7001 7002 7003 7004 7005//分別代表6個節點

其對應埠 7000 7001 7002 70037004 7005

2.復制配置文件到各個目錄

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7000/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7001/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7002/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7003/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7004/

cp /www/server/redis/redis.conf /usr/local/redis_cluster/7005/

3.分別修改配置文件

vim /usr/local/redis_cluster/7000/redis.conf

vim /usr/local/redis_cluster/7001/redis.conf

vim /usr/local/redis_cluster/7002/redis.conf

vim /usr/local/redis_cluster/7003/redis.conf

vim /usr/local/redis_cluster/7004/redis.conf

vim /usr/local/redis_cluster/7005/redis.conf

如下

port 7000 #埠

cluster-enabled yes #啟用集群模式

cluster-config-file nodes_7000.conf #集群的配置 配置文件首次啟動自動生成

cluster-node-timeout 5000 #超時時間 5秒

appendonly yes #aof日誌開啟 它會每次寫操作都記錄一條日誌

daemonize yes #後台運行

protected-mode no #非保護模式

pidfile /var/run/redis_7000.pid

//下面可以不寫

#若設置密碼,master和slave需同時配置下面兩個參數:

masterauth "jijiji" #連接master的密碼

requirepass "jijiji" #自己的密碼

cluster-config-file,port,pidfile對應數字

4.啟動節點

cd /www/server/redis/src/

./redis-server /usr/local/redis_cluster/7000/redis.conf

./redis-server /usr/local/redis_cluster/7001/redis.conf

./redis-server /usr/local/redis_cluster/7002/redis.conf

./redis-server /usr/local/redis_cluster/7003/redis.conf

./redis-server /usr/local/redis_cluster/7004/redis.conf

./redis-server /usr/local/redis_cluster/7005/redis.conf

查看redis運行

ps aux|grep redis

5.啟動集群

/www/server/redis/src/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

這里使用的命令是create,因為我們要創建一個新的集群。 該選項--cluster-replicas 1意味著我們希望每個創建的主伺服器都有一個從服。

輸入yes

至此,Reids5 集群搭建完成。

6.檢查Reids5集群狀態

可以執行redis-cli --cluster check host:port檢查集群狀態slots詳細分配。

redis-cli --cluster info 127.0.0.1:7000

7.停止Reids5集群

(1).因為Redis可以妥善處理SIGTERM信號,所以直接kill -9也是可以的,可以同時kill多個,然後再依次啟動。

kill -9 PID PID PID

(2).redis5 提供了關閉集群的工具,修改文件: /www/server/redis/utils/create-cluster/create-cluster

埠PROT設置為6999,NODES為6,工具會生成 7000-7005 六個節點 用於操作。

修改後,執行如下命令關閉集群:

/www/server/redis/utils/create-cluster/create-cluster stop

重新啟動集群:

/www/server/redis/utils/create-cluster/create-cluster start

8.幫助信息

執行redis-cli --cluster help,查看更多幫助信息

redis-cli --cluster help

吉海波

Ⅱ 現在有哪些技術能夠提高.Net的並發和緩存

這些並發,可以通過增加應用伺服器來達到,緩存可以使用 "System.Web.Caching.Cache"來增加,由於目前不知道增加這些並發和緩存的作用,所以下面只能列舉常用的方法給你哦!

一、緩解資料庫讀取壓力

這個緩存機制使用的是.Net本身提供的緩存功能,System.Web.Caching.Cache
這個方案可以解決一般訪問量不是很大的站點的需求,更高一級的,可以通過增加Web園工作進程來達到提升性能的需求,而且這個方案裡面,已經解決多進程下緩存同步的問題。

更高層次的緩存只用到內存資料庫如:Redis Memcached ...

由於增加了緩存服務,可以解決大部分高並發訪問需求。

二、緩解Web伺服器壓力

1 增加公用資源文件訪問CDN (將 js pic 這些站點必須的文件採用公用CDN)

2 使用單獨的文件伺服器

3 增加web伺服器進行負載均衡設計

三、緩解資料庫壓力

    資料庫讀寫分離處理

    --------------------------

    請採納!

Ⅲ 如何搭建億級並發的系統架構

想設計億萬級高並發架構,你要先知道高並發是什麼?

面對流量高峰,不同的企業是如何通過技術手段解決高並發難題的呢?

0、引言

軟體系統有三個追求:高性能、高並發、高可用,俗稱三高。三者既有區別也有聯系,門門道道很多,全面討論需要三天三夜,本篇討論高並發。

高並發(High Concurrency)。並發是操作系統領域的一個概念,指的是一段時間內多任務流交替執行的現象,後來這個概念被泛化,高並發用來指大流量、高請求的業務情景,比如春運搶票,電商雙十一,秒殺大促等場景。

很多程序員每天忙著搬磚,平時接觸不到高並發,哪天受不了跑去面試,還常常會被面試官犀利的高並發問題直接KO,其實吧,高並發系統也不高深,我保證任何一個智商在線的看過這篇文章後,都能戰勝恐懼,重拾生活的信心。

本文先介紹高並發系統的度量指標,然後講述高並發系統的設計思路,再梳理高並發的關鍵技術,最後結合作者的經驗做一些延伸探討。

1、高並發的度量指標

既然是高並發系統,那並發一定要高,不然就名不副實。並發的指標一般有QPS、TPS、IOPS,這幾個指標都是可歸為系統吞吐率,QPS越高系統能hold住的請求數越多,但光關注這幾個指標不夠,我們還需要關注RT,即響應時間,也就是從發出request到收到response的時延,這個指標跟吞吐往往是此消彼長的,我們追求的是一定時延下的高吞吐。

比如有100萬次請求,99萬次請求都在10毫秒內響應,其他次數10秒才響應,平均時延不高,但時延高的用戶受不了,所以,就有了TP90/TP99指標,這個指標不是求平均,而是把時延從小到大排序,取排名90%/99%的時延,這個指標越大,對慢請求越敏感。

除此之外,有時候,我們也會關注可用性指標,這可歸到穩定性。

一般而言,用戶感知友好的高並發系統,時延應該控制在250毫秒以內。

什麼樣的系統才能稱為高並發?這個不好回答,因為它取決於系統或者業務的類型。不過我可以告訴你一些眾所周知的指標,這樣能幫助你下次在跟人扯淡的時候稍微靠點兒譜,不至於貽笑大方。

通常,資料庫單機每秒也就能抗住幾千這個量級,而做邏輯處理的服務單台每秒抗幾萬、甚至幾十萬都有可能,而消息隊列等中間件單機每秒處理個幾萬沒問題,所以我們經常聽到每秒處理數百萬、數千萬的消息中間件集群,而像阿某的API網關,每日百億請求也有可能。

2、高並發的設計思路

高並發的設計思路有兩個方向:

  • 垂直方向擴展,也叫豎向擴展

  • 水平方向擴展,也叫橫向擴展

  • 垂直方向:提升單機能力

    提升單機處理能力又可分為硬體和軟體兩個方面:

  • 硬體方向,很好理解,花錢升級機器,更多核更高主頻更大存儲空間更多帶寬

  • 軟體方向,包括用各快的數據結構,改進架構,應用多線程、協程,以及上性能優化各種手段,但這玩意兒天花板低,就像提升個人產出一樣,996、007、最多24 X 7。

  • 水平方向:分布式集群

    為了解決分布式系統的復雜性問題,一般會用到架構分層和服務拆分,通過分層做隔離,通過微服務解耦。

    這個理論上沒有上限,只要做好層次和服務劃分,加機器擴容就能滿足需求,但實際上並非如此,一方面分布式會增加系統復雜性,另一方面集群規模上去之後,也會引入一堆AIOps、服務發現、服務治理的新問題。

    因為垂直向的限制,所以,我們通常更關注水平擴展,高並發系統的實施也主要圍繞水平方向展開。

    3、高並發的關鍵技術

    玩具式的網路服務程序,用戶可以直連伺服器,甚至不需要資料庫,直接寫磁碟文件。但春運購票系統顯然不能這么做,它肯定扛不住這個壓力,那一般的高並發系統是怎麼做呢?比如某寶這樣的正經系統是怎麼處理高並發的呢?

    其實大的思路都差不多,層次劃分 + 功能劃分。可以把層次劃分理解為水平方向的劃分,而功能劃分理解為垂直方向的劃分。

    首先,用戶不能直連伺服器,要做分布式就要解決「分」的問題,有多個服務實例就需要做負載均衡,有不同服務類型就需要服務發現。

    集群化:負載均衡

    負載均衡就是把負載(request)均衡分配到不同的服務實例,利用集群的能力去對抗高並發,負載均衡是服務集群化的實施要素,它分3種:

  • DNS負載均衡,客戶端通過URL發起網路服務請求的時候,會去DNS伺服器做域名解釋,DNS會按一定的策略(比如就近策略)把URL轉換成IP地址,同一個URL會被解釋成不同的IP地址,這便是DNS負載均衡,它是一種粗粒度的負載均衡,它只用URL前半部分,因為DNS負載均衡一般採用就近原則,所以通常能降低時延,但DNS有cache,所以也會更新不及時的問題。

  • 硬體負載均衡,通過布置特殊的負載均衡設備到機房做負載均衡,比如F5,這種設備貴,性能高,可以支撐每秒百萬並發,還能做一些安全防護,比如防火牆。

  • 軟體負載均衡,根據工作在ISO 7層網路模型的層次,可分為四層負載均衡(比如章文嵩博士的LVS)和七層負載均衡(NGINX),軟體負載均衡配置靈活,擴展性強,阿某雲的SLB作為服務對外售賣,Nginx可以對URL的後半部做解釋承擔API網關的職責。

  • 所以,完整的負載均衡鏈路是 client <-> DNS負載均衡 -> F5 -> LVS/SLB -> NGINX

    不管選擇哪種LB策略,或者組合LB策略,邏輯上,我們都可以視為負載均衡層,通過添加負載均衡層,我們將負載均勻分散到了後面的服務集群,具備基礎的高並發能力,但這只是萬里長征第一步。

    資料庫層面:分庫分表+讀寫分離

    前面通過負載均衡解決了無狀態服務的水平擴展問題,但我們的系統不全是無狀態的,後面通常還有有狀態的資料庫,所以解決了前面的問題,存儲有可能成為系統的瓶頸,我們需要對有狀態存儲做分片路由。

    資料庫的單機QPS一般不高,也就幾千,顯然滿足不了高並發的要求。

    所以,我們需要做分庫分表 + 讀寫分離。

    就是把一個庫分成多個庫,部署在多個資料庫服務上,主庫承載寫請求,從庫承載讀請求。從庫可以掛載多個,因為很多場景寫的請求遠少於讀的請求,這樣就把對單個庫的壓力降下來了。

    如果寫的請求上升就繼續分庫分表,如果讀的請求上升就掛更多的從庫,但資料庫天生不是很適合高並發,而且資料庫對機器配置的要求一般很高,導致單位服務成本高,所以,這樣加機器抗壓力成本太高,還得另外想招。

    讀多寫少:緩存

    緩存的理論依據是局部性原理。

    一般系統的寫入請求遠少於讀請求,針對寫少讀多的場景,很適合引入緩存集群。

    在寫資料庫的時候同時寫一份數據到緩存集群里,然後用緩存集群來承載大部分的讀請求,因為緩存集群很容易做到高性能,所以,這樣的話,通過緩存集群,就可以用更少的機器資源承載更高的並發。

    緩存的命中率一般能做到很高,而且速度很快,處理能力也強(單機很容易做到幾萬並發),是理想的解決方案。

    CDN本質上就是緩存,被用戶大量訪問的靜態資源緩存在CDN中是目前的通用做法。

    緩存也有很多需要謹慎處理的問題:

  • 一致性問題:(a)更新db成功+更新cache失敗 -> 不一致 (b)更新db失敗+更新cache成功 -> 不一致 ©更新db成功+淘汰緩存失敗 -> 不一致

  • 緩存穿透:查詢一定不存在的數據,會穿透緩存直接壓到資料庫,從而導致緩存失去作用,如果有人利用這個漏洞,大量查詢一定不存在的數據,會對資料庫造成壓力,甚至打掛資料庫。解決方案:布隆過濾器 或者 簡單的方案,查詢不存在的key,也把空結果寫入緩存(設置較短的過期淘汰時間),從而降低命失

  • 緩存雪崩:如果大量緩存在一個時刻同時失效,則請求會轉到DB,則對DB形成壓迫,導致雪崩。簡單的解決方案是為緩存失效時間添加隨機值,降低同一時間點失效淘汰緩存數,避免集體失效事件發生

  • 但緩存是針對讀,如果寫的壓力很大,怎麼辦?

    高寫入:消息中間件

    同理,通過跟主庫加機器,耗費的機器資源是很大的,這個就是資料庫系統的特點所決定的。

    相同的資源下,資料庫系統太重太復雜,所以並發承載能力就在幾千/s的量級,所以此時你需要引入別的一些技術。

    比如說消息中間件技術,也就是MQ集群,它是非常好的做寫請求非同步化處理,實現削峰填谷的效果。

    消息隊列能做解耦,在只需要最終一致性的場景下,很適合用來配合做流控。

    假如說,每秒是1萬次寫請求,其中比如5千次請求是必須請求過來立馬寫入資料庫中的,但是另外5千次寫請求是可以允許非同步化等待個幾十秒,甚至幾分鍾後才落入資料庫內的。

    那麼此時完全可以引入消息中間件集群,把允許非同步化的每秒5千次請求寫入MQ,然後基於MQ做一個削峰填谷。比如就以平穩的1000/s的速度消費出來然後落入資料庫中即可,此時就會大幅度降低資料庫的寫入壓力。

    業界有很多著名的消息中間件,比如ZeroMQ,rabbitMQ,kafka等。

    消息隊列本身也跟緩存系統一樣,可以用很少的資源支撐很高的並發請求,用它來支撐部分允許非同步化的高並發寫入是很合適的,比使用資料庫直接支撐那部分高並發請求要減少很多的機器使用量。

    避免擠兌:流控

    再強大的系統,也怕流量短事件內集中爆發,就像銀行怕擠兌一樣,所以,高並發另一個必不可少的模塊就是流控。

    流控的關鍵是流控演算法,有4種常見的流控演算法。

  • 計數器演算法(固定窗口):計數器演算法是使用計數器在周期內累加訪問次數,當達到設定的限流值時,觸發限流策略,下一個周期開始時,進行清零,重新計數,實現簡單。計數器演算法方式限流對於周期比較長的限流,存在很大的弊端,有嚴重的臨界問題。

  • 滑動窗口演算法:將時間周期分為N個小周期,分別記錄每個小周期內訪問次數,並且根據時間滑動刪除過期的小周期,當滑動窗口的格子劃分的越多,那麼滑動窗口的滾動就越平滑,限流的統計就會越精確。此演算法可以很好的解決固定窗口演算法的臨界問題。

  • 漏桶演算法:訪問請求到達時直接放入漏桶,如當前容量已達到上限(限流值),則進行丟棄(觸發限流策略)。漏桶以固定的速率進行釋放訪問請求(即請求通過),直到漏桶為空。分布式環境下實施難度高。

  • 令牌桶演算法:程序以r(r=時間周期/限流值)的速度向令牌桶中增加令牌,直到令牌桶滿,請求到達時向令牌桶請求令牌,如獲取到令牌則通過請求,否則觸發限流策略。分布式環境下實施難度高。

  • 4、高並發的實踐經驗

    接入-邏輯-存儲是經典的互聯網後端分層,但隨著業務規模的提高,邏輯層的復雜度也上升了,所以,針對邏輯層的架構設計也出現很多新的技術和思路,常見的做法包括系統拆分,微服務。

    除此之外,也有很多業界的優秀實踐,包括某信伺服器通過協程(無侵入,已開源libco)改造,極大的提高了系統的並發度和穩定性,另外,緩存預熱,預計算,批量讀寫(減少IO),池技術等也廣泛應用在實踐中,有效的提升了系統並發能力。

    為了提升並發能力,邏輯後端對請求的處理,一般會用到生產者-消費者多線程模型,即I/O線程負責網路IO,協議編解碼,網路位元組流被解碼後產生的協議對象,會被包裝成task投入到task queue,然後worker線程會從該隊列取出task執行,有些系統會用多進程而非多線程,通過共享存儲,維護2個方向的shm queue,一個input q,一個output q,為了提高並發度,有時候會引入協程,協程是用戶線程態的多執行流,它的切換成本更低,通常有更好的調度效率。

    另外,構建漏斗型業務或者系統,從客戶端請求到接入層,到邏輯層,到DB層,層層遞減,過濾掉請求,Fail Fast(盡早發現盡早過濾),嘴大屁眼小,哈哈。

    漏斗型系統不僅僅是一個技術模型,它也可以是一個產品思維,配合產品的用戶分流,邏輯分離,可以構建全方位的立體模型。

    5、小結

    莫讓浮雲遮望眼,除去繁華識真顏。我們不能掌握了大方案,吹完了牛皮,而忽視了編程最本質的東西,掌握最基本最核心的編程能力,比如數據架構和演算法,設計,慣用法,培養技術的審美,也是很重要的,既要致高遠,又要盡精微。

Ⅳ (二)微信紅包高並發系統設計方案(1)

2017年1月28日,正月初一,微信公布了用戶在除夕當天收發微信紅包的數量——142億個,而其收發峰值也已達到76萬每秒。百億級別的紅包,如何保障並發性能與資金安全?這給微信帶來了超級挑戰。面對挑戰,微信紅包在分析了業界「秒殺」系統解決方案的基礎上,採用了 SET化、請求排隊串列化、雙維度分庫表 等設計,形成了獨特的高並發、資金安全系統解決方案。實踐證明,該方案表現穩定,且實現了除夕夜系統零故障運行。概要:

一、業務 特點 :海量的並發要求;嚴格的安全級別

二、技術 難點 :並發請求搶鎖;事務級操作量級大;事務性要求嚴格

三、解決高並發問題 通常 使用的 方案 :

1.使用內存操作替代實時的DB事務操作(優點:內存操作替代磁碟操作,提高了並發性能。)

2使用樂觀鎖替代悲觀鎖。應用於微信紅包系統,則會存在下面三個問題:滾並返回失敗;並發大失敗,小成功。DB壓力大。

四、微信 紅包 系統的高並發解決 方案 :

1.系統垂直SET化,分而治之。

2.邏輯Server層將請求排隊,解決DB並發問題。

3.雙維度庫表設計,保障系統性能穩定

類似「秒殺」活動,群里發一個紅包=「秒殺」商品上架;搶紅包的動作=「秒殺」的查詢庫存;拆紅包=「秒殺」

同一時間有10萬個群里的用戶同時在發紅包,那就相當於同一時間有10萬個「秒殺」活動發布出去。10萬個微信群里的用戶同時搶紅包,將產生海量的並發請求。

微信紅包是微信支付的一個商戶,提供資金流轉服務。

用戶發紅包=購買一筆「錢」(在微信紅包這個商戶上),並且收貨地址是微信群。當用戶支付成功後,紅包「發貨」到微信群里,群里的用戶拆開紅包後,微信紅包提供了將「錢」轉入折紅包用戶微信零錢的服務。

資金交易業務比普通商品「秒殺」活動有更高的安全級別要求。普通的商品「秒殺」商品由商戶提供,庫存是商戶預設的,「秒殺」時可以允許存在「超賣」、「少賣」的情況。但是對於微信紅包,100元不可以被拆出101元;領取99元時,剩下的1元在24小時過期後要精確地退還給發紅包用戶,不能多也不能少。

在介紹微信紅包系統的技術難點之前,先介紹下簡單的、典型的商品「秒殺」系統的架構設計,如下圖所示。

該系統由接入層、邏輯服務層、存儲層與緩存構成。Proxy處理請求接入,Server承載主要的業務邏輯,Cache用於緩存庫存數量、DB則用於數據持久化。

一個「秒殺」活動,對應DB中的一條庫存記錄。當用戶進行商品「秒殺」時,系統的主要邏輯在於DB中庫存的操作上。一般來說,對DB的操作流程有以下三步:

a. 鎖庫存

b. 插入「秒殺」記錄

c. 更新庫存

a.鎖庫存是為了 避免 並發請求時出現「 超賣 」情況。同時要求這 三步操作 需要在 一個事務 中完成(難點:並發請求搶鎖)。

第一個事務完成提交之前這個鎖一直被第一個請求佔用,後面的所有請求需要 排隊等待 。同時參與「秒殺」的用戶越多,並發進DB的請求越多,請求 排隊越嚴重 。

紅包系統的設計上, 除了並發請求搶鎖之外,還有以下兩個突出難點 :

首先,事務級操作量級大 。上文介紹微信紅包業務特點時提到,普遍情況下同時會有數以萬計的微信群在發紅包。這個業務特點映射到微信紅包系統設計上,就是有數以萬計的「並發請求搶鎖」同時在進行。這使 得DB的壓力 比普通單個商品「庫存」被鎖要大很多倍。

其次,事務性要求嚴格 。微信紅包系統本質上是一個資金交易系統,相比普通商品「秒殺」系統有更高的事務級別要求。

普通商品「秒殺」活動系統,解決高並發問題的方案,大體有以下幾種:

如圖2所示,將「實時扣庫存」的行為上移到 內存Cache中操作 ,內存Cache操作成功直接給Server返回成功,然後 非同步落DB持久化 。

優點:提高了並發性能。

缺點: 在內存操作 成功 但 DB持久化失敗 ,或者內存 Cache故障 的情況下,DB持久化會 丟數據 ,不適合微信紅包這種資金交易系統。

商品「秒殺」系統中,樂觀鎖的具體應用方法,是在DB的「庫存」記錄中維護一個版本號。在更新「庫存」的操作進行前,先去DB獲取當前版本號。在更新庫存的事務提交時,檢查該版本號是否已被其他事務修改。如果版本沒被修改,則提交事務,且版本號加1;如果版本號已經被其他事務修改,則回滾事務,並給上層報錯。

這個方案解決了「並發請求搶鎖」的問題,可以提高DB的並發處理能力。

應用於微信紅包系統,則會存在下面三個問題 :

1.在並發搶到相同版本號的拆紅包請求中, 只有一個能拆紅包成功 , 其他的請求 將事務回滾並返回失敗,給用戶 報錯 ,用戶體驗完全不可接受。

2.將會導致 第一時間 同時拆紅包的用戶有一部分直接 返回失敗 ,反而那些「 手慢 」的用戶,有可能因為 並發減小 後拆紅包 成功 ,這會帶來用戶體驗上的負面影響。

3.會帶來 大數量 的 無效 更新 請求 、事務 回滾 ,給 DB 造成不必要的額外 壓力 。

微信紅包用戶發一個紅包時,微信紅包系統生成一個ID作為這個紅包的唯一標識。接下來這個紅包的所有發紅包、搶紅包、拆紅包、查詢紅包詳情等操作,都根據這個ID關聯。

紅包系統根據這個紅包ID,按一定的規則(如按ID尾號取模等),垂直上下切分。切分後,一個垂直鏈條上的邏輯Server伺服器、DB統稱為一個SET。

各個SET之間相互獨立,互相解耦。並且同一個紅包ID的所有請求,包括發紅包、搶紅包、拆紅包、查詳情詳情等,垂直stick到同一個SET內處理,高度內聚。通過這樣的方式,系統將所有紅包請求這個巨大的洪流分散為多股小流,互不影響,分而治之,如下圖所示。

這個方案解決了同時存在海量事務級操作的問題,將海量化為小量。

紅包系統是資金交易系統,DB操作的事務性無法避免,所以會存在「並發搶鎖」問題。但是如果到達DB的事務操作(也即拆紅包行為)不是並發的,而是串列的,就不會存在「並發搶鎖」的問題了。

按這個思路,為了使拆紅包的事務操作串列地進入DB,只需要將請求在 Server層以FIFO ( 先進先出 )的方式排隊,就可以達到這個效果。從而問題就集中到Server的FIFO隊列設計上。

微信紅包系統設計了分布式的、輕巧的、靈活的FIFO隊列方案。其具體實現如下:

首先,將同一個紅包ID的所有請求stick到同一台Server。

上面SET化方案已經介紹,同個紅包ID的所有請求,按紅包ID stick到同個SET中。不過在同個SET中,會存在多台Server伺服器同時連接同一台DB(基於容災、性能考慮,需要多台Server互備、均衡壓力)。

為了使同一個紅包ID的所有請求,stick到同一台Server伺服器上,在SET化的設計之外,微信紅包系統添加了一層基於紅包ID hash值的分流,如下圖所示。

其次,設計單機請求排隊方案。

將stick到同一台Server上的所有請求在被接收進程接收後,按紅包ID進行排隊。然後 串列地進入worker進程 (執行業務邏輯)進行處理,從而達到 排隊 的效果,如下圖所示。

最後,增加memcached控制並發。

為了 防止 Server中的請求隊列過載導致隊列被降級,從而所有請求 擁進DB ,系統增加了與Server伺服器同機部署的 memcached ,用於控制拆同一個紅包的 請求並發數 。

具體來說,利用memcached的 CAS原子累增操作 ,控制同時進入 DB執行拆紅包事務的請求數 ,超過預先設定數值則 直接拒絕服務 。用於 DB負載升高時的降級 體驗。

通過以上三個措施,系統有效地 控制了DB的「並發搶鎖」 情況。

紅包系統的分庫表規則,初期是根據 紅包ID的hash值 分為多庫多表。隨著紅包數據量逐漸增大,單表數據量也逐漸增加。而DB的性能與單表數據量有一定相關性。當單表數據量達到一定程度時,DB性能會有大幅度下降,影響系統性能穩定性。採用 冷熱分離 ,將歷史冷數據與當前熱數據分開存儲,可以解決這個問題。

系統在以 紅包ID維度 分庫表的基礎上,增加了以 循環天分表的維度 ,形成了 雙維度分庫表 的特色。

具體來說,就是分庫表規則像db_xx.t_y_dd設計,其中,xx/y是紅包ID的 hash值後三位 ,dd的取值范圍在01~31,代表一個月天數最多 31 天。

通過這種雙維度分庫表方式,解決了DB單表數據量膨脹導致性能下降的問題,保障了系統性能的穩定性。同時,在熱冷分離的問題上,又使得數據搬遷變得簡單而優雅。

綜上所述,微信紅包系統在解決高並發問題上的設計,主要採用了SET化分治、請求排隊、雙維度分庫表等方案,使得單組DB的並發性能 提升了8倍 左右,取得了很好的效果。

http://www.infoq.com/cn/articles/2017hongbao-weixin

Ⅳ java高並發,如何解決,什麼方式解決,高並發

首先,為防止高並發帶來的系統壓力,或者高並發帶來的系統處理異常,數據紊亂,可以以下幾方面考慮:1、加鎖,這里的加鎖不是指加java的多線程的鎖,是指加應用所和資料庫鎖,應用鎖這邊通常是使用redis的setnx來做,其次加資料庫鎖,因為代碼中加了應用所,所以資料庫不建議加悲觀鎖(排他鎖),一般加樂觀鎖(通過設置一個seq_no來解決),這兩個鎖一般能解決了,最後做合理的流控,丟棄一部分請求也是必不可少的

Ⅵ 如何解決高並發問題

使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器,(對架構分層+負載均衡+集群)這幾個解決思路在一定程度上意味著更大的投入。

1、高並發:在同一個時間點,有大量的客戶來訪問我們的網站,如果訪問量過大,就可能造成網站癱瘓。

2、高流量:當網站大後,有大量的圖片,視頻,這樣就會對流量要求高,需要更多更大的帶寬。

3、大存儲:可能對數據保存和查詢出現問題。

解決方案:

1、提高硬體能力、增加系統伺服器。(當伺服器增加到某個程度的時候系統所能提供的並發訪問量幾乎不變,所以不能根本解決問題)

2、本地緩存:本地可以使用JDK自帶的Map、Guava Cache.分布式緩存:Redis、Memcache.本地緩存不適用於提高系統並發量,一般是用處用在程序中。

Spiring把已經初始過的變數放在一個Map中,下次再要使用這個變數的時候,先判斷Map中有沒有,這也就是系統中常見的單例模式的實現。

Ⅶ 華為技術架構師分享:高並發場景下緩存處理的一些思路

在實際的開發當中,我們經常需要進行磁碟數據的讀取和搜索,因此經常會有出現從資料庫讀取數據的場景出現。但是當數據訪問量次數增大的時候,過多的磁碟讀取可能會最終成為整個系統的性能瓶頸,甚至是壓垮整個資料庫,導致系統卡死等嚴重問題。

常規的應用系統中,我們通常會在需要的時候對資料庫進行查找,因此系統的大致結構如下所示:

1.緩存和資料庫之間數據一致性問題

常用於緩存處理的機制我總結為了以下幾種:

首先來簡單說說Cache aside的這種方式:

Cache Aside模式

這種模式處理緩存通常都是先從資料庫緩存查詢,如果緩存沒有命中則從資料庫中進行查找。

這裡面會發生的三種情況如下:

緩存命中:

當查詢的時候發現緩存存在,那麼直接從緩存中提取。

緩存失效:

當緩存沒有數據的時候,則從database裡面讀取源數據,再加入到cache裡面去。

緩存更新:

當有新的寫操作去修改database裡面的數據時,需要在寫操作完成之後,讓cache裡面對應的數據失效。

關於這種模式下依然會存在缺陷。比如,一個是讀操作,但是沒有命中緩存,然後就到資料庫中取數據,此時來了一個寫操作,寫完資料庫後,讓緩存失效,然後,之前的那個讀操作再把老的數據放進去,所以,會造成臟數據。

Facebook的大牛們也曾經就緩存處理這個問題發表過相關的論文,鏈接如下:

分布式環境中要想完全的保證數據一致性是一件極為困難的事情,我們只能夠盡可能的減低這種數據不一致性問題產生的情況。

Read Through模式

Read Through模式是指應用程序始終從緩存中請求數據。 如果緩存沒有數據,則它負責使用底層提供程序插件從資料庫中檢索數據。 檢索數據後,緩存會自行更新並將數據返回給調用應用程序。使用Read Through 有一個好處。

我們總是使用key從緩存中檢索數據, 調用的應用程序不知道資料庫, 由存儲方來負責自己的緩存處理,這使代碼更具可讀性, 代碼更清晰。但是這也有相應的缺陷,開發人員需要給編寫相關的程序插件,增加了開發的難度性。

Write Through模式

Write Through模式和Read Through模式類似,當數據發生更新的時候,先去Cache裡面進行更新,如果命中了,則先更新緩存再由Cache方來更新database。如果沒有命中的話,就直接更新Cache裡面的數據。

2.緩存穿透問題

在高並發的場景中,緩存穿透是一個經常都會遇到的問題。

什麼是緩存穿透?

大量的請求在緩存中沒有查詢到指定的數據,因此需要從資料庫中進行查詢,造成緩存穿透。

會造成什麼後果?

大量的請求短時間內湧入到database中進行查詢會增加database的壓力,最終導致database無法承載客戶單請求的壓力,出現宕機卡死等現象。

常用的解決方案通常有以下幾類:

1.空值緩存

在某些特定的業務場景中,對於數據的查詢可能會是空的,沒有實際的存在,並且這類數據信息在短時間進行多次的反復查詢也不會有變化,那麼整個過程中,多次的請求資料庫操作會顯得有些多餘。

不妨可以將這些空值(沒有查詢結果的數據)對應的key存儲在緩存中,那麼第二次查找的時候就不需要再次請求到database那麼麻煩,只需要通過內存查詢即可。這樣的做法能夠大大減少對於database的訪問壓力。

2.布隆過濾器

通常對於database裡面的數據的key值可以預先存儲在布隆過濾器裡面去,然後先在布隆過濾器裡面進行過濾,如果發現布隆過濾器中沒有的話,就再去redis裡面進行查詢,如果redis中也沒有數據的話,再去database查詢。這樣可以避免不存在的數據信息也去往存儲庫中進行查詢情況。

什麼是緩存雪崩?

當緩存伺服器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,也會給後端系統(比如DB)帶來很大壓力。

如何避免緩存雪崩問題?

1.使用加鎖隊列來應付這種問題。當有多個請求湧入的時候,當緩存失效的時候加入一把分布式鎖,只允許搶鎖成功的請求去庫裡面讀取數據然後將其存入緩存中,再釋放鎖,讓後續的讀請求從緩存中取數據。但是這種做法有一定的弊端,過多的讀請求線程堵塞,將機器內存占滿,依然沒有能夠從根本上解決問題。

2.在並發場景發生前,先手動觸發請求,將緩存都存儲起來,以減少後期請求對database的第一次查詢的壓力。數據過期時間設置盡量分散開來,不要讓數據出現同一時間段出現緩存過期的情況。

3.從緩存可用性的角度來思考,避免緩存出現單點故障的問題,可以結合使用 主從+哨兵的模式來搭建緩存架構,但是這種模式搭建的緩存架構有個弊端,就是無法進行緩存分片,存儲緩存的數據量有限制,因此可以升級為Redis Cluster架構來進行優化處理。(需要結合企業實際的經濟實力,畢竟Redis Cluster的搭建需要更多的機器)

4.Ehcache本地緩存 + Hystrix限流&降級,避免MySQL被打死。

使用 Ehcache本地緩存的目的也是考慮在 Redis Cluster 完全不可用的時候,Ehcache本地緩存還能夠支撐一陣。

使用 Hystrix進行限流 & 降級 ,比如一秒來了5000個請求,我們可以設置假設只能有一秒 2000個請求能通過這個組件,那麼其他剩餘的 3000 請求就會走限流邏輯。

然後去調用我們自己開發的降級組件(降級),比如設置的一些默認值呀之類的。以此來保護最後的 MySQL 不會被大量的請求給打死。

Ⅷ 面試題系列:並發編程之線程池及隊列

用newCachedThreadPool()方法創建該線程池對象,創建之初裡面一個線程都沒有,當execute方法或submit方法向線程池提交任務時,會自動新建線程;如果線程池中有空餘線程,則不會新建;這種線程池一般最多情況可以容納幾萬個線程,裡面的線程空餘60s會被回收。

適用場景:執行很多短期非同步的小程序。

固定線程數的池子,每個線程的存活時間是無限的,當池子滿了就不再添加線程;若池中線程均在繁忙狀態,新任務會進入阻塞隊列中(無界的阻塞隊列)。

適用場景:執行長期的任務,性能較好。

只有一個線程的線程池,且線程的存活時間是無限的;當線程繁忙時,對於新任務會進入阻塞隊列中(無界的阻塞隊列)。

適用:一個任務一個任務執行的場景。

創建一個固定大小的線程池,池內的線程存活時間無限,線程池支持定時及周期性的任務執行。如果所有線程均處於繁忙狀態,對於新任務會進入 DelayedWorkQueue 隊列。

適用場景:周期性執行任務的場景。

線程池任務執行流程:

ThreadPoolExecutor類實現了ExecutorService介面和Executor介面。

ThreadPoolExecutor 參數:

線程池中的數量大於corePoolSize,緩沖隊列workQueue滿,並且線程池中的數量等於maximumPoolSize,那麼通過 handler所指定的策略來處理此任務。

拋出java.util.concurrent.RejectedExecutionException異常。

用於被拒絕任務的處理程序,它直接在 execute 方法的調用線程中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務。

丟棄任務隊列中最舊任務。

丟棄當前將要加入隊列的任務。

DelayQueue 是一個支持延時獲取元素的無界阻塞隊列。隊列使用 PriorityQueue 來實現。隊列中的元素必須實現Delayed介面,在創建元素時可以指定多久才能從隊列中獲取當前元素。只有在延遲期滿時才能從隊列中提取元素。

緩存系統的設計:使用DelayQueue保存緩存元素的有效期,使用一個線程循環查詢DelayQueue,一旦能從DelayQueue中獲取元素時,就表示有緩存到期了。

定時任務調度:使用DelayQueue保存當天要執行的任務和執行時間,一旦從DelayQueue中獲取到任務就開始執行,比如Timer就是使用DelayQueue實現的。

以支持優先順序的PriorityQueue無界隊列作為一個容器,因為元素都必須實現Delayed介面,可以根據元素的過期時間來對元素進行排列,因此,先過期的元素會在隊首,每次從隊列里取出來都是最先要過期的元素。如果延遲隊列中的消息到了延遲時間則可以從中取出消息否則無法取出消息也就無法消費。

CyclicBarrier就是一個柵欄,等待所有線程到達後再執行相關的操作。barrier 在釋放等待線程後可以重用。

CountDownLatch 是計數器, 線程完成一個就記一個, 就像 報數一樣, 只不過是遞減的。

而CyclicBarrier更像一個水閘, 線程執行就像水流, 在水閘處都會堵住, 等到水滿(線程到齊)了, 才開始泄流。

Ⅸ 架構高可用高並發系統的設計原則

通過學習《億級流量網站架構核心技術》及《linux就該這么學》學習筆記及自己的感悟:架構設計之高可用高並發系統設計原則,架構設計包括墨菲定律、康威定律和二八定律三大定律,而系統設計包括高並發原則、高可用和業務設計原則等。
架構設計三大定律
墨菲定律 – 任何事沒有表面看起來那麼簡單 – 所有的事都會比預計的時間長 – 可能出錯的事情總會出錯 – 擔心某種事情發生,那麼它就更有可能發生
康威定律 – 系統架構師公司組織架構的反映 – 按照業務閉環進行系統拆分/組織架構劃分,實現閉環、高內聚、低耦合,減少溝通成本 – 如果溝通出現問題,應該考慮進行系統和組織架構的調整 – 適合時機進行系統拆分,不要一開始就吧系統、服務拆分拆的非常細,雖然閉環,但是每個人維護的系統多,維護成本高 – 微服務架構的理論基礎 – 康威定律https://yq.aliyun.com/articles/8611– 每個架構師都應該研究下康威定律http://36kr.com/p/5042735.html
二八定律 – 80%的結果取決於20%的原因
系統設計遵循的原則
1.高並發原則
無狀態
無狀態應用,便於水平擴展
有狀態配置可通過配置中心實現無狀態
實踐: Disconf、Yaconf、Zookpeer、Consul、Confd、Diamond、Xdiamond等
拆分
系統維度:按照系統功能、業務拆分,如購物車,結算,訂單等
功能維度:對系統功能在做細粒度拆分
讀寫維度:根據讀寫比例特徵拆分;讀多,可考慮多級緩存;寫多,可考慮分庫分表
AOP維度: 根據訪問特徵,按照AOP進行拆分,比如商品詳情頁可分為CDN、頁面渲染系統,CDN就是一個AOP系統
模塊維度:對整體代碼結構劃分Web、Service、DAO
服務化
服務化演進: 進程內服務-單機遠程服務-集群手動注冊服務-自動注冊和發現服務-服務的分組、隔離、路由-服務治理
考慮服務分組、隔離、限流、黑白名單、超時、重試機制、路由、故障補償等
實踐:利用Nginx、HaProxy、LVS等實現負載均衡,ZooKeeper、Consul等實現自動注冊和發現服
消息隊列
目的: 服務解耦(一對多消費)、非同步處理、流量削峰緩沖等
大流量緩沖: 犧牲強一致性,保證最終一致性(案例:庫存扣減,現在Redis中做扣減,記錄扣減日誌,通過後台進程將扣減日誌應用到DB)
數據校對: 解決非同步消息機制下消息丟失問題
數據異構
數據異構: 通過消息隊列機制接收數據變更,原子化存儲
數據閉環: 屏蔽多從數據來源,將數據異構存儲,形成閉環
緩存銀彈
用戶層:
DNS緩存
瀏覽器DNS緩存
操作系統DNS緩存
本地DNS服務商緩存
DNS伺服器緩存
客戶端緩存
瀏覽器緩存(Expires、Cache-Control、Last-Modified、Etag)
App客戶緩存(js/css/image…)
代理層:
CDN緩存(一般基於ATS、Varnish、Nginx、Squid等構建,邊緣節點-二級節點-中心節點-源站)
接入層:
Opcache: 緩存PHP的Opcodes
Proxy_cache: 代理緩存,可以存儲到/dev/shm或者SSD
FastCGI Cache
Nginx+Lua+Redis: 業務數據緩存
Nginx為例:
PHP為例:
應用層:
頁面靜態化
業務數據緩存(Redis/Memcached/本地文件等)
消息隊列
數據層:
NoSQL: Redis、Memcache、SSDB等
MySQL: Innodb/MyISAM等Query Cache、Key Cache、Innodb Buffer Size等
系統層:
CPU : L1/L2/L3 Cache/NUMA
內存
磁碟:磁碟本身緩存、dirtyratio/dirtybackground_ratio、陣列卡本身緩存
並發化
2.高可用原則
降級
降級開關集中化管理:將開關配置信息推送到各個應用
可降級的多級讀服務:如服務調用降級為只讀本地緩存
開關前置化:如Nginx+lua(OpenResty)配置降級策略,引流流量;可基於此做灰度策略
業務降級:高並發下,保證核心功能,次要功能可由同步改為非同步策略或屏蔽功能
限流
目的: 防止惡意請求攻擊或超出系統峰值
實踐:
惡意請求流量只訪問到Cache
穿透後端應用的流量使用Nginx的limit處理
惡意IP使用Nginx Deny策略或者iptables拒絕
切流量
目的:屏蔽故障機器
實踐:
DNS: 更改域名解析入口,如DNSPOD可以添加備用IP,正常IP故障時,會自主切換到備用地址;生效實踐較慢
HttpDNS: 為了繞過運營商LocalDNS實現的精準流量調度
LVS/HaProxy/Nginx: 摘除故障節點
可回滾
發布版本失敗時可隨時快速回退到上一個穩定版本
3.業務設計原則
防重設計
冪等設計
流程定義
狀態與狀態機
後台系統操作可反饋
後台系統審批化
文檔注釋
備份
4.總結
先行規劃和設計時有必要的,要對現有問題有方案,對未來有預案;欠下的技術債,遲早都是要還的。
本文作者為網易高級運維工程師

Ⅹ 高並發網站架構的設計方案是怎樣的

技術這玩意兒,你不深入使用它,你就不知道它有多牛,更不知道會有多難!

並發:指定時間段內的請求數!

高並發:指定時間段內的超多請求數!

比如tomcat,單機最大支持並發數為8000左右,redis理論值可達到幾萬!

那麼怎麼設計一套可支持高並發的系統呢?使用技術如下:

1,分布式系統,微服務:使用springcloud家族包括eureka,zuul,feign,hysrix等或者bbo搭建一套微服務框架!

2,前後端分離:使用node.js搭建前端服務系統!

3,靜態化處理:將頁面,後台枚舉,資料庫定義表等使用靜態處理方式做處理!

4,文件伺服器剝離:採用單獨的文件伺服器,防止頁面載入的阻塞!

5,緩存:使用redis,memcache等將運行時數據緩存,代替頻繁的操作資料庫!

6,資料庫:讀寫分離或者分庫分表,採用druid等有性能監控系統的資料庫連接框架!

7,消息中間件:使用xxxmq,kafka等消息中間件,解耦服務,而且非同步處理效率更高!

8,反向代理:使用nginx等負載均衡服務!

9,代碼層:避免大量創建對象,避免阻塞IO,避免多層for循環,避免線程死鎖,避免大量同步!

10,各種優化:包括jvm優化,表結構優化,sql優化,關鍵欄位加索引(注意避免索引失效),連接池優化等等!

11,搜索引擎:sql有大量的like語句,有必要切換成solr等搜索引擎!

12,cdn:使用CDN技術將請求分發到最合適的主機上,避免網路傳輸的延遲!

13,使用batch:增刪改能一次做的別分為兩次,但要注意batch合理設計,防止數據丟失!

14,限流,削峰!

大型網站遇到的挑戰,主要是大量的用戶,高並發的訪問,就算一個簡單的增刪查改的功能,如果面對的是百萬、千萬甚至億級的用戶,都是一件難度很大的事情。

數據從資料庫到瀏覽器的過程:資料庫->應用數據集->內存對象->動態頁面->HTTP伺服器->用戶瀏覽器。 那麼我們可以把高並發的設計分成幾個層次:

前端是指,用戶的請求還沒有到服務前的環節。

系統架構大了,部署的伺服器多了,很多事情不可能通過人工完成了,比如一個介面調用發生了錯誤,不可能人工登錄到伺服器上去查日誌吧,所以這些東西也是必不可少的。

都是說個大概,後面有機會的話,會把每一項都展開詳細說明。

希望我的回答能夠幫助到你!

我們通過這些架構要素來衡量我們整體系統架構設計的優劣,來判斷是否達到了我們的要求。

性能是大型網站架構設計的一個重要方面,任何軟體架構設計方案都必須考慮可能帶來的性能問題,也正因為性能問題幾乎無處不在,在請求鏈路的任何一個環節,都是我們去做極致性能優化方案中的切入點。

衡量一個系統架構設計是否滿足高可用的目標,就是假設系統中任何一台或者多台伺服器宕機時,以及出現各種不可預期的問題時,系統整體是否依然可用。

網站的伸縮性是指不需要改變伺服器的硬體設計,僅僅靠改變應用伺服器的部署數量,就可以擴大或縮小伺服器的處理能力。

網站快速發展,功能不斷擴展,如何設計網站的架構使其能夠快速響應需求變化,是網站可擴展架構的主要目標。

互聯網跟傳統軟體不同,它是開放的,任何人在任何地方都可以訪問網站。網站的安全架構就是保護網站不受惡意訪問和攻擊,保護網站的重要數據不被竊取。

安全性架構,具體來說說就是保證數據的保密性、完整性、真實性、佔有性。

要完全掌握大型網站的架構設計方案,或許你可以點擊我頭像,進入我的專欄"深入大型網站核心架構實戰"。

這期專欄是筆者總結了當下這些互聯網行業中相對成熟且經過大型網站檢驗的技術和方案,內容涵蓋構建大型互聯網系統服務所需的關鍵技術。