成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大型服務端開發(fā)的反模式技巧

開發(fā) 項目管理
本文講述了用線程池執(zhí)行異步任務、日志采用同步模式、沒有超時設置、沒有統(tǒng)計緩存命中率等。

1. 用線程池執(zhí)行異步任務

為了減少阻塞時間,加快響應速度,把無需返回結(jié)果的操作變成異步任務,用線程池來執(zhí)行,這是提高性能的一種手段。

你可能要驚訝了,這么做不對嗎?

首先,我們把異步任務分為兩種:

  • 務必成功執(zhí)行的
  • 不成功就放棄

顯然大多數(shù)時候都是***種。那么當你把任務丟給線程池,你知道它完成了沒有嗎?

如果服務器宕機、升級或重啟,那些尚未完成或還在排隊的任務就丟了。后果是,用戶在促銷活動中搶到的優(yōu)惠券,沒有發(fā)給用戶。更嚴重的后果是,一個訂單在送往倉庫系統(tǒng)的途中消失了。

我推薦的做法是把任務投遞到消息中間件,讓它分發(fā)給消息消費者來執(zhí)行(消費者可能是發(fā)送者自身)。

  • 消息中間件可以要求消費者在完成任務后通知中間件,否則就重新分發(fā)消息,直到收到任務已完成的通知。
  • 如果中間件沒這種功能,可以讓應用要求消費者在完成任務后回發(fā)一個"任務已完成"的消息,但應用不能同步等待這一消息,否則異步就退化為同步了。

更重要的是,消息中間件有持久化功能,即使宕機也不丟消息,而且可以長期不升級、不重啟。消息中間件的缺點是,對失敗情況的處理難以定制化——你可能想定制重試間隔、重試次數(shù)等細節(jié)。

換個角度來看,要解決丟任務的問題,你不一定要用消息中間件。你可以在應用代碼中把任務和完成狀態(tài)保存到數(shù)據(jù)庫中,用線程池執(zhí)行,在完成后更新狀態(tài)。這是不是很像作業(yè)調(diào)度(例如Quartz)呢?是的。

然而,有些任務確實是可有可無的,例如『刷新一個不重要的緩存』的任務,那么就隨便丟到線程池吧。

2. 日志采用同步模式

我們知道,性能瓶頸通常都是I/O,尤其是數(shù)據(jù)庫的I/O。因此我們用了緩存,速度蹬的一下竄上來了——不一定哦。

用緩存把I/O變成了內(nèi)存計算,***瓶頸消除,速度上升一個數(shù)量級。在這個數(shù)量級,一些原本不重要的因素開始產(chǎn)生影響了。

日志是一種I/O啊,雖然順序?qū)懘疟P很快,但還是比內(nèi)存計算要慢啊。更糟的是,一個線程寫日志時,另一個線程必須等它寫完才能接著寫,否則日志會亂,當日志量較大時,就stop the world了。

所以當你的系統(tǒng)性能高到一定程度,就要對日志做性能優(yōu)化了(有過提高3倍QPS的案例),兩個常見辦法:

  • 少打日志
  • 異步模式

今天少打日志,明天排查bug就想哭。所以主要靠異步模式。

Logback可以通過配置(網(wǎng)上搜一搜),在RollingFileAppender上套一個AsyncAppender,實際上就是加了個緩沖隊列,變成了批量寫磁盤。缺點是無法看到***日志(還沒寫磁盤)。queueSize默認是256,即使設為16,也有明顯的性能提升,還緩和了不能及時看到***日志的問題。

Log4j 2的異步模式有更深入的優(yōu)化,是否選用,以測試數(shù)據(jù)為準。

3. 沒有超時設置

網(wǎng)絡忘記設超時,系統(tǒng)隨時可能掛。

每一個網(wǎng)絡操作,都記得設置超時時間,超過這個時間就放棄。訪問分布式緩存也如此。

如果不設超時,可能會等到天荒地老。網(wǎng)絡,就是這么不確定。

4. 沒有統(tǒng)計緩存***率

一個***率低下的緩存,不如沒有。雖然LRU算法很好用,但未必沒有例外情況。頻繁作廢的數(shù)據(jù)、大體積數(shù)據(jù)都可能是負擔。

統(tǒng)計緩存***率的實現(xiàn)辦法可以是內(nèi)存里計數(shù),定期寫到數(shù)據(jù)庫或文件;也可以是把***情況打到日志里,日后匯總統(tǒng)計。也可能有更精巧的實現(xiàn)。

當你的系統(tǒng)進入精耕細作時代,這個問題必然擺上案頭。

5. 沒有統(tǒng)計緩存響應時間

緩存一定快嗎?我真的見過不快的。分布式緩存要經(jīng)由網(wǎng)絡,網(wǎng)絡抖一抖,緩存抖三抖;還依賴運維,運維抖一抖,緩存抖三抖。此事之微妙,不可不察也。

留個心,設個超時,記個響應時間。一個簡單辦法是,當響應時間過長時,打一行日志,正常情況不打日志。這樣既留了記錄,又不產(chǎn)生過多日志。

6. 單一的緩存模式

分布式緩存是由緩存中間件組成的集群,一致性較好,緩存的很快會同步到所有副本。但是畢竟要經(jīng)由網(wǎng)絡,延遲為亞毫秒級,而且負載聚集到中間件,可能因網(wǎng)絡擁塞或機器負載高而出現(xiàn)性能波動。

