
Je suis sĂ»r que le titre a suscitĂ© une rĂ©action saine â « ça recommence encore... » Mais permettez-moi de capter votre attention pendant 5 Ă 10 minutes, et je ferai de mon mieux pour ne pas dĂ©cevoir vos attentes.
La structure de l'article sera la suivante : une affirmation stéréotypée sera prise et la « nature » de l'origine de ce stéréotype sera développée. J'espÚre que cela permettra de voir le choix du paradigme d'échange de données dans vos projets sous un nouvel angle.
Pour clarifier ce qu'est le RPC, je propose d'examiner le standard . Avec REST, il n'y a pas de clarté. Et il ne devrait pas y en avoir. Tout ce que vous devez savoir sur REST, c'est qu'il est indistinguable de .
Les requĂȘtes RPC sont plus rapides et plus efficaces, car elles permettent de faire des requĂȘtes en lot.
Il s'agit de ce que l'on peut faire dans une requĂȘte RPC : appeler plusieurs procĂ©dures en une seule fois. Par exemple, crĂ©er un utilisateur, lui ajouter un avatar et, dans la mĂȘme requĂȘte, l'abonner Ă certains sujets. Une seule requĂȘte, mais quelle utilitĂ© !
En effet, si vous nâavez quâun seul nĆud backend, cela semblera plus rapide avec une requĂȘte en lot. Parce que trois requĂȘtes REST nĂ©cessiteront trois fois plus de ressources d'un seul nĆud pour Ă©tablir des connexions.

Notez que la premiĂšre requĂȘte dans le cas de REST doit retourner l'identifiant de l'utilisateur pour exĂ©cuter les requĂȘtes suivantes. Cela a Ă©galement un impact nĂ©gatif sur le rĂ©sultat global.
Mais de telles infrastructures ne se rencontrent guĂšre que dans des solutions internes et des entreprises. Au pire, dans de petits projets WEB. Cependant, des solutions WEB complĂštes, surtout celles intitulĂ©es HighLoad, ne devraient pas ĂȘtre construites ainsi. Leur infrastructure doit rĂ©pondre Ă des critĂšres de haute disponibilitĂ© et de charge. Et la donne change.

Les canaux d'activitĂ© de l'infrastructure sont marquĂ©s en vert pour le mĂȘme scĂ©nario. Notez comment le RPC se comporte maintenant. La requĂȘte utilise l'infrastructure uniquement sur un seul bras du rĂ©partiteur vers le backend. Pendant que REST continue de perdre dans la premiĂšre requĂȘte, il compense le retard en utilisant toute l'infrastructure.
Il suffit d'introduire dans le scĂ©nario non pas deux requĂȘtes d'enrichissement, mais peut-ĂȘtre cinq ou dix... et la rĂ©ponse Ă la question « qui gagne maintenant ? » devient moins Ă©vidente.
Je vous propose d'explorer la problématique plus en profondeur. Le schéma montre comment les canaux d'infrastructure sont utilisés, mais l'infrastructure ne se limite pas aux canaux. Un élément essentiel d'une infrastructure à fort trafic est le cache. Obtenons maintenant un artefact utilisateur. Plusieurs fois. Disons 32 fois.

Regardez comment l'infrastructure de RPC a clairement Ă©tĂ© "amĂ©liorĂ©e" pour rĂ©pondre aux exigences de haute charge. Tout rĂ©side dans le fait que REST exploite toute la puissance du protocole HTTP contrairement Ă RPC. Sur le schĂ©ma fourni, cette puissance est mise en Ćuvre par le biais de la mĂ©thode de requĂȘte â GET.
Les mĂ©thodes HTTP ont, entre autres, des stratĂ©gies de mise en cache. Vous pouvez les dĂ©couvrir dans la documentation sur . Pour RPC, on utilise des requĂȘtes POST, qui ne sont pas considĂ©rĂ©es comme idempotentes, c'est-Ă -dire que la rĂ©pĂ©tition de la mĂȘme requĂȘte POST peut renvoyer des rĂ©sultats diffĂ©rents (par exemple, aprĂšs chaque envoi d'un commentaire, une nouvelle copie de ce commentaire apparaĂźtra) ().
Par conséquent, RPC ne peut pas utiliser efficacement les caches d'infrastructure. Cela fait qu'il est nécessaire d'introduire des caches logiciels. Sur le schéma, Redis joue ce rÎle. Le cache logiciel, à son tour, nécessite un niveau de code supplémentaire de la part du développeur et des modifications notables dans l'architecture.
Calculons maintenant le nombre de requĂȘtes gĂ©nĂ©rĂ©es par REST et RPC dans l'infrastructure examinĂ©e ?
RequĂȘtes
Entrants
au backend
à la base de données
au cache logiciel (Redis)
TOTAL
REST
1/32*
1
1
0
3 / 35
RPC
32
32
1
31
96
[*] dans le meilleur des cas (si le cache local est utilisĂ©) 1 requĂȘte (une seule !), au pire 32 requĂȘtes entrantes.
ComparĂ© au premier schĂ©ma, la diffĂ©rence est frappante. Il devient maintenant Ă©vident que REST a un avantage. Mais je propose de ne pas s'arrĂȘter lĂ . Une infrastructure dĂ©veloppĂ©e inclut un CDN. Celui-ci rĂšgle souvent la question de la lutte contre les attaques DDoS et DoS. Obtenons :

