国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
#2.1 簡(jiǎn)單的PHP架構(gòu)
2.2 多進(jìn)程的框架
2.3 引進(jìn)協(xié)程
3.1 實(shí)作DevOps理念
3.2 多執(zhí)行緒
3.3、走向k8s
首頁 電腦教學(xué) 電腦知識(shí) Linux高效能網(wǎng)路程式設(shè)計(jì)十談

Linux高效能網(wǎng)路程式設(shè)計(jì)十談

Mar 19, 2024 pm 01:00 PM
php 架構(gòu) 網(wǎng)路程式設(shè)計(jì) 演進(jìn)

《Linux高效能網(wǎng)路程式設(shè)計(jì)十談》十篇技術(shù)部落格已經(jīng)寫完幾個(gè)月了,想著還是寫點(diǎn)總結(jié)來回顧一下這幾年的工作,說來在鵝廠兩次經(jīng)歷加起來也快8年,雖然很多時(shí)候在做螺絲釘?shù)氖虑?,不過細(xì)想自己的高性能架構(gòu)演進(jìn)的經(jīng)歷,從參與,優(yōu)化到最後設(shè)計(jì)架構(gòu),從中還是學(xué)到了很多東西。

Linux高效能網(wǎng)路程式設(shè)計(jì)十談

#1、事先設(shè)計(jì)還是業(yè)務(wù)演進(jìn)?

大家應(yīng)該都經(jīng)歷過專案從0到1的過程,我想提一個(gè)問題:很多時(shí)候的架構(gòu)是隨著業(yè)務(wù)演進(jìn)還是提前設(shè)計(jì)呢?

有人可能已經(jīng)研究過相關(guān)的架構(gòu)書籍,這些書籍大多認(rèn)為架構(gòu)是隨著業(yè)務(wù)發(fā)展而演變的。然而,也有許多架構(gòu)師堅(jiān)持認(rèn)為架構(gòu)應(yīng)該提前設(shè)計(jì)。在此,我暫時(shí)不做結(jié)論,而是透過我自己的經(jīng)驗(yàn)來探討架構(gòu)的演進(jìn)。

2、從PHP到C

#2.1 簡(jiǎn)單的PHP架構(gòu)

PHP作為一門簡(jiǎn)單便捷的語言,在大廠各部門應(yīng)該都有身影,當(dāng)時(shí)我工作用的兩種語言:C 和PHP,使用PHP開發(fā)功能很快,而且有很多成熟的庫,因此組成了經(jīng)典的nginx
php-fpm memcache架構(gòu)。

Linux高效能網(wǎng)路程式設(shè)計(jì)十談php架構(gòu)

在目前架構(gòu)下單一8c8g機(jī)器支援1000qps問題不大,所以對(duì)於業(yè)務(wù)目前1wqps都不到,顯然多堆幾臺(tái)機(jī)器就可以支援了。對(duì)於快取層的設(shè)計(jì),在redis還不是發(fā)展很好的情況下,memcache是??當(dāng)時(shí)快取元件的主流,而且對(duì)於業(yè)務(wù)和對(duì)接PHP簡(jiǎn)單。但隨著業(yè)務(wù)的發(fā)展,按照當(dāng)時(shí)計(jì)算曲線可能一年以內(nèi)會(huì)到5wqps,用nginx
php-fpm memcache架構(gòu)是不是合理?經(jīng)過討論後的目標(biāo)是服務(wù)端高性能,於是開始了高性能的探索之旅。

2.2 多進(jìn)程的框架

在當(dāng)時(shí),為了實(shí)現(xiàn)高效能服務(wù)端框架,人們嘗試了一些方案,其中之一是利用PHP外掛功能將Server的功能整合到腳本語言中。這種方法在一定程度上實(shí)現(xiàn)了高效能的目標(biāo)。例如,現(xiàn)在PHP的swoole就是這種方法的一個(gè)發(fā)展結(jié)果。

Linux高效能網(wǎng)路程式設(shè)計(jì)十談php-server

