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

目錄
2.1 簡(jiǎn)單的PHP架構(gòu)
2.2 多進(jìn)程的框架
2.3 引入?yún)f(xié)程
3.1 實(shí)施DevOps理念
3.2 多線程
3.3、走向k8s
首頁(yè) 電腦教程 電腦知識(shí) Linux高性能網(wǎng)絡(luò)編程十談

Linux高性能網(wǎng)絡(luò)編程十談

Mar 19, 2024 pm 01:00 PM
php 架構(gòu) 網(wǎng)絡(luò)編程 演進(jìn)

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

Linux高性能網(wǎng)絡(luò)編程十談

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

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

有人可能已經(jīng)研究過(guò)相關(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é)論,而是通過(guò)我自己的經(jīng)歷來(lái)探討架構(gòu)的演進(jìn)。

2、從PHP到C++

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

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

Linux高性能網(wǎng)絡(luò)編程十談php架構(gòu)

在當(dāng)前架構(gòu)下單臺(tái)8c8g機(jī)器支持1000qps問(wèn)題不大,所以對(duì)于業(yè)務(wù)當(dāng)前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)過(guò)討論后的目標(biāo)是服務(wù)端高性能,于是開(kāi)始了高性能的探索之旅。

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

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

Linux高性能網(wǎng)絡(luò)編程十談php-server

不過(guò)這里會(huì)面臨一些需要解決的問(wèn)題:

  • 熟悉PHP擴(kuò)展的使用場(chǎng)景,防止踩坑
  • PHP本身使用上的內(nèi)存泄漏問(wèn)題
  • 出現(xiàn)問(wèn)題時(shí)的排查成本,比如一旦出現(xiàn)問(wèn)題,我們有時(shí)候需要去了解PHP源碼,但是面對(duì)幾十萬(wàn)行代碼,這個(gè)成本是相當(dāng)高
  • PHP使用上簡(jiǎn)單,這個(gè)實(shí)際相對(duì)的,隨著Docker的崛起,單機(jī)時(shí)代必然會(huì)過(guò)去,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)過(guò)考慮采用了公司內(nèi)的SPP框架,其架構(gòu)如下:

Linux高性能網(wǎng)絡(luò)編程十談SPP框架架構(gòu)

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

  • proxy進(jìn)程使用handle_init執(zhí)行初始化,handle_route轉(zhuǎn)發(fā)到指定執(zhí)行的worker處理進(jìn)程,handle_input處理請(qǐng)求的入包
  • worker進(jìn)程使用handle_init執(zhí)行初始化,handle_process處理包和業(yè)務(wù)邏輯并返回

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

2.3 引入?yún)f(xié)程

使用C++在性能上已經(jīng)滿足需求,但是在開(kāi)發(fā)效率上卻存在眾多問(wèn)題,比如訪問(wèn)redis,為了保持服務(wù)的高性能,代碼邏輯上都采用異步回調(diào),類似如下:

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

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

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

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

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

Linux高性能網(wǎng)絡(luò)編程十談協(xié)程

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

3、云原生

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

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ù)集成:開(kāi)發(fā)人員一天多次將代碼集成到共享存儲(chǔ)庫(kù)中,并且對(duì)代碼的每個(gè)孤立更改都將立即進(jìn)行測(cè)試,以檢測(cè)并防止集成問(wèn)題
  • 連續(xù)交付:連續(xù)交付(CD)確??梢噪S時(shí)發(fā)布在CI存儲(chǔ)庫(kù)中測(cè)試的每個(gè)版本的代碼
  • 連續(xù)部署:這里包括灰度部署,藍(lán)綠發(fā)布等,目的是快速迭代,經(jīng)過(guò)相對(duì)完整的集成測(cè)試,就可以灰度驗(yàn)證
  • 服務(wù)發(fā)現(xiàn):將服務(wù)作為微服務(wù)化,簡(jiǎn)化服務(wù)之間的調(diào)用
  • RPC的框架:追求高性能的Server框架,也需要考慮限流,熔斷等基礎(chǔ)組件的支持
  • 監(jiān)控系統(tǒng):集成Promethues,OpenTracing等功能,能在敏捷開(kāi)發(fā)流程中快速發(fā)現(xiàn)線上的問(wèn)題
  • 容器化:為了環(huán)境統(tǒng)一,同時(shí)提前考慮云原生場(chǎng)景,容器化是開(kāi)發(fā)過(guò)程中必不可少的

Linux高性能網(wǎng)絡(luò)編程十談DevOps

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

3.2 多線程

基于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ù)配置重復(fù)加載,需要重新適配配置中心
  • 用多進(jìn)程做有狀態(tài)的服務(wù)不是很合理

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

