Hacker News

Aħna interfaced single-threaded C++ ma 'multi-threaded Rust

Aħna interfaced single-threaded C++ ma 'multi-threaded Rust Din l-analiżi komprensiva ta 'interfaced toffri eżami dettaljat tal-komponenti ewlenin tagħha u implikazzjonijiet usa'. Oqsma Ewlenin ta 'Focus Id-diskussjoni tiffoka fuq: Core mech...

8 min read Via antithesis.com

Mewayz Team

Editorial Team

Hacker News
Hawn il-post sħiħ tal-blog SEO:

Aħna Interfaced Single-Threaded C++ b'Multi-Threaded Rust

L-interfaċċjar ta' kodiċi C++ b'ħajt wieħed ma' Rust b'ħafna ħajt mhux biss huwa possibbli — huwa wieħed mill-aktar modi prattiċi biex jiġu mmodernizzati sistemi ta' legacy mingħajr kitba mill-ġdid sħiħa. F'Mewayz, ittrattajna din l-isfida eżatta meta nskala l-OS tan-negozju tagħna ta' 207 moduli biex iservi 138,000 utent, u r-riżultati bidlu b'mod fundamentali kif naħsbu dwar l-interoperabbiltà tas-sistemi.

Għaliex Interfaċċjaw C++ b'ħajt wieħed b'sadid b'ħafna kamini?

Il-biċċa l-kbira tas-sistemi ta' produzzjoni jġorru snin ta' kodiċi C++ ittestjat fil-battalja. Il-kitba mill-ġdid ta 'kollox f'Rut tinstema' attraenti fuq il-karta, iżda tintroduċi riskju kbir u xhur ta' żmien ta 'inġinerija. L-approċċ pragmatiku huwa adozzjoni inkrementali — tgeżwir tal-loġika C++ eżistenti filwaqt li tħoll il-piżijiet ta' xogħol tqal ta' konkorrenza għall-mudell ta' sjieda ta' Rust.

Fil-każ tagħna, il-moduli tal-loġika tan-negozju prinċipali kienu ilhom jaħdmu b'mod affidabbli f'C++ b'ħajt wieħed għal snin. Huma mmaniġġjaw l-ipproċessar tal-kompiti sekwenzjali, il-ġenerazzjoni tad-dokumenti, u l-kalkoli finanzjarji. Iżda hekk kif il-bażi tal-utenti tagħna kibret wara 100K, kellna bżonn ipproċessar parallel tad-dejta, ġestjoni tal-API konkorrenti, u ġestjoni sigura tal-istat kondiviż. Il-karatteristiċi ta' Rust Ibgħat u Sync tawna garanziji ta' konkorrenza fil-ħin tal-kumpilazzjoni li C++ sempliċement ma setax joffri mingħajr verifika manwali estensiva.

Il-motivazzjoni ewlenija hija t-tnaqqis tar-riskju. Int iżżomm dak li jaħdem, u żżid liema skali — mingħajr ma tilgħab il-kodiċi kollu tiegħek fuq migrazzjoni li tista' qatt ma tintemm.

Kif Taħdem Attwalment il-Konfini tal-FFI?

L-Interface tal-Funzjoni Barranija (FFI) bejn C++ u Rust topera permezz ta' firem ta' funzjoni kompatibbli ma' C. Il-blokki esterni "C" ta' Rust jesponu funzjonijiet li C++ jista' jsejjaħ direttament, u viċi versa. L-isfida kritika titfaċċa meta r-runtime b'ħafna ħajt ta' Rust jeħtieġ li jinvoka kodiċi C++ b'ħajt wieħed b'mod sikur.

