Bonjour à tous! Aujourd'hui, je veux partager mon expérience dans l'apprentissage de la langue et la mise en œuvre rapide d'un projet de réseau à haute charge en utilisant les connexions réseau asynchrones maintenant non bloquantes si populaires et populaires dans la nouvelle langue Rust, belle, élégante et très efficace.
Je mettrai un accent particulier dans cet article sur une explication rapide et claire des capacités du langage et de la plate-forme pour les spécialistes qui ont une vaste expérience dans le développement Web, car je le suis moi-même. Il y a une idée fausse selon laquelle la courbe d'entrée dans Rust est très, très raide. Mais je montrerai que c'est loin d'être le cas. Versez le café et conduisez!
Une brève histoire des valeurs de programmation
Pour que le contenu soit bien dans la tête et dans le cœur, il est bon de rappeler brièvement ce que les gens ont voulu faire dans la programmation au cours des 50 dernières années et ce qu'ils ont fini par faire. Aucune infraction, seulement une opinion subjective personnelle et holivar, soutenue par 20 ans d'expérience en développement.
Langages de bas niveau: C, C ++
Il est clair que vous pouvez écrire le programme immédiatement sous forme de nombres sur les codes machine et beaucoup l'ont fait sur le ZX Spectrum, BK0010-01 et sur PC - le code s'avère très rapide :-) Mais nous sommes des gens, beaucoup d'informations ne nous tiennent pas dans la tête, nous sommes distraits et donc même l'invention de l'assembleur n'a pas beaucoup aidé - le code à un niveau aussi bas est très rarement écrit et très précisément et, très probablement, si vous ne développez pas de pilotes, de microcontrôleurs ou de systèmes embarqués délicats, cela ne sera pas utile dans la vie.