不過這裡會(huì)面臨一些需要解決的問題:

  • 熟悉PHP擴(kuò)充的使用場(chǎng)景,防止踩坑
  • PHP本身使用上的記憶體洩漏問題
  • 出現(xiàn)問題時(shí)的檢查成本,例如一旦出現(xiàn)問題,我們有時(shí)候需要去了解PHP源碼,但是面對(duì)幾十萬行程式碼,這個(gè)成本是相當(dāng)高
  • PHP使用上簡(jiǎn)單,這個(gè)實(shí)際相對(duì)的,隨著Docker的崛起,單機(jī)時(shí)代必然會(huì)過去,PHP的生態(tài)是不是能支持

基於上述思考與對(duì)業(yè)務(wù)發(fā)展的分析,其實(shí)我們自己實(shí)現(xiàn)一個(gè)或使用現(xiàn)有的C 框架實(shí)現(xiàn)一套業(yè)務(wù)層的Server應(yīng)該更合理,於是經(jīng)過考慮採用了公司內(nèi)的SPP框架,其架構(gòu)如下:

Linux高效能網(wǎng)路程式設(shè)計(jì)十談SPP框架架構(gòu)

可以看出SPP是多進(jìn)程架構(gòu),其架構(gòu)類似Nginx,分為Proxy進(jìn)程和Worker進(jìn)程,其中:

  • proxy程序使用handle_init執(zhí)行初始化,handle_route轉(zhuǎn)送到指定執(zhí)行的worker處理程序,handle_input處理請(qǐng)求的入包
  • worker程序使用handle_init執(zhí)行初始化,handle_process處理套件和業(yè)務(wù)邏輯並傳回

使用C 的架構(gòu)後,單機(jī)效能直接提升到6kqps,基本上已經(jīng)滿足效能上的要求,可以在相同的機(jī)器下支援更多的業(yè)務(wù),看似已經(jīng)可以將架構(gòu)穩(wěn)定下來了。

2.3 引進(jìn)協(xié)程

使用C 在效能上已經(jīng)滿足需求,但是在開發(fā)效率上卻存在眾多問題,例如存取redis,為了保持服務(wù)的高效能,程式碼邏輯上都採用非同步回調(diào),類似如下:

...
int ret = redis->GetString(k, getValueCallback)
...

其中g(shù)etValueCallback就是回呼函數(shù),如果出現(xiàn)很多io操作,這裡回調(diào)就會(huì)非常麻煩,即使封裝為類似同步方式,在處理上也非常麻煩,當(dāng)時(shí)還沒有引入std::future和std::async。

另一方面基於後續(xù)的qps可能到10~20w量級(jí),協(xié)程在多io的服務(wù)處理的性能上也會(huì)更有優(yōu)勢(shì),於是開始了協(xié)程方式改造,將io的地方全部替換為協(xié)程調(diào)用,對(duì)於業(yè)務(wù)開發(fā)來說,程式碼上就變成了這樣:

...
int ret = redis->GetString(k, value)
...

其中value就是可以直接用的回傳值,一旦程式碼中有io的地方,底層就會(huì)將io替換為協(xié)程的API,這樣阻塞的io操作就全部變成同步化原語,程式碼結(jié)構(gòu)和開發(fā)效率都提升不少(具體的協(xié)程實(shí)作可以參考系列文章的《Linux高效能網(wǎng)頁程式設(shè)計(jì)十談|協(xié)程》)。

Linux高效能網(wǎng)路程式設(shè)計(jì)十談協(xié)程

從架構(gòu)上還是沒有太多變化,多進(jìn)程 協(xié)程的方式,支援著業(yè)務(wù)發(fā)展幾年時(shí)間,雖然性能上沒有指數(shù)增長(zhǎng),但是對(duì)於高性能探索和沈澱上已經(jīng)有了更多經(jīng)驗(yàn)。

3、雲(yún)端原生

#業(yè)務(wù)繼續(xù)發(fā)展,而工程師總是在追求最前沿的理念,雲(yún)原生作為最近這幾年熱門的技術(shù)點(diǎn)自然不會(huì)放過,但是在進(jìn)入雲(yún)原生之前,如果你的團(tuán)隊(duì)沒有DevOps開發(fā)理念,這將是一個(gè)痛苦的過程,需要對(duì)架構(gòu)設(shè)計(jì)和框架選擇償還技術(shù)債務(wù)。

3.1 實(shí)作DevOps理念