(1)調(diào)研g(shù)RPC

Linux高性能網(wǎng)絡(luò)編程十談gRPC

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

(2)使用tRPC

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

Linux高性能網(wǎng)絡(luò)編程十談

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

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

Linux高性能網(wǎng)絡(luò)編程十談新架構(gòu)

3.3、走向k8s

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

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

怎么辦?…

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

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

以上是Linux高性能網(wǎng)絡(luò)編程十談的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系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脫衣機(jī)

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集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

編寫有效的PHP評(píng)論 編寫有效的PHP評(píng)論 Jul 18, 2025 am 04:44 AM

注釋不能馬虎是因?yàn)樗忉尨a存在的原因而非功能,例如兼容老接口或第三方限制,否則看代碼的人只能靠猜。必須加注釋的地方包括復(fù)雜的條件判斷、特殊的錯(cuò)誤處理邏輯、臨時(shí)繞過(guò)的限制。寫注釋更實(shí)用的方法是根據(jù)場(chǎng)景選擇單行注釋或塊注釋,函數(shù)、類、文件開(kāi)頭用文檔塊注釋說(shuō)明參數(shù)與返回值,并保持注釋更新,對(duì)復(fù)雜邏輯可在前面加一行概括整體意圖,同時(shí)不要用注釋封存代碼而應(yīng)使用版本控制工具。

學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

易于效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

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通過(guò)mod_php,Nginx使用PHP-FPM;4.安裝常用擴(kuò)展:如mysqli、json、mbstring等以支持完整功能。

有效的PHP評(píng)論 有效的PHP評(píng)論 Jul 18, 2025 am 04:33 AM

寫好PHP注釋的關(guān)鍵在于清晰、有用且簡(jiǎn)潔。1.注釋應(yīng)說(shuō)明代碼背后的意圖而非僅描述代碼本身,如解釋復(fù)雜條件判斷的邏輯目的;2.在魔術(shù)值、舊代碼兼容、API接口等關(guān)鍵場(chǎng)景添加注釋以提升可讀性;3.避免重復(fù)代碼內(nèi)容,保持簡(jiǎn)潔具體,并使用標(biāo)準(zhǔn)格式如PHPDoc;4.注釋需與代碼同步更新,確保準(zhǔn)確性。好的注釋應(yīng)站在他人角度思考,降低理解成本,成為代碼的理解導(dǎo)航儀。

掌握PHP塊評(píng)論 掌握PHP塊評(píng)論 Jul 18, 2025 am 04:35 AM

PHPblockcommentsareusefulforwritingmulti-lineexplanations,temporarilydisablingcode,andgeneratingdocumentation.Theyshouldnotbenestedorleftunclosed.BlockcommentshelpindocumentingfunctionswithPHPDoc,whichtoolslikePhpStormuseforauto-completionanderrorche

通過(guò)評(píng)論提高可讀性 通過(guò)評(píng)論提高可讀性 Jul 18, 2025 am 04:46 AM

寫好注釋的關(guān)鍵在于說(shuō)明“為什么”而非僅“做了什么”,提升代碼可讀性。1.注釋應(yīng)解釋邏輯原因,例如值選擇或處理方式背后的考量;2.對(duì)復(fù)雜邏輯使用段落式注釋,概括函數(shù)或算法的整體思路;3.定期維護(hù)注釋確保與代碼一致,避免誤導(dǎo),必要時(shí)刪除過(guò)時(shí)內(nèi)容;4.在審查代碼時(shí)同步檢查注釋,并通過(guò)文檔記錄公共邏輯以減少代碼注釋負(fù)擔(dān)。

PHP開(kāi)關(guān)語(yǔ)句 PHP開(kāi)關(guān)語(yǔ)句 Jul 18, 2025 am 04:49 AM

PHP的switch語(yǔ)句適合處理多個(gè)固定值判斷。1.switch通過(guò)松散比較判斷變量值,結(jié)構(gòu)清晰,適用于用戶角色、請(qǐng)求類型、狀態(tài)機(jī)等場(chǎng)景;2.每個(gè)case后應(yīng)加break避免穿透,但也可利用穿透實(shí)現(xiàn)多個(gè)case共享邏輯;3.default可選但建議添加以處理未匹配情況;4.注意類型匹配問(wèn)題,必要時(shí)需手動(dòng)處理類型一致性。

撰寫PHP評(píng)論的提示 撰寫PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋應(yīng)解釋“為什么”而非“做了什么”,避免冗余或過(guò)于簡(jiǎn)單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說(shuō)明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說(shuō)明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說(shuō)明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問(wèn)題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

See all articles