Au début des années 70, les Bell Labs ont inventé le langage C, qui a pris racine grâce à la syntaxe laconique et aux abstractions très «bon marché», devenant presque un «assembleur portable». Il est clair que si vous prenez une tonsure, écrivez pendant 10 ans les nuits C, ne mangez pas de viande, priez et ne vous laissez pas distraire par les réseaux sociaux et le beau sexe, vous pouvez écrire des programmes très utiles et rapides, comme
GNU en témoigne avec éloquence, d'excellents jeux productifs, bien-aimée, mais non alternative en qualité de Windows, et de nombreux autres exemples peuvent être donnés.
Mais le revers de la médaille se fait constamment sentir - ouvrant régulièrement des trous dans la sécurité (une industrie entière de "trous dans le logiciel" a été créée), causée par des trous dans le concept du langage C lui-même - le compilateur est comme un taureau irresponsable, avec une puissance incroyable, un orgasme intense et une mémoire courte. Toute négligence - et vous ne pouvez pas simplement abandonner le programme (déréférencer un pointeur nul, double libérer le pointeur, sortir du tableau), mais ruiner irrémédiablement les données et ne pas le remarquer longtemps jusqu'à ce que les clients commencent à appeler et quand il est trop tard («comportement indéfini», différent du compilateur au compilateur).
Björn Straustrup n'a fait qu'embrouiller la situation au début des années quatre-vingt, ajoutant des capacités de POO à C. Malgré sa grande popularité, le C ++, en général, est considéré comme une série d'expériences de programmation, en tant que telles, avec différents résultats de réussite, y compris mortel. Parfois, il semble même qu'il n'y avait aucun sens en C ++ depuis le tout début, ou il a été progressivement perdu, donnant lieu à un tas de concepts objectivement compliqués et conflictuels, qui deviennent de plus en plus avec chaque nouvelle norme. Malgré l'excellent objectif des «abstractions à coût nul», vous permettant d'obtenir du code rapide, pour créer une solution fiable, comme en C, les conditions suivantes sont requises:
- expérimenté, du mot «très», équipe (années de pratique, «moines» de la programmation)
- bon analyseur de code statique
- service de test (dans le code il peut y avoir des trous laissés par un compilateur irresponsable, qui peuvent se faire sentir pendant longtemps)
- les exigences convenues par tous les membres de l'équipe qui sont soigneusement surveillées (les pointeurs bruts, l'encapsulation stricte, la discipline la plus sévère pour nommer les variables, initialiser les objets, etc. ne sont pas utilisés)
Il est clair que le respect de ces exigences, en particulier dans le contexte d'un besoin commercial croissant d'un «code qui fonctionne sans surprises soudaines», est très coûteux. Le code dans de tels projets est écrit depuis longtemps, il doit être testé longtemps et soigneusement, mais, parfois, sans C / C ++, avant l'invention de Rust, c'était vraiment difficile à faire.
Encore une fois, un résumé de C / C ++ - nous avons un compilateur puissant, mais "irresponsable" avec "abstractions actuelles", qui aide très peu le développeur. En conséquence, tous les problèmes sont transmis aux épaules du programmeur. Si au moins un programmeur de l'équipe n'est pas expérimenté, pas très prudent et ne connaît pas toutes les subtilités du compilateur (en fait, personne ne connaît toutes les subtilités et les utilisateurs les trouvent plus tard) - attendez le problème. Mais alors le programme fonctionne rapidement et probablement correctement :-) Cela a, bien sûr, engendré tout un marché de «béquilles» - des analyseurs statiques, qui, en fin de compte, devraient être payés par le client. La question se pose - ne pourrait-il pas être possible d'écrire un compilateur plus strict et plus sûr qui aide le développeur et donne naissance à des programmes sans surprises et sans failles de sécurité de bas niveau?
Java, C #, Kotlin
La situation avec un contrôle franchement faible du «comportement indéfini» et des exigences très élevées pour les développeurs en C / C ++ a suscité le désir de créer un environnement de développement sûr, y compris pour Internet, accessible à la plupart des arrivants. Donc, à la fin des années 90, Java est apparu.
En principe, maintenant, n'importe qui avec un niveau de formation différent pouvait écrire n'importe quoi et n'importe quoi et IL A FONCTIONNÉ et ne pas mettre dans le programme - il n'y avait pas de "trous" de bas niveau dans la sécurité et les plantages spontanés (presque, mais ils étaient déjà causés par des bugs dans une machine virtuelle et fixé de manière centralisée). Il n'y avait que des «trous» logiques ou du code lent caché (né de l'ignorance des algorithmes, du concept de coût algorithmique et du ralentissement lorsque le volume de données augmentait), ce qui n'était plus si effrayant et vous permet de créer des programmes rapidement, et si nécessaire, de réécrire de petits morceaux avec une équipe C / C qualifiée C ++.
Les choses intéressantes et précieuses que le monde Java a apportées sont les suivantes:
- le code est écrit une fois pour une machine virtuelle qui fonctionne sur toutes les architectures (windows, linux, mac)
- le développeur ne gère plus directement la mémoire, comme en C / C ++ - cela est transmis aux épaules du "garbage collector"; cela élimine le risque de comportement indéfini, de corruption de données discrète et de failles de sécurité potentielles de bas niveau
- le code est compilé à la volée, pendant l'exécution du programme (compilation Just_In_Time), car il est connu que seule une petite partie est activement et souvent exécutée dans le programme, donc cela n'a aucun sens de tout compiler
- il est devenu plus facile d'écrire du code multi-thread efficace, comme le modèle de mémoire a été strictement spécifié (beaucoup plus tôt qu'en C ++), mais plus encore, tous les problèmes de "fiabilité logique de plusieurs threads" n'ont pas été résolus (des blocages, par exemple, ou des courses de données, étaient encore possibles)
Bien sûr, l'avènement d'une plateforme aussi conviviale a permis d'écrire de nombreux programmes utiles et inutiles, dont l'entreprise a immédiatement profité. Et la prise en charge de la compatibilité descendante en Java depuis 15 ans ou plus a rendu la technologie si populaire dans le monde de l'entreprise.
Oui, j'ai également des analogies avec la bière sans alcool et les femmes en caoutchouc.
Cependant, loin d'être immédiatement, les problèmes suivants sont apparus en Java:
- en raison du «trou» logique dans le système de typage, hérité de C / C ++, le type «Null» est entré dans Java, ce qui à ce jour provoque de nombreux problèmes et conduit constamment aux plantages de programmeurs «peu expérimentés» qui ne connaissent pas le type facultatif et ne sont pas intéressés par les monades de la programmation fonctionnelle
- Les projets Java, fonctionnant parfois un peu plus lentement, nécessitent des ordres de grandeur de plus de RAM que C / C ++ requis par le garbage collector (nous avons plusieurs projets qui consomment des dizaines ou des centaines de gigaoctets de RAM); ce n'est souvent pas un problème direct, Les prix de la RAM baissent, mais les "sédiments sont restés"
- Malgré une compilation simplifiée et de gros investissements pour accélérer le ramasse-miettes (que beaucoup et nouveaux apparaissent régulièrement et disent constamment: "essayez le nouveau GC, c'est beaucoup mieux"), depuis 20 ans certains projets Java très chargés travaillent avec des pauses régulières pendant plusieurs secondes, qui ne peut être retiré en aucune façon (il y a une collecte forcée des ordures, et comme les vis dans le GC ne se tordent pas, le garbage collector n'a tout simplement pas le temps de tout nettoyer, même en travaillant en parallèle et même en dévorant plus de ressources que le programme lui-même)
- il est connu que les applications Java GUI gèlent et ralentissent parfois, provoquant la colère des utilisateurs, à cause du même garbage collection et il n'y a aucun espoir et n'est pas attendu
- la syntaxe de la langue est très verbeuse et redondante (vous devez écrire puis lire les mots «public static functon» au lieu, disons, «pub fn» ou «def»), forçant parfois à se casser les doigts sur les ongles et à provoquer des douleurs objectives et des saignements des yeux
- une forte diminution des exigences pour le niveau de qualification des développeurs et une courbe d'entrée suffisamment basse ont donné lieu à beaucoup de code "degré de fraîcheur étrange", qui se fait constamment sentir tout au long de ma vie avec une puanteur mémorable
Après la lecture, il doit être clair que tout ne peut pas être écrit en Java, il sera écrit assez lentement, puis il ralentira et se bloquera régulièrement pendant une seconde sous charge, parfois «manger» beaucoup de RAM (généralement au moins la moitié de la RAM sur le serveur est mangée), des jeux productifs Vous ne pouvez pas le faire non plus, mais certains éléments de la logique métier qui ne sont pas particulièrement exigeants en termes de performances et de RAM, en particulier ceux à plusieurs threads, sont tout à fait possibles, utiles, et nous constatons donc une telle popularité de la technologie dans le monde de l'entreprise. Et nous utilisons nous-mêmes régulièrement et activement Java pour les services de l'entreprise.
C #, Scala, Kotlin
«Et quand sera-t-il question de rouille?» - attendez une minute, vous avez besoin d'un peu plus de préparation pour manger ce kaki sucré. Si vous ne parlez pas des fonctionnalités des autres technologies, vous ne comprendrez pas pourquoi Rust est apparu et pourquoi il est si
populaire et en demande .
Ainsi, en essayant de rendre Java meilleur et plus progressif, Microsoft, en la personne de l'auteur TurboPascal / Delphi, au début du zéro est venu avec C # et le concept de .NET. Objectivement, selon de nombreux experts réputés, et dans les fumoirs des développeurs, "C #" est plus sexy que Java, bien que, bien sûr, malgré Mono, il soit fortement attaché à Microsoft avec tous les afflux et les conséquences :-)
Scala est sans aucun doute un grand pas en avant, le langage, bien sûr, s'est avéré être scientifiquement abstrait et sophistiqué, prenant beaucoup de choses utiles et inutiles du monde de la programmation fonctionnelle. Mais quelque chose n'est pas très clair avec la popularité. Cependant,
Apache Spark est vraiment bon et populaire, rien à dire.
Kotlin est populaire car rend Java plus efficace et plus facile pour les débutants, en particulier sur les plates-formes mobiles qui n'ont pas le temps d'étudier sérieusement la programmation :-)
Mais le principal problème en C # (sur la plate-forme .NET), ainsi qu'en Scala, Kotlin et dans d'autres langages JVM - est resté. Garbage collector, Carl, créant une charge notable sur le serveur et arrêtant l'exécution du code pendant quelques secondes sous charge et exigences gourmandes en RAM! Et combien de langues supplémentaires avec un garbage collector et une compilation jit ne se poseront pas, ces problèmes resteront et il n'y a pas encore d'espoir, même en théorie.
Scripting
"Mais qu'en est-il de PHP?". Oui, parlons maintenant de script. Il semblerait, pourquoi est-il? Vers la fin des années 80, il est devenu évident que si vous devez résoudre rapidement un problème en utilisant du code, pas nécessairement ultra-rapide, et qu'il est sûr, sans comportement indéfini et trous de bas niveau, vous pouvez écrire un script. Les scripts ont été écrits auparavant, en bash, perl, awk, mais il s'est avéré qu'en python, vous pouvez écrire de très gros scripts, surtout scientifiques, et pendant des années!
Lua a trouvé sa niche dans gamedev et machine learning (
Torch ), JavaScript - dans le développement web à la fois côté navigateur et côté
serveur (tout le monde sait que l'
autorisation dans l'infrastructure "npm" de Node.js est réécrite à partir de Node.js et Golang sur la rouille?). Python - dans l'apprentissage automatique et l'analyse des données, ainsi que dans les scripts système. Et PHP - s'adapte parfaitement aux tâches du serveur pour le développement Web.

Les avantages des scripts sont évidents:
- Un code sûr et efficace sans comportement indéfini et trous de sécurité de bas niveau, utilisant des algorithmes et des structures de données populaires (listes, dictionnaires, files d'attente), est créé en quelques minutes
- Un démarrage très rapide et une courbe d'entrée douce. Il faut plusieurs jours pour comprendre et écrire un script python utile, changer la logique de nginx via les scripts dans Lua, ou faire l'intégration de la boutique en ligne en PHP
- Si vous écrivez des scripts de manière disciplinée, en respectant le CodeStyle et aussi strictement que possible, vous pouvez résoudre rapidement des problèmes complexes et créer de gros produits logiciels: un grand nombre de bibliothèques scientifiques en python, des systèmes de gestion d'entreprise et de sites Web en PHP, la plate-forme de réseau de neurones Torch en LuaJit, le script de jeu dans un très jeux célèbres et populaires, etc.
- Certains types de programmation multi-thread, où les E / S sont le goulot d'étranglement, sont résolus assez efficacement en python. Et en utilisant les dernières fonctionnalités de python avec des futurs comme "async / wait", il est encore plus facile de résoudre les problèmes de traitement d'un grand nombre de sockets réseau
- Très élégamment, la tâche de traiter de manière asynchrone un grand nombre de sockets, même sans multithreading, a été résolue dans Node.js hors de la boîte
- Créer des pages Web, utiliser de nombreuses bibliothèques Unix, accéder à la base de données est toujours facile et pratique en utilisant PHP et des produits basés sur celui-ci
- Sur python, PHP, JavaScript il est très pratique de tester des hypothèses et de réaliser des prototypes en quelques heures, pas en mois
- Pour l'analyse et le traitement des données, il est traditionnellement très pratique d'utiliser python / R en conjonction avec un grand nombre de bibliothèques de haute qualité (pandas, scikit-learn, seaborn, matplotlib ...)
Cependant, vous ne pouvez pas connaître les inconvénients potentiels du script:
- Un faible niveau d'entrée et une vitesse de script très rapide créent parfois, en l'absence d'un contrôle approprié sur les développeurs, des tonnes de code inefficace et difficile à maintenir sur n'importe quelle plate-forme
- L'absence de compilateur, de système de typage et de typage statique nécessite une vérification dynamique des paramètres passés aux fonctions et méthodes pour les types et une couverture de code de haute qualité avec des autotests. Sinon, tout changement dans le code peut casser le programme et le client, et non le développeur, sera le premier à le savoir (oui, je connais TypeScript, mais ce sont des béquilles et des cataplasmes morts)
- Objectivement et évidemment, dans les langages sans typage et compilation statiques, où de nombreuses choses se produisent lors de l'exécution, vous ne pouvez pas utiliser de nombreuses optimisations et, par conséquent, dans certaines tâches, les scripts fonctionnent plus lentement et consomment beaucoup plus de ressources. Malgré les tentatives d'implémenter la compilation jit en python (pypy), PHP (hhvm), JavaScript (traduction en code machine, wow, Node.js v8), LuaJIT - ne nous leurrons pas: tout cela ressemble à des béquilles peu efficaces. La raison en est, et il faut le comprendre une fois pour toutes, qu'en raison de la faiblesse délibérée du langage, il est peu probable que les scripts parviennent à écrire un runtime efficace, approchant en vitesse un Java / C # beaucoup plus fortement typé.
- Et en python, il semble qu'il n'y aura jamais de multithreading efficace, comme en Java / C #, à cause du GIL
Cependant, depuis dans la plupart des applications d'entreprise, y compris systèmes de gestion de site, CRM, etc. Étant donné que la plupart du temps d'exécution du code est consacré aux requêtes vers la base de données, l'avantage du jit Java / C # est profondément nivelé par la vitesse d'écriture des solutions en PHP / python / JavaScript, et personnellement, pour la création d'applications Web, je sélectionnerai 10-20 lignes en PHP sur 10 000 chaînes et un tas d'abats en Java / Spring. Et PHP7 en quelque sorte overclocké pour qu'il fonctionne plus vite que python3 ;-)
Quelle conclusion peut-on tirer ici? Il n'est pas nécessaire de résoudre tous les problèmes, comme c'est maintenant le cas, uniquement par script - dans certains cas, il est raisonnable de prendre un autre outil plus approprié, s'il y a de bonnes raisons à cela:
- charges réseau très élevées et multithreading «extrême», milliers - dizaines de milliers de sockets réseau, etc.
- restriction sur l'utilisation de la RAM et du matériel
- traitement intensif des données et informatique, matrices avec des millions d'entités, GPU (bien que python / numpy / pandas puisse aider ici)
Souvent dans l'entreprise, nous pratiquons cette approche:
- prendre rapidement une décision en PHP / python / JavaScript / Node.js, se lancer dans la bataille et commencer à résoudre les problèmes des clients
- nous gérons des fonctionnalités, des opportunités, améliorons les services
- dans de rares cas, par expérience, généralement pas plus tôt qu'après quelques années, certains des services déjà stables en fonctionnalités sont réécrits en C / C ++ / Java / Golang / Rust
Par conséquent, il est préférable de démarrer, en règle générale, avec des scripts, de lancer une bataille, puis, si vous en avez besoin directement, vous devez prendre d'autres outils et cela se passe, généralement très facilement et sans risques.
Programmation fonctionnelle, Lisp, Haskell, F #
Beaucoup, pour toute la carrière d'un développeur, ne viennent jamais ici, mais en vain. Il est extrêmement utile de comprendre pourquoi le FP (programmation fonctionnelle) est apparu et pourquoi dans certains domaines il est si populaire.
Je vais l'expliquer simplement. Il y a un problème insoluble en mathématiques comme le
"problème d'arrêt" . Si vous le mettez dans des mots très simples et assez non stricts, mais c'est clair, alors vous ne pouvez pas trouver un algorithme prouvant que le programme fonctionnera sans bugs. Pourquoi? Parce qu'au départ, les gens ont commencé à programmer de manière agressive et impérative, en utilisant:
- variables mutables
- cycles avec conditions
- effets secondaires
Et ils ont commencé à faire des erreurs. Nous le voyons maintenant, observant un grand nombre de bogues sur le Web et dans les applications de bureau et mobiles. Et peu importe comment vous couvrez le code avec des autotests, les bugs continuent de fuir, de se disperser sur le sol et de rire.
Pour arrêter ce cauchemar de l'apparition des logiciels buggy et impitoyables, à la fin des années 50, une direction de la programmation fonctionnelle et du
langage Lisp est apparue . Maintenant, cette famille de langues représente, plus ou moins adéquatement,
Haskell .
Malgré le fait qu'un grand nombre d'erreurs possibles dans le code sont vraiment éliminées en raison de:
- types de données algébriques et correspondance de modèles sur eux
- l'absence de cycles (uniquement par récursivité) et de variables mutables à la portée d'un bras tendu (des béquilles pour contourner cela, bien sûr, peuvent être trouvées )
- typage statique très strict et, en même temps, sortie automatique très pratique des types Hindley-Milner
- fonctionnalités très puissantes, avec la division en "pur" et "avec effets secondaires", avec possibilité d' utilisation partielle
- prise en charge sécurisée de la programmation simultanée
- prise en charge des combinateurs à travers des monades pour toutes les occasions (plus à ce sujet dans la section Rust)
Haskell «» — , , , :
. Haskell «», , , , . Haskell .
, , — Haskell , , , Java/C#.
, . Haskell , , , , . , «» — Haskell .
«C/C++» — Golang, D
, , C/C++ (, Forth).
C++ , ,
D ( — , ).
, - /C++ c
RAII , . 2009 Google
Golang .
, Golang , , , . Golang Java/C# ( ) ,
… , Golang:
- «green threads» ( ), python
- , , (, Docker ) :-)
. Node.js python .
, Golang , Google vs Sun/Oracle, , , , :-) , « Java/C#» , — . Docker Golang . Golang — Java/C#, , .