Ici, pour RPC, la situation devient vraiment désastreuse. RPC est simplement incapable de déléguer le travail avec la charge au CDN. Il ne reste plus qu'à compter sur les systÚmes de lutte contre les attaques.
Peut-on en rester lĂ ? Encore une fois, non. Les mĂ©thodes HTTP, comme mentionnĂ© prĂ©cĂ©demment, ont leur propre « magie ». Ce n'est pas pour rien que la mĂ©thode GET est largement utilisĂ©e sur Internet. Notez que cette mĂ©thode peut accĂ©der Ă une partie du contenu, imposer des conditions que les Ă©lĂ©ments d'infrastructure peuvent interprĂ©ter avant mĂȘme de transfĂ©rer le contrĂŽle Ă votre code, etc. Tout cela permet de crĂ©er des infrastructures flexibles et gĂ©rables, capables de traiter d'importants flux de requĂȘtes. Et dans le RPC, cette mĂ©thode... est ignorĂ©e.
Alors, pourquoi le mythe selon lequel les requĂȘtes par lots (RPC) sont plus rapides est-il si tenace ? Personnellement, je pense que la plupart des projets n'atteignent tout simplement pas un niveau de maturitĂ© oĂč REST peut vraiment briller. De plus, dans les petits projets, il montre plus facilement ses faiblesses.
Le choix entre REST ou RPC n'est pas une décision unilatérale d'un individu dans un projet. Ce choix doit répondre aux exigences du projet. Si le projet peut tirer parti de tout ce que REST a à offrir et que c'est réellement nécessaire, alors REST sera un excellent choix.
Mais si pour obtenir tous les avantages de REST, il faut embaucher des DevOps pour une mise à l'échelle rapide de l'infrastructure, des administrateurs pour gérer cette infrastructure, un architecte pour concevoir tous les niveaux d'un service WEB... et que le projet ne vend que trois paquets de margarine par jour... je pencherais plutÎt pour le RPC, car ce protocole est plus utilitaire. Il ne nécessitera pas de connaissances approfondies sur le fonctionnement des caches et de l'infrastructure, et concentrera le développeur sur des appels simples et clairs aux procédures dont il a besoin. Les affaires seront satisfaites.
Les requĂȘtes RPC sont plus fiables, car elles peuvent exĂ©cuter des requĂȘtes par lots dans le cadre d'une seule transaction.
Cette caractĂ©ristique du RPC est sans conteste un avantage, car elle permet de maintenir la base de donnĂ©es dans un Ă©tat cohĂ©rent. Avec REST, c'est plus complexe. Les requĂȘtes peuvent arriver de maniĂšre non sĂ©quentielle sur diffĂ©rentes nĆuds du backend.
Ce « défaut » de REST est l'envers de son avantage décrit ci-dessus : la capacité d'utiliser efficacement toutes les ressources de l'infrastructure. Si l'infrastructure est mal conçue, et surtout si l'architecture du projet et de la base de données en particulier est mal faite, alors cela devient vraiment problématique.
Mais les requĂȘtes en lot sont-elles si fiables qu'elles semblent l'ĂȘtre ? ConsidĂ©rons un cas : nous crĂ©ons un utilisateur, nous enrichissons son profil avec une description et nous lui envoyons un SMS avec un code secret pour complĂ©ter son inscription. C'est-Ă -dire trois appels dans une seule requĂȘte en lot.