Isolvejna dan bl-użu ta' arkitettura ddedikata:

  • Eżekutur C++ konfinat f'thread: Is-sejħiet C++ kollha jiġu mgħoddija permezz ta' ħajt dedikat wieħed bl-użu ta' kanal li jgħaddi l-messaġġ, u jiżgura li l-invarjant b'ħajt wieħed qatt ma jinkiser.
  • Saff tal-pont asinkroniku tas-sadid: Il-kompiti ta' Tokio jissottomettu xogħol lill-eżekutur C++ u stenna r-riżultati permezz ta' kanali oneshot, u jżommu n-naħa Rust kompletament asinkronika.
  • Ġestjoni tal-pointer opak: oġġetti C++ huma mgeżwra fi strutturi Rust li jimplimentaw Drop għal tindif deterministiku, li jipprevjeni tnixxijiet tal-memorja tul il-konfini tal-lingwa.
  • Serialization fil-konfini: L-istrutturi tad-dejta kumplessi huma serjalizzati għal FlatBuffers fis-saff FFI, biex jevitaw it-tqabbil fraġli tat-tqassim tal-istruttura u jippermettu evoluzzjoni indipendenti ta' kull naħa.
  • Iżolament ta' paniku: Il-catch_unwind ta' Rust jgħaqqad kull punt tad-dħul tal-FFI sabiex paniku qatt ma jaqsam il-konfini tal-lingwa, li tkun imġieba mhux definita.

Dan il-mudell tana l-produzzjoni ta' Rust b'ħafna kamini bl-affidabbiltà ta' loġika C++ ppruvata — mingħajr kitba mill-ġdid ta' linja waħda tar-regoli tan-negozju oriġinali.

X'Inhuma l-Akbar Nases li Tevita?

L-iżball l-aktar perikoluż huwa li wieħed jassumi li l-kodiċi C++ huwa bla periklu meta ma jkunx. L-istat globali, varjabbli statiċi, u sejħiet tal-libreriji li ma jidħlux mill-ġdid se jikkawżaw tiġrijiet tad-dejta li l-kompilatur ta 'Rust ma jistax jiskopri madwar il-konfini tal-FFI. Il-garanziji tas-sigurtà ta' Rust jieqfu fil-blokk mhux sikur — kollox ġewwa huwa r-responsabbiltà tiegħek.

Għarfien ewlieni: Rust jiggarantixxi s-sigurtà tal-memorja fi ħdan il-kodiċi tiegħu stess, iżda fil-mument li taqsam fruntiera FFI f'C++, tirret kull problema ta' sikurezza tal-ħajt li għandha C++. L-arkitettura madwar dik il-konfini hija importanti aktar mill-kodiċi fuq kull naħa tagħha.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

Tiżvantaġġ komuni ieħor huwa l-ġestjoni tul il-ħajja. Oġġetti C++ ma jipparteċipawx fil-kontroll tas-self ta' Rust. Jekk Rust iwaqqa 'referenza waqt li C++ għadu jżomm pointer, ikollok bugs mingħajr użu ta' wara li huma brutalment diffiċli biex jiġu djanjostikati. Indirizzajna dan billi nforzajna semantika ta' sjieda stretta: l-oġġetti C++ dejjem huma proprjetà ta' tgeżwir Rust wieħed eżatt, u l-aċċess kondiviż jgħaddi permezz ta' referenza bbażata fuq l-Ark fuq in-naħa Rust.

Sejħiet FFI eċċessivi fir-rigward tal-prestazzjoni joħolqu overhead mill-bdil tal-kuntest u s-serialization. Nagħmlu operazzjonijiet ta' lott kull fejn possibbli, billi nibagħtu kju ta' oġġetti tax-xogħol lill-eżekutur C++ aktar milli nagħmlu sejħiet individwali bejn il-lingwi.

Kif Iwettaq Dan l-Approċċ fil-Produzzjoni?

Wara li użajna l-arkitettura ibrida fil-pjattaforma tagħna, kejlna titjib konkret. Ir-rata tat-talba żdied bi 3.4x għal moduli li qabel kienu jfixklu l-ipproċessar sekwenzjali C++. Il-latency tad-denb (p99) naqas b'61% minħabba li l-async runtime ta' Rust seta' jipproċessa talbiet indipendenti fl-istess ħin filwaqt li C++ ittratta kompiti ta' komputazzjoni tqal fuq il-ħajt iddedikat tiegħu.