, ,
Swift , c « » . macOS.
— Rust!
, , 40-50 , , , «zero-cost» , , - - :-) , , (Java/C#), , (C/C++), -, — . , ?
— . , , , 50 , 2010 Mozilla Research. , :
- «zero-cost» ( C/C++ ), .. , , ------ « » (, , )
- cargo ,
- (* — ): , — « », , , ,
- , , ( , , GC , - runtime, )
- -, Null (!),
- Haskell pattern-matching , Enumeration (Golang, , )
- ( Java, )
- ( Golang — ; Java/C#/Erlang .. , )
- , ( C/C++)
, , -. ? ! , 50 . , , «» , , .
Rust «» , , Haskell .
Rust , , , Java :-) — Nulls, pattern-matching , generics traits . . , , , « Haskell», .
.
?
! , «» («ownership») . « » ( «lifetime», Rust book, ),
( , ).
/, . /, .
C++, - move-. , rust , .
zero-cost ?
, traits, . , , Golang. , , - pattern-matching, ( Golang, ). / . : .
(«borrowing»). , ( «read-write locks», ). , , , , .
slice , , , . — « » , , ; , .
:
, ( , )
… . / , C/C++ . .
, - , - . - , . Sync/Send, , : , , , .
, , 1-2 futures
. , Node.js python async/await, , . , ?
unit
, unit .
.
— cargo
Java, «Maven
cargo » , : , . , , , .
Heap
, , heap. , , ( ) « » ( «lifetime»). ,
( Swift). , — , heap . — , .
, , , . , (2 ) , , , ,
,
AmazonWebServices c tls/ssl, .
, , , , , - .
« » ( «lifetimes») .
, . IntelliJ
rust , . Notepad++ — .
Rust
- Comprenez que vous avez vraiment besoin d'écrire du code système très rapide, de travailler sous des charges élevées et de consommer un minimum de ressources et sans aucun surcoût tel qu'un garbage collector. Sinon, écrivez un script en python / PHP / Node.js et revenez à la tâche après 2-3 ans (dans 97% des cas vous n'avez pas à revenir).
- N'ayez pas peur de Rust. Le principal point fort du langage est un compilateur très intelligent et mathématiquement rigoureux qui NE MANQUERA PAS de code dangereux et incorrect. Par essais et erreurs, en évitant les angles vifs, vous apprendrez à programmer en utilisant le compilateur strictement et en toute sécurité :-)
- Commencez à apprendre la langue avec un " livre de rouille ". Un beau livre sexy qui est facile à lire et amusant à lire. Mais il vaut mieux le lire 2 fois, "résoudre" tous les exemples.
- Le " livre de cuisine rouille " aide beaucoup . Il est également souhaitable de le «résoudre» et de voir comment fonctionne le code, de le ressentir.
- Il existe de la littérature sur Rust pour les utilisateurs avancés, comme Rustonimicon , mais je ne recommande pas de se soucier inutilement de choses techniques vraiment compliquées.

Comprenez encore une fois - pour maîtriser la technologie, vous devez commencer à y écrire du code utile pour l'entreprise. Le compilateur Rust est si intelligent qu'il donne des garanties (en fait, c'est très important, le compilateur C ++ ne sait pas comment le faire) et ne compile pas de code dangereux / endommagé en mémoire, alors expérimentez autant que vous le souhaitez et vous obtiendrez le code rapidement et en toute sécurité et vous améliorerez encore le programme: - )
Détails de mise en œuvre du projet
Je vais révéler un petit détail du projet. Amazon SQS répand des centaines de paquets de données par seconde. La file d'attente est lue, analysée localement par les travailleurs, chaque message est traité par le courtier et redirigé vers un autre serveur externe. Il existe plusieurs serveurs externes. Initialement, la solution a été mise en œuvre par le biais de scripts: le script, reprenant un processus dans le système d'exploitation, lisant les messages, traités et envoyés sur le réseau. Sur plusieurs serveurs de fer puissants (8 cœurs, 16 Go de RAM), des centaines de scripts ont été lancés (sur chacun!), Lisant simultanément depuis SQS, traitant et envoyant des données. Simple, fiable, mais l'apport en fer a commencé à déranger. Le coût du fer augmentait constamment.
Rust utilisait principalement des bibliothèques et des modules standard de cargo:
- rusoto_sqs - pour travailler avec Amazon Web Services, pas de questions, fonctionne au besoin dès la sortie de la boîte
- rustls - pour tls, incl. interactions avec les services TLS de Google, Apple et l'utilisation de certificats clients
- signal-hook - pour intercepter kill et mettre fin à la transaction pour l'envoi de données
- futures, tokio-rustls - travail "paresseux", multi-thread, asynchrone avec des sockets TLS réseau, ala Node.js
- clap - analyse des arguments de ligne de commande
- serde_json - formation json, rien d'intéressant ici
Malheureusement, ce n'était pas sans utiliser des blocs «dangereux» et «std :: mem :: transmute» - la bibliothèque standard n'a pas pu trouver d'outils pour analyser les données binaires dans les arbres.
Le principal, si vous pouvez l'appeler ainsi, s'est produit lors de la compilation - les bibliothèques n'ont pas été compilées sur CentOS6 à cause de "l'assembleur obsolète" dans binutils, mais il n'y a eu aucun problème sur CentOS7.
L'impression générale est que le développement sur Rust ressemble plutôt à un «script strict» plutôt qu'à une programmation système, pas beaucoup plus long qu'un script ou un développement Web, à la fois en termes de ressources et de tests. Dans ce cas, compilation statique stricte, absence de garbage collector et types de données algébriques.
Le sentiment général est très positif. Pourtant, au lieu de plusieurs serveurs de fer (8 cœurs, 16 Go de RAM), le problème a commencé à être résolu par un processus (avec des dizaines de threads) qui ne mange pas plus de 5 Go de RAM et crée une charge peu perceptible sur les cœurs, avec un trafic de l'ordre de 0,5 à 1 gigabits. .
Conclusion
Eh bien, cela a mis fin à un long, mais, espérons-le, un article inspirant et utile sur la technologie efficace. Vous connaissez maintenant un autre outil et vous pouvez l'utiliser en toute sécurité si nécessaire. Nous avons passé en revue l'histoire du développement des langages de programmation, leurs capacités et fonctionnalités, et nous avons peut-être tiré ou tirerons les bonnes conclusions. Bonne chance dans vos projets et bonne, non, bonne humeur!
PS:
* - Oui, j'ai presque oublié. Bien sûr, vous devez parler du bloc dangereux. Dans ce bloc, vous pouvez:
- pour programmer des choses qui ne sont pas disponibles dans les pointeurs "bruts" de déférence standard de la rouille et faire des choses plus potentiellement dangereuses, parfois requises dans la programmation du système. Mais tout n'est pas si effrayant:
- les blocs dangereux sont visibles et il n'y en a pas du tout, ou le code responsable y est concentré
- La bibliothèque standard de rouille est minutieusement testée, ce qui signifie que nous pensons que des blocs dangereux y fonctionnent
- les bibliothèques populaires dans le fret sont également testées de manière approfondie (tout est intégré pour les tests unitaires et d'intégration dans la rouille) et donc elles peuvent être prises et utilisées en toute sécurité
C'est-à-dire dans le bloc «dangereux», vous ne pouvez pas vous engager dans une débauche arbitraire, disponible en C - mais uniquement avec
certains types d'activités dangereuses. Par conséquent, vous pouvez et devez dormir paisiblement :-)