Examinons le schĂ©ma. Il prĂ©sente une infrastructure avec des Ă©lĂ©ments de haute disponibilitĂ©. Il y a deux canaux de communication indĂ©pendants avec les passerelles SMS. Mais⊠que voyons-nous ? Lors de l'envoi d'un SMS, une erreur 503 se produit â le service est temporairement indisponible. Comme l'envoi de SMS est inclus dans une requĂȘte en lot, toute la requĂȘte doit ĂȘtre annulĂ©e. Les actions dans la base de donnĂ©es sont annulĂ©es. Le client reçoit une erreur.
La prochaine tentative est une loterie. Soit la requĂȘte tombe Ă nouveau sur le mĂȘme nĆud et renvoie Ă nouveau une erreur, soit elle a de la chance et s'exĂ©cute. Mais le principal, c'est qu'au moins une fois, notre infrastructure a dĂ©jĂ travaillĂ© pour rien. Il y a eu une charge, mais aucun bĂ©nĂ©fice.
Bien, imaginons que nous nous soyons creusĂ© la tĂȘte (!) et que nous ayons rĂ©flĂ©chi Ă une option oĂč la requĂȘte peut ĂȘtre exĂ©cutĂ©e partiellement avec succĂšs. Et pour le reste, nous allons de nouveau essayer de l'exĂ©cuter aprĂšs un certain intervalle de temps (Quel intervalle ? Le front dĂ©cide ?). Mais la loterie reste. La requĂȘte d'envoi de SMS Ă©chouera de nouveau avec une probabilitĂ© de 50/50.
Vous en convenez, du point de vue du client, le service ne semble pas aussi fiable qu'on le souhaiterait⊠qu'en est-il de REST ?

REST utilise Ă nouveau la "magie" de HTTP, mais cette fois avec des codes de rĂ©ponse. Lorsqu'une erreur 503 se produit sur la passerelle SMS, le backend transmet cette erreur Ă l'Ă©quilibreur de charge. L'Ă©quilibreur, recevant cette erreur et sans rompre la connexion avec le client, dirige la requĂȘte vers un autre nĆud, qui exĂ©cute la requĂȘte avec succĂšs. C'est-Ă -dire que le client obtient le rĂ©sultat attendu, et l'infrastructure confirme son titre de "haute disponibilitĂ©". L'utilisateur est satisfait.
Et ce n'est pas tout. L'Ă©quilibreur n'a pas simplement reçu le code de rĂ©ponse 503. Ce code, lors de la rĂ©ponse, devrait idĂ©alement ĂȘtre accompagnĂ© de l'en-tĂȘte "Retry-After". Cet en-tĂȘte indique Ă l'Ă©quilibreur qu'il ne faut pas dĂ©ranger ce nĆud par cette route pendant une pĂ©riode donnĂ©e. Ainsi, les requĂȘtes suivantes pour l'envoi de SMS seront immĂ©diatement dirigĂ©es vers le nĆud qui n'a pas de problĂšmes avec la passerelle SMS.
Comme nous le voyons, la fiabilité de JSON-RPC est surestimée. En effet, il est plus facile d'organiser la cohérence dans la base de données. Mais en retour, la fiabilité du systÚme dans son ensemble en pùtira.
La sortie est en grande partie similaire Ă la prĂ©cĂ©dente. Lorsque l'infrastructure est simple, la clartĂ© de JSON-RPC est sans aucun doute un avantage. Si le projet implique une haute disponibilitĂ© avec une forte charge, REST semble ĂȘtre une solution plus appropriĂ©e, bien qu'elle soit plus complexe.
Le seuil d'entrée pour REST est plus bas
Je pense que l'analyse ci-dessus, qui dĂ©mystifie les stĂ©rĂ©otypes Ă©tablis sur RPC, a clairement montrĂ© que le seuil d'entrĂ©e pour REST est indĂ©niablement plus Ă©levĂ© que pour RPC. Cela est dĂ» Ă la nĂ©cessitĂ© d'une comprĂ©hension approfondie du fonctionnement de HTTP, ainsi qu'Ă l'obligation de possĂ©der des connaissances suffisantes sur les Ă©lĂ©ments d'infrastructure existants qui peuvent et doivent ĂȘtre appliquĂ©s dans les projets WEB.
Alors pourquoi beaucoup pensent-ils que REST sera plus simple ? Ă mon avis, cette apparente simplicitĂ© provient des manifestes mĂȘmes de REST. Autrement dit, REST n'est pas un protocole, mais un concept⊠REST n'a pas de norme, il existe certaines recommandations⊠REST n'est pas plus complexe que HTTP. Cette apparente libertĂ© et anarchie attirent les "artistes libres".
Sans aucun doute, REST n'est pas plus compliquĂ© que HTTP. Mais HTTP lui-mĂȘme est un protocole bien pensĂ© qui a prouvĂ© sa validitĂ© depuis des dĂ©cennies. Sans une comprĂ©hension approfondie de HTTP, il n'est pas possible de juger de REST.
Concernant RPC, on peut le faire. Il suffit de consulter sa spĂ©cification. Avez-vous vraiment besoin de ? ĐлО ĐČŃĐ” жД Ń ĐžŃŃŃĐč REST? Đ Đ”ŃаŃŃ ĐČĐ°ĐŒ.
J'espĂšre sincĂšrement que je n'ai pas perdu votre temps en vain.
Source : habr.com
