Hacker News

Avèm interfaçat C++ monofial amb Rust multifial

Avèm interfaçat C++ monofial amb Rust multifial Aquesta analisi completa de l'interfàcia ofrís un examen detalhat de sos compausants de basa e d'implicacions mai largas. Domenis claus d'enfocament La discussion se centra sus: Mec...

9 min read Via antithesis.com

Mewayz Team

Editorial Team

Hacker News
Vaquí l'article complet del blòg de SEO:

Avèm interfaçat C++ monofilat amb Rust multifilat

L'interfaçament del còde C++ monofial amb Rust multifial es pas solament possible — es un dels biaisses mai practics de modernizar los sistèmas ancians sens una reescritura completa. A Mewayz, avèm afrontat aquel desfís exacte en escalant nòstre SO de 207 moduls per servir 138 000 utilizaires, e los resultats cambièron fondamentalament cossí pensam a l'interoperabilitat dels sistèmas.

Perqué interfaçariás C++ monofilat amb Rust multifilat ?

La màger part dels sistèmas de produccion pòrtan d'annadas de còde C++ testat en batalha. Reescriure tot dins Rust sembla atractiu sul papièr, mas introduch un risc massís e de meses de temps d'engenharia. L'apròchi pragmatic es l'adopcion incrementala — envelopant la logica C++ existenta en tot descargar de cargas de trabalh pesugas de concurréncia sul modèl de proprietat de Rust.

Dins nòstre cas, los moduls de logica de negòci de basa èran foncionats de manièra fisabla en C++ monofial dempuèi d'annadas. Ocupavan lo tractament de prètzfaches sequencials, la generacion de documents e los calculs financièrs. Mas a mesura que nòstra basa d'utilizaires creissiá de 100K, aviam besonh d'un tractament de donadas parallèls, de gestion concurrenta de l'API, e de gestion segura d'estat partejat. Los traches Mandar e Sync de Rust nos donèron de garentidas de concurréncia en temps de compilacion que C++ poiriá pas ofrir sens una auditoria manuala extensiva.

La motivacion clau es la reduccion del risc. Gardatz çò que fonciona, e apondètz çò qu'escala — sens jogar vòstra basa de còde entièra sus una migracion que poiriá pas jamai s'acabar.

Cossí fonciona realament la frontièra FFI?

L'interfàcia de foncions estrangièras (FFI) entre C++ e Rust fonciona a travèrs de signaturas de foncions compatiblas amb C. Los blòts extèrnes "C" de Rust expausan de foncions que C++ pòt apelar dirèctament, e vice-versa. Lo desfís critic emergís quand lo temps d'execucion multi-fial de Rust a besonh d'invocar lo còde C++ mono-fial en seguretat.

Avèm resolgut aquò en utilizant una arquitectura dedicada :

  • Executor de C++ confinat al fial : Totas las cridas C++ son embutadas a travèrs d'un sol fial dedicat en utilizant un canal de passatge de messatge, en s'assegurant que l'invarianta de fial unic es pas jamai violada.
  • Calc de pont asincròn de Rust : Las tòcas de Tokio someton de trabalhs a l'executor C++ e espèra los resultats a travèrs de canals oneshot, en gardant lo costat Rust completament asincròn.
  • Gestion dels puntadors opacs: Los objèctes C++ son enrotlats dins d'estructuras Rust qu'implementan Drop per un netejament deterministic, en empachant de fugidas de memòria a travèrs la frontièra del lengatge.
  • Serializacion a la frontièra: Las estructuras de donadas complèxas son serializadas a de FlatBuffers al calc FFI, en evitant la correspondéncia fragila de la disposicion de l'estructura e en permetent l'evolucion independenta de cada costat.
  • Isolament de panic: Lo catch_unwind de Rust enrotla cada punt d'intrada FFI per qu'una panica travèrse pas jamai la frontièra de la lenga, çò que seriá un comportament indefinit.

Aqueste modèl nos donèt lo debit de Rust multi-fial amb la fiabilitat de la logica C++ provada — sens tornar escriure una sola linha de las règlas de negòci originalas.

Quinas son las trapèlas mai grandas a evitar?

L'error mai dangierosa es de supausar que lo còde C++ es segur pels fials quand es pas. L'estat global, las variablas estaticas e las cridas de bibliotèca non reentrants causaràn de corsas de donadas que lo compilator de Rust pòt pas detectar a travèrs la frontièra FFI. Las garentidas de seguretat de Rust s'arrèstan al blòt unsafe — tot çò que i a dedins es vòstra responsabilitat.

Informacion clau: Rust garentís la seguretat de la memòria dins son pròpri còde, mas lo moment que traversatz una frontièra FFI dins C++, eretatz cada problèma de seguretat de fial que C++ a. L'arquitectura a l'entorn d'aquela frontièra importa mai que lo còde d'un costat o de l'autre.