Iktar importanti minn hekk, kellna żero bugs relatati mal-konkorrenza fl-ewwel sitt xhur tal-produzzjoni. Il-mudell tal-konfinament tal-ħajt għamilha strutturalment impossibbli li l-kodiċi C++ jiġi msejjaħ minn ħjut multipli, filwaqt li s-sistema tat-tip ta 'Rust ipprevjenit tiġrijiet tad-dejta fuq in-naħa tagħha tal-konfini. Dan kien titjib sinifikanti fuq l-approċċ preċedenti tagħna li nippruvaw inżidu threading ma' C++ b'mutexes, li kien ipproduċa tliet inċidenti ta' kundizzjoni ta' razza fi kwart wieħed.

It-tim tal-inġinerija rrapporta wkoll ċikli ta' iterazzjoni aktar mgħaġġla. F'Rut jistgħu jinbnew karatteristiċi ġodda b'appoġġ sħiħ tal-konkorrenza, filwaqt li l-moduli eżistenti C++ komplew jaħdmu mingħajr modifika. Din l-istrateġija inkrementali fissret li qatt ma kellna migrazzjoni ta' "big bang" ta' riskju għoli — biss titjib kostanti u li jista' jitkejjel.

Mistoqsijiet Frekwenti

Jista' Rust isejjaħ libreriji C++ b'ħajt wieħed mingħajr modifika?

Iva, imma trid tiżgura li s-sejħiet kollha lil dik il-librerija jsiru minn linja waħda. Il-mudell standard huwa li jinħoloq ħajt ta 'eżekutur iddedikat li serializes is-sejħiet kollha C++ permezz ta' kanal. Il-kompiti async ta' Rust jissottomettu talbiet u jistennew tweġibiet mingħajr ma jimblukkaw ir-runtime multi-threaded. Il-kodiċi C++ innifsu ma jeħtieġ l-ebda tibdil — ir-restrizzjoni tas-sigurtà hija infurzata kompletament fuq in-naħa Rust.

L-overhead tal-FFI huwa sinifikanti biżżejjed biex jaffettwa l-prestazzjoni tal-applikazzjoni?

Sejħiet FFI individwali għandhom overhead minimu — tipikament taħt 10 nanosekondi għal sejħa funzjoni sempliċi. Madankollu, is-serialization ta 'strutturi ta' data kumplessi u s-sinkronizzazzjoni tal-ħajt fil-konfini jammontaw jekk tagħmel eluf ta 'sejħiet ta' qamħ fin. Operazzjonijiet ta' batching u l-użu ta' formati ta' serialization bla kopja bħal FlatBuffers jew Cap'n Proto iżommu overhead negliġibbli anke fuq skala.

Għandna nerġgħu niktbu l-bażi tal-kodiċi C++ tagħna f'Rut minflok ma ngħaqqdu?

Għall-biċċa l-kbira tat-timijiet, l-interfacing inkrementali huwa t-triq aktar sigura u mgħaġġla. Kitba mill-ġdid sħiħa tintroduċi xhur ta' riskju ta' inġinerija mingħajr ebda valur li jiffaċċja l-utent sakemm jitlesta. L-interfacing iħallik tibgħat titjib immedjatament, tivvalida l-approċċ Rust fil-produzzjoni, u temigra l-moduli wieħed kull darba skont fejn il-konkorrenza tagħti l-aktar impatt. Ikteb mill-ġdid biss il-moduli fejn l-ispiża taż-żamma tal-konfini tal-FFI taqbeż l-ispiża tal-kitba mill-ġdid.


F'Mewayz, aħna nibnu infrastruttura li tiskala — kemm teknikament kif ukoll operazzjonali. L-OS tan-negozju tagħna b'207 modulu jgħin lil 138,000 tim imexxu flussi tax-xogħol aktar intelliġenti li jibdew minn $19/xahar. Kemm jekk qed timmaniġġja proġetti, tawtomatizza l-operazzjonijiet, jew tkabbar in-negozju tiegħek, Mewayz tadatta għall-mod kif taħdem. Ibda l-prova b'xejn tiegħek fuq app.mewayz.com u ara x'jista' jagħmel OS tan-negozju modern għat-tim tiegħek.