以前做架構(gòu)考慮高效能,隨著對(duì)於架構(gòu)的理解,發(fā)現(xiàn)高效能只是架構(gòu)設(shè)計(jì)的一個(gè)小領(lǐng)域,要做好一個(gè)架構(gòu),需要更多的敏捷流程和服務(wù)治理概念,具體考慮的點(diǎn)總結(jié)如下:

  • 持續(xù)整合:開發(fā)人員一天多次將程式碼整合到共享儲(chǔ)存庫中,並且對(duì)程式碼的每個(gè)孤立變更都將立即進(jìn)行測(cè)試,以檢測(cè)並防止整合問題
  • 連續(xù)交付:連續(xù)交付(CD)確保可以隨時(shí)發(fā)佈在CI儲(chǔ)存庫中測(cè)試的每個(gè)版本的程式碼
  • 連續(xù)部署:這裡包括灰階部署,藍(lán)綠發(fā)布等,目的是快速迭代,經(jīng)過相對(duì)完整的整合測(cè)試,就可以灰階驗(yàn)證
  • 服務(wù)發(fā)現(xiàn):將服務(wù)視為微服務(wù)化,簡(jiǎn)化服務(wù)之間的呼叫
  • RPC的框架:追求高效能的Server框架,也需要考慮限流,熔斷等基礎(chǔ)元件的支援
  • 監(jiān)控系統(tǒng):整合Promethues,OpenTracing等功能,能在敏捷開發(fā)流程中快速發(fā)現(xiàn)線上的問題
  • 容器化:為了環(huán)境統(tǒng)一,同時(shí)事先考慮雲(yún)端原生場(chǎng)景,容器化是開發(fā)過程中不可或缺的

Linux高效能網(wǎng)路程式設(shè)計(jì)十談DevOps

到這裡會(huì)發(fā)現(xiàn),簡(jiǎn)單的高效能Server已經(jīng)作為架構(gòu)追求的目標(biāo)了,於是需要重新研究並設(shè)計(jì)架構(gòu),以順利實(shí)施DevOps的理念。

3.2 多執(zhí)行緒

基於DevOps,結(jié)合上面的C 的Server框架,發(fā)現(xiàn)多進(jìn)程已經(jīng)無法滿足架構(gòu)的需求,原因如下:

  • 多進(jìn)程與Docker容器的單一進(jìn)程理念不符
  • 工作進(jìn)程負(fù)載不均,如何更利用多核心
  • 與監(jiān)控系統(tǒng)有效的對(duì)接
  • 業(yè)務(wù)配置重複加載,需要重新適配配置中心
  • 用多進(jìn)程做有狀態(tài)的服務(wù)不是很合理

業(yè)務(wù)也發(fā)展到百萬QPS,為了更好的服務(wù)治理和服務(wù)呼叫成本,不得不考慮另外的架構(gòu):

(1)調(diào)查gRPC

Linux高效能網(wǎng)路程式設(shè)計(jì)十談gRPC

gRPC是多執(zhí)行緒RPC
Server,有成熟的生態(tài),各種中間件,支援多語言等,對(duì)於從0到1開發(fā)的業(yè)務(wù)是一個(gè)不錯(cuò)的選擇,但是對(duì)於業(yè)務(wù)遷移卻面臨挑戰(zhàn),例如開發(fā)自己的中間件適配服務(wù)發(fā)現(xiàn),配置中心等,改造協(xié)議按照自定義編解碼,如何結(jié)合協(xié)程等,因此對(duì)於部分業(yè)務(wù)滿足,但是還需要更好的結(jié)合公司內(nèi)組件的RPC
Server。

(2)使用tRPC

剛好公司內(nèi)正在開發(fā)tRPC,經(jīng)過研究發(fā)現(xiàn)基本滿足需求,於是在tRPC的C 版本剛發(fā)展初期就嘗試適配我們的系統(tǒng),經(jīng)過一系列的改造,高性能的RPC框架在業(yè)務(wù)系統(tǒng)中遷移和使用了,其中tRPC的架構(gòu):

Linux高效能網(wǎng)路程式設(shè)計(jì)十談

#https://trpc.group/zh/docs/what-is-trpc/archtecture_design/

基於上述的考量與業(yè)務(wù)的發(fā)展,於是開始嘗試以高效能為基礎(chǔ),將RPC Server框架統(tǒng)一,以適配後續(xù)RPC多樣化場(chǎng)景,於是實(shí)現(xiàn)一套適配我們的業(yè)務(wù)系統(tǒng)的RPC
Server的基本框架:

Linux高效能網(wǎng)路程式設(shè)計(jì)十談新架構(gòu)

3.3、走向k8s

經(jīng)歷了上述選型和改造後,我們的服務(wù)在遷移k8s過程中,按部就班對(duì)接就可以了,服務(wù)不需要經(jīng)過太多的改造可以在其平臺(tái)上運(yùn)行,對(duì)接的各個(gè)平臺(tái)也是可以完整的支持。

看似去追求更新的技術(shù)等著下一個(gè)風(fēng)口就可以了?實(shí)際這個(gè)時(shí)候反而挑戰(zhàn)更多了,由於在雲(yún)上的便捷和遷移服務(wù)架構(gòu)的無序擴(kuò)張,導(dǎo)致業(yè)務(wù)服務(wù)和邏輯層次越來越多,同時(shí)一個(gè)服務(wù)依賴的下游鏈路越來越長(zhǎng),雖然我們的框架支援鏈路跟蹤,但是鏈路越長(zhǎng),對(duì)服務(wù)的可控性和穩(wěn)定性就越來越差,反而浪費(fèi)更多的人力支持日常ops。

怎麼辦?…

是不是要合併業(yè)務(wù)邏輯,將架構(gòu)簡(jiǎn)化?這裡面臨的問題是業(yè)務(wù)邏輯複雜情況下往往週期很長(zhǎng),而且從成本角度考慮比較高,收益並不會(huì)很大

是不是重新開發(fā)的新的架構(gòu),將腐朽的保持原樣或拋棄,使用新的架構(gòu)來適配下一步的發(fā)展。

以上是Linux高效能網(wǎng)路程式設(shè)計(jì)十談的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

用評(píng)論記錄PHP 用評(píng)論記錄PHP Jul 18, 2025 am 04:34 AM

寫PHP註釋應(yīng)明確用途、邏輯與結(jié)構(gòu)。 1.每個(gè)函數(shù)和類使用DocBlock格式說明作用、參數(shù)及返回值;2.在關(guān)鍵邏輯處解釋“為什麼”而非僅“做了什麼”;3.文件頂部添加簡(jiǎn)要說明,包括功能、依賴與使用場(chǎng)景;4.避免廢話型註釋,僅在復(fù)雜邏輯前添加必要說明,不記錄修改歷史。這樣做提升代碼可讀性與維護(hù)效率。

寫乾淨(jìng)的PHP評(píng)論 寫乾淨(jìng)的PHP評(píng)論 Jul 18, 2025 am 04:36 AM

註釋應(yīng)說明“為什麼”而非“做了什麼”,如解釋業(yè)務(wù)原因而非重複代碼操作;2.在復(fù)雜邏輯前加總覽性註釋,簡(jiǎn)要說明流程步驟,幫助建立整體印象;3.給“奇怪”代碼加註釋,解釋非常規(guī)寫法的意圖,避免誤解為bug;4.註釋格式建議簡(jiǎn)潔為主,單行用//,函數(shù)/類用/*.../,保持統(tǒng)一風(fēng)格;5.避免註釋與代碼不同步、註釋過長(zhǎng)或註釋掉代碼未刪除等問題,確保註釋真正提升代碼可讀性和維護(hù)性。

PHP控制結(jié)構(gòu):如果/其他 PHP控制結(jié)構(gòu):如果/其他 Jul 18, 2025 am 04:02 AM

在PHP中使用if/else控制結(jié)構(gòu)進(jìn)行條件判斷時(shí),應(yīng)遵循以下要點(diǎn):1.在需要根據(jù)條件執(zhí)行不同代碼塊時(shí)使用if/else;2.條件為真執(zhí)行if分支,為假進(jìn)入else或elseif;3.多條件判斷時(shí)elseif應(yīng)按邏輯順序排列,範(fàn)圍大的放前面;4.避免嵌套過深,建議三層以上考慮switch或重構(gòu);5.始終使用花括號(hào){}提高可讀性;6.注意布爾值轉(zhuǎn)換問題,防止類型誤判;7.簡(jiǎn)單條件可用三元運(yùn)算符簡(jiǎn)化代碼;8.合併重複判斷減少冗餘;9.測(cè)試邊界值確保邏輯完整。掌握這些技巧有助於提升代碼質(zhì)量與穩(wěn)定性。