💡 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 →

Una autra trapèla comuna es la gestion de tota la vida. Los objèctes C++ participan pas al verificador d'emprunt de Rust. Se Rust daissa tombar una referéncia del temps que C++ ten encara un puntador, obtenètz de bugs d'usatge après liurament que son brutalament malaisits de diagnosticar. Avèm abordat aquò en aplicant una semantica de proprietat estricta : los objèctes C++ son totjorn possedits per exactament un envelopament Rust, e l'accès partejat passa per lo compte de referéncias basat sus Arc del costat Rust.

En çò que tanh a la performància, las cridas FFI excessivas crean de despensas generalas del commutacion de contèxte e de la serializacion. Encastram d'operacions ont que siá possible, en mandant una còla d'elements de trabalh a l'executor C++ puslèu que de far d'apèls interlengatges individuals.

Cossí aqueste apròchi a foncionat dins la produccion?

Après aver desplegat l'arquitectura ibrida sus nòstra plataforma, mesurèrem de melhoraments concrèts. Lo debit de demanda aumentèt de 3,4x pels moduls qu'èran precedentament embotelhats sul tractament C++ sequencial. La latència de coa (p99) baissèt de 61% perque lo temps d'execucion asincròna de Rust podiá tractar de demandas independentas a l'encòp del temps que C++ gestionava de prètzfaches pesucs de calcul sus son fial dedicat.

Mai importantament, avèm agut zèro bugs ligats a la concurréncia dins los sièis primièrs meses de produccion. Lo modèl de confinament de fial rendèt estructuralament impossible que lo còde C++ siá apelat dempuèi de fials multiples, del temps que lo sistèma de tipes de Rust empachava las corsas de donadas de son costat de la frontièra. Aquò èra una melhoracion significativa sus nòstra apròcha precedenta d'ensajar d'apondre de threading a C++ amb de mutexes, qu'aviá produsit tres incidents de condicion de corsa dins un sol trimèstre.

L'equipa d'engenharia raportèt tanben de cicles d'iteracion mai rapids. De foncionalitats novèlas poirián èsser bastidas dins Rust amb lo supòrt de concurréncia complet, del temps que los moduls C++ existents contunhavan d'executar sens modificacion. Aquesta estrategia incrementala significava qu'aguèrem pas jamai una migracion de "big bang" de naut risc — sonque una melhoracion constanta e mesurabla.

Questions frequentas

Rust pòt apelar de bibliotècas C++ monofial sens modificacion ?

Òc, mas vos cal assegurar que totas las apèls cap a aquela bibliotèca se produson dempuèi un sol fial. Lo modèl estandard es de crear un fial d'executor dedicat que serializa totas las cridas C++ a travèrs un canal. Las tòcas asincrònas de Rust someton de demandas e espèran de responsas sens blocar lo temps d'execucion multi-fial. Lo còde C++ en se demanda pas de modificacions — la contrainte de seguretat es entièrament aplicada del costat Rust.

La despensa FFI es pro significativa per afectar la performància de l'aplicacion ?

Las cridas FFI individualas an de despensas generalas minimalas — tipicament mens de 10 nanosegondas per una crida de foncion simpla. Pasmens, la serializacion d'estructuras de donadas complèxas e la sincronizacion de fial a la frontièra se soman se fasètz de milièrs d'apèls de grana fina. Las operacions de lots e l'utilizacion de formats de serialisacion de còpia zèro coma FlatBuffers o Cap'n Proto gardan lo despens general negligible quitament a l'escala.

Devèm tornar escriure nòstra basa de còde C++ dins Rust al luòc d'interfàcia ?

Per la màger part de las equipas, l'interfàcia incrementala es lo camin mai segur e mai rapid. Una reescritura completa introduch de meses de risc d'engenharia sens valor de l'utilizaire fins a la fin. L'interfàcia vos permet d'enviar de melhoraments immediatament, de validar l'apròchi Rust en produccion, e de migrar de moduls un a la volta segon ont la concurréncia balha lo mai d'impacte. Tornatz escriure sonque los moduls ont lo còst de mantenença de la frontièra FFI despassa lo còst de reescritura.


A Mewayz, bastisson d'infrastructuras que s'escala — tant tecnicament coma operacionalament. Nòstre SO comercial de 207 moduls ajuda 138 000 equipas a executar de fluxes de trabalh mai intelligents a partir de 19 $/mes. Que siátz a gerir de projèctes, a automatizar d'operacions, o a escalar vòstre negòci, Mewayz s'adapta a la manièra de trabalhar. Aviar vòstra espròva gratuita sus app.mewayz.com e veire çò qu'un SO comercial modèrne pòt far per vòstra equipa.