
Go-ից Rust անցում․ ինչ է իրականում փոխվում backend թիմերի համար
corrode.dev-ը հրապարակել է backend-ի վրա կենտրոնացած ուղեցույց ծառայությունները Go-ից Rust տեղափոխելու մասին։ Հիմնական փաստարկը․ հարցը ոչ թե Rust-ի արագությունն է, այլ կոմպիլյատորի տված երաշխիքները, runtime-ի վարքը և մշակողի էրգոնոմիկան։
corrode.dev-ը հրապարակել է backend-ի վրա կենտրոնացած ուղեցույց ծառայությունները Go-ից Rust տեղափոխելու մասին։ Դրա հիմնական փաստարկն այն է, որ հարցը ոչ թե Rust-ի արագությունն է — Go-ն արդեն բավական արագ է — այլ կոմպիլյատորի տված երաշխիքները։ Իրականում փոխվում են կոռեկտության երաշխիքները, runtime-ի վարքը և մշակողի էրգոնոմիկան։
Ինչ է փոխվում գործնականում
Գործիքների հավաքածուն գրեթե մեկը մեկին համընկնում է․ cargo build, run, fmt, test և doc անում են նույնը, ինչ Go-ի համապատասխան հրամանները։ Իսկական փոփոխությունը ստուգումների տեղն է։ nil-ի մշակումը, սխալների տարածումը, տվյալների մրցարշավները և ռեսուրսների կյանքի տևողությունը կոնվենցիաներից անցնում են տիպերի համակարգ․ Option-ը և Result-ը փոխարինում են nil-ի ստուգմանը և if err != nil-ին, իսկ փոփոխվող վիճակի փոխանակումը թելերի միջև պահանջում է Send և Sync տիպեր։ Թելերի միջև համօգտագործվող սովորական hash աղյուսակը չի կոմպիլվում․ այն պետք է փաթաթել կողպված տիպի մեջ կամ փոխարինել ալիքով։
Ինչու են թիմերը դիտարկում անցումը
Ուղեցույցը թվարկում է Go ծառայություններում կուտակվող ցավոտ կետերը․ սխալների բազմախոս մշակումը, nil ցուցիչի պատճառով պանիկայի ռիսկը և runtime-ի մրցարշավների դետեկտորի սահմանափակումները․ go test -race-ը գտնում է միայն այն մրցարշավները, որոնք թեստերի ժամանակ իրականում կատարվում են, մինչդեռ առանց կողպեքի փոփոխվող map-ը կոմպիլվում է ու ընկնում ծանրաբեռնվածության տակ։ InfluxData-ի հիմնադիր և CTO Փոլ Դիքսը մեջբերվում է այն մասին, թե ինչ տվեց իր թիմին InfluxDB-ի Go-ից Rust վերագրումը․ «անվախ զուգահեռականություն՝ վերացնելով տվյալների մրցարշավները, որոնք նախկինում ունեինք»։
Անցում առանց վերագրման
Առաջարկվող ուղին աստիճանական է, ոչ թե ամբողջական վերագրում․ առանձնացրեք մեկ թեժ ուղի կամ ֆոնային պրոցես նույն API պայմանագրի հետևում, կամ API-դարպասի հետևում strangler պատերնով առանձին endpoint-ները ուղղեք նոր Rust ծառայության։ Սկսեք հստակ սահմաններ և փոքր ազդեցության շրջանակ ունեցող ծառայությունից, պահպանեք ուղիները, JSON կառուցվածքը և սխալների ձևաչափը անփոփոխ և խուսափեք Go-ի ոճով գրված Rust-ից․ մեկ մեթոդով ինտերֆեյսները սովորաբար դառնում են generic-ի trait-ի սահմանափակում։ Ուսուցումը պետք է լինի վաղ և իրական կոդի վրա, քանի որ Rust-ի կոմպիլյացիայի ժամանակը իսկապես ավելի վատ է, քան Go-ինը։
Ինչ են ստանում թիմերը և որտեղ է մնում Go-ն
Սպասվող շահույթը ներկայացված է մոտավոր թվերով, ոչ խոստումներով․ CPU-ի սպառումը 20–40%-ով պակաս, հիշողությունը՝ 30–50%-ով, p99 ուշացումը՝ ավելի կայուն ծանրաբեռնվածության տակ, իսկ production-ի միջադեպերը՝ զգալիորեն քիչ, քանի որ go test -race-ը վերապրած սխալները — տվյալների մրցարշավներ, nil-ի դերեֆերենսավորում, բաց թողնված սխալի ուղիներ — Rust-ում չեն կոմպիլվում։ Տասնապատիկ թողունակության աճ խոստացված չէ։ Նույն հստակությամբ ասվում է, թե ինչ պետք է մնա Go-ում․ Kubernetes-ի օպերատորներն ու կոնտրոլերները, CLI և մշակողի գործիքները, ինչպես նաև բարակ API և ձևաչափերի փոխարկման ծառայությունները։ Canonical-ի ինժեներիայի փոխնախագահ Ջոն Սիգերը մեջբերվում է․ Go-ն մնում է «շատ լավ ընտրություն ցանցային ծառայությունների համար»։ Շատ թիմեր գալիս են բազմալեզու backend-ի․ Go՝ ձանձրալի ծառայությունների համար, Rust՝ այնտեղ, որտեղ հուսալիությունն ու արտադրողականությունը արդարացնում են լրացուցիչ ջանքը։
SiTech — AI-ով հզորացված վեբ մշակում
Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։