使用PHP字符串 使用PHP字符串 Jul 18, 2025 am 04:10 AM

PHP字符串處理需掌握核心函數(shù)及場(chǎng)景。 1.拼接用點(diǎn)號(hào)或.=,大量拼接推薦數(shù)組 implode;2.查找用strpos(),替換用str_replace(),注意區(qū)分大小寫及正則使用條件;3.截取用substr(),格式化用sprintf();4.輸出HTML用htmlspecialchars(),數(shù)據(jù)庫操作用參數(shù)化查詢。熟悉這些函數(shù)行為可應(yīng)對(duì)多數(shù)開發(fā)場(chǎng)景。

我為什麼在PHP中獲得未定義的索引 我為什麼在PHP中獲得未定義的索引 Jul 18, 2025 am 04:12 AM

出現(xiàn)“undefinedindex”錯(cuò)誤是因?yàn)閲L試訪問了數(shù)組中不存在的鍵。要解決這個(gè)問題,首先要確認(rèn)數(shù)組鍵是否存在,可使用isset()或array_key_exists()函數(shù)檢查;其次確保表單數(shù)據(jù)正確提交,包括驗(yàn)證請(qǐng)求方法和字段存在性;第三注意鍵名的大小寫敏感,避免拼寫錯(cuò)誤;最後在使用$_SESSION、$_COOKIE等超全局?jǐn)?shù)組時(shí)也應(yīng)先檢查鍵是否存在,以避免錯(cuò)誤發(fā)生。

PHP評(píng)論和語法 PHP評(píng)論和語法 Jul 18, 2025 am 04:19 AM

正確使用PHP註釋的方法有兩種:?jiǎn)涡性]釋用//或#,多行註釋用/.../。 PHP語法需注意每條語句以分號(hào)結(jié)尾、變量名前加$且區(qū)分大小寫、字符串拼接用點(diǎn)(.)、保持良好縮進(jìn)提升可讀性。 PHP標(biāo)籤規(guī)範(fàn)為使用,避免多餘空白問題。掌握這些基礎(chǔ)但關(guān)鍵的細(xì)節(jié)有助於提升代碼質(zhì)量與協(xié)作效率。

PHP設(shè)置的簡(jiǎn)單指南 PHP設(shè)置的簡(jiǎn)單指南 Jul 18, 2025 am 04:25 AM

PHP設(shè)置的關(guān)鍵在於明確安裝方式、配置php.ini、連接Web服務(wù)器及啟用必要擴(kuò)展。 1.安裝PHP:Linux用apt、Mac用Homebrew、Windows推薦XAMPP;2.配置php.ini:調(diào)整錯(cuò)誤報(bào)告、上傳限制等並重啟服務(wù)器;3.搭配Web服務(wù)器:Apache通過mod_php,Nginx使用PHP-FPM;4.安裝常用擴(kuò)展:如mysqli、json、mbstring等以支持完整功能。

團(tuán)隊(duì)的PHP評(píng)論 團(tuán)隊(duì)的PHP評(píng)論 Jul 18, 2025 am 04:28 AM

寫好PHP註釋的關(guān)鍵在於解釋“為什麼”而非“做什麼”,統(tǒng)一團(tuán)隊(duì)註釋風(fēng)格,避免重複代碼式註釋,合理使用TODO和FIXME標(biāo)記。 1.註釋應(yīng)重點(diǎn)說明代碼背後的邏輯原因,如性能優(yōu)化、算法選擇等;2.團(tuán)隊(duì)需統(tǒng)一註釋規(guī)範(fàn),如單行註釋用//,函數(shù)類用docblock格式,並包含@author、@since等標(biāo)籤;3.避免僅複述代碼內(nèi)容的無意義註釋,應(yīng)補(bǔ)充業(yè)務(wù)含義;4.使用TODO和FIXME標(biāo)記待辦事項(xiàng),並可配合工具追蹤,確保註釋與代碼同步更新,提升項(xiàng)目可維護(hù)性。

See all articles