為了進一步提高部分業(yè)務的性能和穩(wěn)定性,可能要輔以本地緩存。

  • 緩存要有過期策略,如果使用了Guava Cache,可以選擇expireAfterAccess(不常用)、expireAfterWrite或refreshAfterWrite策略:
    expire是先丟棄舊數(shù)據(jù),再從數(shù)據(jù)庫加載新數(shù)據(jù),期間讓數(shù)據(jù)庫承擔壓力,適用于一般情況。
    refresh是在異步加載新數(shù)據(jù)完成前,一直保留舊數(shù)據(jù),能始終為數(shù)據(jù)庫擋住壓力,適用于高壓情況。
  • 各個應用實例的本地緩存是獨立的,舊數(shù)據(jù)的作廢依賴于過期策略。作為改進,可以利用消息隊列,一個實例廣播消息說某數(shù)據(jù)作廢了,其他實例紛紛自檢。這是準實時同步。

緩存的更新方式也影響著性能,@左耳朵耗子 的緩存更新的套路很好地介紹了三種套路,現(xiàn)在我來對比一下:

  • Cache Aside Pattern: 應用程序在數(shù)據(jù)庫和緩存之間周旋,以數(shù)據(jù)庫為準。適合一般情況,因此最常用。
  • Read/Write Through Pattern: 應用只讀寫緩存,緩存同步寫回數(shù)據(jù)庫(同步是指應用等待著寫回完成)。理論性能略高一些。
  • Write Behind Caching Pattern: 應用只讀寫緩存,緩存異步寫回數(shù)據(jù)庫(應用不等待寫回完成,緩存若宕機將丟數(shù)據(jù))。理論性能***,如果有Write Ahead Logging特性,可避免丟數(shù)據(jù),但略為降低性能。

7. 分布式緩存加鎖

有的系統(tǒng)步入精耕細作時代后,想避免一種情況——緩存作廢時,很多應用實例同時訪問數(shù)據(jù)庫,加重負載,而且浪費資源。于是有了給緩存加鎖的方案。

簡單版是每個實例內(nèi)部設鎖,某條數(shù)據(jù)只許一個線程去數(shù)據(jù)庫取。復雜版是把鎖設在分布式緩存中,某條數(shù)據(jù)只許一個實例去數(shù)據(jù)庫取,然后放入緩存讓其他實例用。

復雜版的想法是好的,但注意,鎖要設置超時(還記得我上文說的嗎),否則萬一持有鎖的實例發(fā)生問題,就全體耽誤了。即使設了超時,也可能全體實例一直等待超時,浪費時間。所以這種方案不一定好,需以測試數(shù)據(jù)為準。

8. 疲于奔命

很多公司經(jīng)常加班,實際上效率低下、也不持久,只能復制既有經(jīng)驗,靠不停換人來維持,其后果就是:需求混亂、bug巨多、創(chuàng)新乏力。

要把技術(shù)搞好,需要有條不紊,遇變不亂,持久輸出。疲于奔命的模式,做不好大型服務端開發(fā),也難以做好各種領(lǐng)域的開發(fā)。

責任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2013-03-25 10:08:44

PHPWeb

2010-02-24 15:42:03

WCF服務端安全

2016-11-03 09:59:38

kotlinjavaspring

2016-03-18 09:04:42

swift服務端

2012-03-02 10:38:33

MySQL

2012-04-25 15:11:28

大型服務架構(gòu)

2010-03-19 18:17:17

Java Server

2011-08-08 17:16:53

2024-03-06 14:58:52

客戶端微服務架構(gòu)

2010-08-03 09:59:30

NFS服務

2023-12-22 14:27:30

2015-11-09 17:51:12

服務器端開發(fā)

2021-05-25 08:20:37

編程技能開發(fā)

2016-07-27 14:08:03

構(gòu)架師APPWOT2016

2020-04-27 08:07:16

APP服務端通信安全數(shù)據(jù)安全

2011-08-08 17:11:31

2010-03-18 18:09:36

Java Socket

2021-04-26 13:20:06

Vue服務端渲染前端

2023-08-08 08:17:23

VasDolly服務端參數(shù)

2011-05-24 09:30:26

Findbugs
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 九九99久久 | 日韩在线免费观看视频 | 丁香五月网久久综合 | 日本成人午夜影院 | 青娱乐av | 久久精品高清视频 | 精品国产乱码久久久久久蜜臀 | 日本中出视频 | 国产露脸国语对白在线 | 国产精品一区二区久久精品爱微奶 | 人人射人人 | 一区二区三区国产精品 | 免费在线一区二区 | 一区二区国产精品 | 久久精品久久久久久 | 亚洲精品成人网 | 91麻豆精品国产91久久久久久 | 精品亚洲91 | 亚洲精品丝袜日韩 | 国产视频久久久久 | 在线成人 | 国产伦精品一区二区三区高清 | 日韩在线不卡视频 | 国产a区 | 国产一区二区精品 | 在线高清免费观看视频 | 国产精品国产成人国产三级 | 日韩乱码在线 | 成人影院av | 国产视频一区在线 | 狠狠爱综合 | 一区二区三区亚洲 | 中文字幕av高清 | 国产精品成人av | 一区二区三区在线电影 | 成人综合视频在线观看 | 久久久免费| 韩国av一区二区 | 在线日韩| 国产精品久久久久免费 | 国产成人精品a视频一区www |