Hacker News

Повезали смо једнонитни Ц++ са вишенитним Рустом

Повезали смо једнонитни Ц++ са вишенитним Рустом Ова свеобухватна анализа повезаног нуди детаљно испитивање његових кључних компоненти и ширих импликација. Кључне области фокуса Дискусија се фокусира на: Основни механизам...

1 min read Via antithesis.com

Mewayz Team

Editorial Team

Hacker News
Ево комплетног СЕО блог поста: <х1>Увезали смо једнонитни Ц++ са вишенитним Руст-ом <п>Повезивање једнонитног Ц++ кода са вишенитним Руст-ом није само могуће – то је један од најпрактичнијих начина да се модернизују стари системи без потпуног поновног писања. У Меваизу смо се ухватили у коштац са овим изазовом када смо скалирали наш пословни ОС са 207 модула да опслужује 138.000 корисника, а резултати су суштински променили начин на који размишљамо о интероперабилности система. <х2>Зашто бисте повезивали једнонитни Ц++ са вишенитним Руст-ом? <п>Већина производних система носи годинама тестиран Ц++ код. Преписивање свега у Русту звучи привлачно на папиру, али уводи огроман ризик и месецима инжењерског времена. Прагматичан приступ је постепено усвајање — умотавање постојеће логике Ц++-а док се радна оптерећења која су велика истовременост пребацују на Руст-ов модел власништва. <п>У нашем случају, модули основне пословне логике су годинама поуздано радили у једнонитном Ц++. Они су се бавили секвенцијалном обрадом задатака, генерисањем докумената и финансијским прорачунима. Али како је наша корисничка база порасла преко 100.000, била нам је потребна паралелна обрада података, истовремено руковање АПИ-јем и безбедно управљање дељеним стањем. Рустове особине <цоде>Сенд и <цоде>Синц дале су нам гаранције истовремености у времену превођења које Ц++ једноставно не би могао да понуди без опсежне ручне ревизије. <п>Кључна мотивација је смањење ризика. Задржавате оно што функционише, а додајете оно што се мери — без коцкања целе базе кода са миграцијом која се можда никада неће завршити. <х2>Како ФФИ граница заправо функционише? <п>Интерфејс страних функција (ФФИ) између Ц++ и Руст-а функционише преко потписа функција компатибилних са Ц. Рустови <цоде>екстерни "Ц" блокови откривају функције које Ц++ може директно позвати и обрнуто. Критични изазов се појављује када Руст-ово вишенитно време извођења треба да безбедно позове једнонитни Ц++ код. <п>Ово смо решили коришћењем наменске архитектуре: <ул> <ли><стронг>Извршитељ Ц++ ограничен на нит: Сви Ц++ позиви се воде кроз једну наменску нит користећи канал за прослеђивање порука, обезбеђујући да се непроменљива са једним навојем никада не крши. <ли><стронг>Руст асинц бридге слој: Токио задаци шаљу посао Ц++ извршиоцу и <цоде>чекају резултате кроз једнократне канале, држећи Руст страну потпуно асинхроном. <ли><стронг>Непрозирно управљање показивачем: Ц++ објекти су умотани у Руст структуре које имплементирају <цоде>Дроп за детерминистичко чишћење, спречавајући цурење меморије преко границе језика. <ли><стронг>Серијализација на граници: Сложене структуре података се серијализују у ФлатБуфферс на ФФИ слоју, избегавајући крхко подударање распореда структура и омогућавајући независну еволуцију сваке стране. <ли><стронг>Изолација панике: Руст-ов <цоде>цатцх_унвинд обавија сваку ФФИ улазну тачку тако да паника никада не пређе језичку границу, што би било недефинисано понашање. <п>Овај образац нам је дао пропусност Руст-а са више нити са поузданошћу доказане Ц++ логике — без поновног писања ниједног реда оригиналних пословних правила. <х2>Које су највеће замке које треба избегавати? <п>Најопаснија грешка је претпоставка да је Ц++ код безбедан нити када није. Глобално стање, статичке варијабле и библиотечки позиви који се не враћају узроковаће трке података које Руст-ов компајлер не може да открије преко границе ФФИ. Руст-ове безбедносне гаранције се заустављају у блоку <цоде>небезбедно — све унутра је ваша одговорност. <блоцккуоте> <п><стронг>Кључни увид: Руст гарантује безбедност меморије унутар сопственог кода, али у тренутку када пређете ФФИ границу у Ц++, наслеђујете сваки проблем безбедности нити који Ц++ има. Архитектура око те границе важнија је од кода са обе стране. <п>Још једна уобичајена замка је управљање животним временом. Ц++ објекти не учествују у Руст-овом провери задуживања. Ако Руст одбаци референцу док Ц++ још увек држи показивач, добићете грешке које се не користе након употребе које је брутално тешко дијагностиковати. Ово смо решили тако што смо применили строгу семантику власништва: Ц++ објекти су увек у власништву тачно једног Руст омотача, а дељени приступ иде кроз рачунање референци засновано на Арц-у на страни Руст-а.<п>У погледу перформанси, прекомерни ФФИ позиви стварају додатне трошкове због промене контекста и серијализације. Групнирамо операције где год је то могуће, шаљући ред радних ставки Ц++ извршиоцу уместо да упућујемо појединачне позиве на више језика. <х2>Како се овај приступ показао у производњи? <п>Након примене хибридне архитектуре на нашој платформи, измерили смо конкретна побољшања. Пропусност захтева је повећана за 3,4к за модуле који су претходно имали уско грло у секвенцијалној Ц++ обради. Кашњење у репу (п99) је пало за 61% зато што је Руст-ово асинхронизовано време извршавања могло истовремено да обрађује независне захтеве док је Ц++ управљао задацима који су тешке за рачунање на својој наменској нити. <п>Што је још важније, имали смо нула грешака у вези са паралелношћу у првих шест месеци производње. Образац ограничавања нити је структурно онемогућио позивање Ц++ кода из више нити, док је Рустов систем типова спречио трке података на његовој страни границе. Ово је било значајно побољшање у односу на наш претходни приступ покушаја додавања нити у Ц++ са мутексима, што је произвело три инцидента са условима трке у једном тромесечју. <п>Инжењерски тим је такође известио о бржим циклусима итерације. Нове функције би могле да се уграде у Руст са пуном подршком за паралелност, док су постојећи Ц++ модули наставили да раде без модификација. Ова постепена стратегија је значила да никада нисмо имали високо ризичну миграцију „великог праска“ – само постојано, мерљиво побољшање. <х2>Честа питања <х3>Може ли Руст позвати једнонитне Ц++ библиотеке без модификација? <п>Да, али морате осигурати да се сви позиви тој библиотеци одвијају из једне нити. Стандардни образац је креирање наменске извршне нити која серијализује све Ц++ позиве кроз канал. Руст-ови асинхронизовани задаци шаљу захтеве и чекају одговоре без блокирања вишенитног времена извођења. Сам Ц++ код не захтева промене — безбедносно ограничење је у потпуности примењено на страни Руста. <х3>Да ли су трошкови ФФИ довољно значајни да утичу на перформансе апликације? <п>Појединачни ФФИ позиви имају минималне трошкове — обично испод 10 наносекунди за једноставан позив функције. Међутим, серијализација сложених структура података и синхронизација нити на граници се збрајају ако направите хиљаде детаљних позива. Групне операције и коришћење формата серијализације са нултом копијом, као што су ФлатБуфферс или Цап'н Прото, задржавају трошкове занемарљивим чак и на великим размерама. <х3>Да ли треба да препишемо нашу Ц++ базу кода у Руст уместо у интерфејсу? <п>За већину тимова, инкрементално повезивање је безбеднији и бржи пут. Потпуно поновно писање уводи месеце инжењерског ризика без вредности за корисника до завршетка. Интерфејс вам омогућава да одмах пошаљете побољшања, потврдите Руст приступ у производњи и мигрирате модуле један по један на основу тога где конкурентност даје највећи утицај. Препишите само модуле у којима је цена одржавања границе ФФИ већа од цене поновног писања. <хр> <п>У Меваизу градимо инфраструктуру која се повећава — и технички и оперативно. Наш пословни ОС са 207 модула помаже 138.000 тимова да покрену паметније токове посла почевши од 19 УСД месечно. Било да управљате пројектима, аутоматизујете операције или повећавате своје пословање, Меваиз се прилагођава начину на који радите. <а хреф="хттпс://апп.меваиз.цом">Започните бесплатну пробну верзију на апп.меваиз.цом и видите шта модерни оперативни оперативни систем може да учини за ваш тим.<сцрипт типе="апплицатион/лд+јсон">{"@цонтект":"хттпс:\/\/сцхема.орг","@типе":"ФАКПаге","маинЕнтити":[{"@типе":"Куестион","наме":"Може ли Руст да позива једнонитне Ц++ библиотеке без модификација?","аццептедАнсвер":{"@типе":"Ансвер","тект":"Да, али морате осигурати да се сви позиви у ту библиотеку одвијају из једне нити \у2014 Безбедносно ограничење је у потпуности примењено на страни Руст-а."}},{"@типе":"Куестион","наме":"Да ли су трошкови ФФИ довољно значајни да утичу на перформансе апликације?","аццептедАнсвер":{"@типе":"Одговор","тект":"Појединачни позиви ФФИ-ја имају минималне трошкове10 за једноставно позивање функције \у2. Међутим, серијализација сложених структура података и синхронизација нити на граници се збрајају ако извршите хиљаде фино зрнатих позива групних операција и користите формате серијализације са нултом копијом, као што су ФлатБуфферс или Цап'н Прото, задржавају занемарљиве трошкове чак и на нивоу." интерфацинг?","аццептедАнсвер":{"@типе":"Ансвер","тект":"За већину тимова, инкрементално повезивање је сигурнији и бржи пут. Потпуно поновно писање уводи вишемесечни инжењерски ризик до завршетка Интерфејсирање вам омогућава да одмах пошаљете побољшања, потврдите приступ заснован на Руст-у на основу једног времена. Препишите само модуле где су трошкови одржавања"}}]}

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Related Guide

HR Management Guide →

Manage your team effectively: employee profiles, leave management, payroll, and performance reviews.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime