建立高併發模型需要考慮的點
(1、能不能通過
增加機群(應用機群,服務機群)的方式去解決?好比一台機器能抗200qps, 然後你就40000qps的業務,那你最少需要200臺機器,如果考慮到有機器down掉的情況,還要加備用伺服器,這個具體加多少臺就得去評估了。 防止出現有機器down掉,還得在每台機器上更新列表的情況,我們最好訪問服務名(類似於網域名稱),這樣的話的好處就是,如果出現有機器down掉的情況,我只需要更新服務名和機器列表的關係表就可以了。
2、能不能把
cdn或者ndn用到我們的系統?假設能用,如何把靜態的、js檔案、html檔案放在使用者最近的乙個節點?
3、使用者大規模連線請求上來的時候,我們如何去均衡使用者的請求(如何把這些請求放到後台的應用機群裡面均衡的做處理)?nginx負載均衡 + 自己設計的負載均衡策略(比如說把ip轉換成整數後,mod取模、hash等)
4、那麼在應用機群內部,應用機群和服務機群之間,如何均衡的處理它的訪問請求?nginx負載均衡 + 自己設計的負載均衡策略(比如說mod取模、hash等)
5、何時應該用
lamp(linux+apache+mysql+php)架構,盜圖一張
6、這裡還有乙個比較關鍵的問題,使用者的登入狀態你怎麼去記錄?使用者的每一次請求,分配處理請求的伺服器可能是不一樣的,它不可能記錄每個人的狀態,那麼這個狀態如何同步?資料庫集群oracle/mysql+非關係型資料庫redis/memcache,
拿mysql和redis來舉例子,
mysql 是關係型資料庫,併發量上限預設是100,想要調整併發效果1)自個可以修改my.ini中的max_connections,但是最大也就能設到 1000 2)用mysql呼叫資料庫時,每次執行語句時,會做乙個臨時變數用來開啟資料庫,所以在用完資料庫後及時關閉mysql臨時變數 3)如果還是解決不了,表被鎖死的現象很嚴重,就需要增加資料庫機群或者用其它併發連線數上限較高的資料庫,比如關係型oracle(貴,公司會不會用不 一定)和非關係型redis和memcache等;
redis 是非關係型資料庫,併發量上限預設是1-2w左右,如果併發量特別大可以考慮用redis來做快取。比如說使用者請求訪問量比較高的新聞網內容或者部落格,可 以用redis來做快取,有使用者請求,就直接給他,如果博主對部落格本身的內容做了更新,更新redis和mysql即可。 但是redis這種非關係型資料庫,雖然併發量比較高,但是缺點也很明顯:1)比較廢記憶體 2)不能像mysql等關係型資料庫那樣能夠處理事務、回滾等 3)沒有1nf,2nf,3nf這種類似的型別,只有key-value,無法處理交易記錄等這種型別的操作。
7、伺服器,就是你的核心服務和資料庫之間,如何去互動?如何平均的分攤壓力?
資料庫集群oracle/mysql+非關係型資料庫redis/memcache
8、防火牆的規則是不是需要調整?高併發訪問來的時候,可以適當的調整
防火牆的規則,防止由於防火牆的故障造成網路擁塞。等高峰期過後,再把防火牆規則調回來。
9、每一層只做一件事,不容易出錯。借鑑網路分層的思想,拿伺服器來說,有專門的應用伺服器,有專門的服務伺服器,有專門的資料庫伺服器等等。在這些伺服器上,可以部署docker這種類似的虛擬機器,每個虛擬機器監聽乙個埠,只做一件事,不容易出錯,還能減少成本。
10、可靠的軟體開發:
1)網頁**大小, 所有靜態頁面、動態查詢頁面的**要盡可能短,盡可能少,以減少對頻寬的需求。盡量頁面大小控制在5k之內。
2)網頁壓縮傳輸應用伺服器的cpu負載增加。
3)網頁程式設計安全, 因為併發量大的時候,防火牆會關閉部分網路攻擊檢測功能,所以在網頁程式設計時做一些必要的防攻擊檢測:
a)防止sql注入式攻擊: 對查詢的sql字串進行
b)防止人工f5重新整理式攻擊:在主頁面、查詢頁面的客戶端**禁止f5按鍵,防止客戶端惡意重新整理。
c)防止人工頻繁開啟頁面重新整理式攻擊:設定cookie,判斷客戶端開啟頁面的時間間隔,低於2秒的認為是人工頻繁開啟頁面重新整理式攻擊。程式控制暫停數秒後,客戶端才能跳到查詢首頁。
d)防止程式自動重新整理式攻擊:檢測http_referer變數,減少程式自動重新整理式攻擊的可能性。
f)
4)後端採用
高併發的關注點
一 引數配置 1 jvm 2 jdbc 資料庫datasource 二 技術設計 1 資料庫訪問 關聯式資料庫 分布式資料庫 檔案系統 2 快取 本地快取 分布式快取 3 多執行緒 執行緒池 本地佇列 4 佇列 三 集群 1 應用伺服器分布式集群 2 資料庫集群 3 分布式快取 四 其他工具 1 n...
TCP的高併發伺服器模型
單客戶端單程序,統一accept 原型介紹 此併發伺服器模型並不預先分叉程序,而是主程序統一處理客戶端的連線,當客戶端的請求到達時,才臨時fork 程序,由子程序處理客戶端請求。利用socket 函式建立套接字,呼叫bind 函式繫結位址,呼叫listen 函式來監聽佇列長度,然後進入主處理過程,等...
三 高併發 LVS的DR模型
網絡卡上有ip和mac位址,網絡卡一加電就會將自己公布出去,別的機器只能知道ip位址邏輯的會走arp協議請求mac位址。linux系統下 proc 是虛擬目錄,開機之後才會有的目錄,裡面放的核心及所有啟動的程序,把裡面的變數及引數抽象成檔案,修改檔案的值相當於改了核心變數引數的值,目錄中的檔案的引數...