Maison >développement back-end >Golang >Fournit une réponse à une requête HTTP après avoir reçu une autre requête

Fournit une réponse à une requête HTTP après avoir reçu une autre requête

PHPz
PHPzavant
2024-02-09 13:06:181219parcourir

收到另一个请求后提供 HTTP 请求的响应

éditeur php fraise Lors du développement d'applications Web, nous devons souvent gérer des requêtes HTTP et fournir les réponses correspondantes. Lorsque nous recevons une demande, nous devons générer une réponse appropriée en fonction du contenu et de l'objectif de la demande. Cela peut impliquer diverses opérations telles que l'interrogation de la base de données, le traitement des données du formulaire, l'appel d'autres API, etc. Dans cet article, nous explorerons comment gérer les requêtes HTTP en PHP et fournirons les réponses correspondantes afin d'offrir une meilleure interaction et une meilleure expérience utilisateur aux utilisateurs. Que vous créiez une simple page Web statique ou une application Web complexe, il est important de comprendre comment gérer les requêtes HTTP et générer des réponses.

Contenu de la question

Mon cas d'utilisation est de fournir la réponse d'une requête HTTP après avoir reçu une autre requête d'un serveur distinct.

  1. Je veux faire cela de la meilleure façon possible tout en gardant l'évolutivité à l'esprit.
  2. Nous utilisons Golang 1.19 et le framework Gin.
  3. Le serveur aura plusieurs Pods, donc les chaînes ne fonctionneront pas.
  4. Toutes les demandes expireront, la demande initiale expirera après 60 secondes.

Ma solution actuelle consiste à utiliser un cache partagé, où chaque Pod vérifie constamment le cache. Je pense que je peux optimiser cela en canalisant le système pour qu'il vérifie périodiquement les réponses complètes plutôt que de vérifier le cache une par une.

J'aimerais également savoir comment l'implémenter dans d'autres langages de programmation.

PS : Il s'agit d'une requête basée sur la conception et j'ai la réputation de partager des primes ici, alors demandez ici. Si la question n'est pas claire, n'hésitez pas à la modifier.

Solution

tl;dr

Description du problème

Alors, disons que votre application serveur s'appelle server_app et possède 3 pods :

+---------------------+
     |  server_app_service |
     +---------------------+
     |  server_app_pod_a   |
     |  server_app_pod_b   |
     |  server_app_pod_c   |
     +---------------------+

Votre service reçoit une requête nommée "request a" et décide de la transmettre à server_app_pod_a. Maintenant, votre server_app_pod_a transmet la demande à une passerelle et attend une sorte de "request a" 的请求,并决定将其传递给 server_app_pod_a。现在,您的 server_app_pod_a 将请求转发到某个网关,并等待某种通知,以继续处理客户端的响应。正如您所知,无法保证当网关执行 request b 时,服务会再次将其传递给 server_app_pod_anotification

pour continuer à traiter la réponse du client. Comme vous le savez, rien ne garantit que lorsque la passerelle exécute request b, le service la transmettra à nouveau à server_app_pod_a. Même si vous faites cela, la gestion de l'état de l'application deviendra une tâche difficile.

Messagerie

request“b”Comme vous l'avez peut-être remarqué, j'ai mis en gras le mot "notification" dans le paragraphe précédent, c'est parce que si vous y réfléchissez vraiment, ressemble plus à une notification avec un message

plutôt qu'à un message adressé à quelqu'un qui demande des ressources. Mon premier choix est donc une file d'attente de messages comme Kafka (comme vous le savez, il y en a beaucoup). L'idée est que si vous pouvez définir un algorithme pour calculer une clé unique pour une requête, vous pouvez alors être informé du résultat dans exactement le même pod. De cette façon, la gestion de l'état sera plus simple et les chances de recevoir des notifications dans le même pod seront plus élevées (bien sûr, cela dépend de nombreux facteurs, tels que l'état de la file d'attente des messages). Jetez un œil à vos questions :
  1. Je veux faire cela de la meilleure façon possible tout en gardant l'évolutivité à l'esprit.

Bien sûr, vous pouvez utiliser ces files d'attente de messages comme Kafka pour activer la file d'attente de messages et la mise à l'échelle des applications et réduire la perte de données.
  1. Toutes les demandes expireront, la demande initiale expirera après 60 secondes.

Selon la façon dont vous gérez les délais d'attente dans votre base de code, utiliser le contexte est une bonne idée.

J'aimerais également savoir comment l'implémenter dans d'autres langages de programmation.

scala 中,如果您使用一些名为 akka 的特定工具(它提供了 actor 模型编程范例),您可以使用所谓的 akka-cluster-shardingL'utilisation d'une file d'attente de messages est une idée générale qui fonctionne avec presque tous les langages de programmation, mais en fonction du paradigme de programmation du langage et des bibliothèques et outils spécifiques au langage, il peut exister d'autres moyens de résoudre ce problème. Par exemple dans

pour gérer ce problème. L'idée est très simple, nous savons qu'il doit y avoir une sorte de superviseur qui connaît la localisation exacte et le statut de ses propres abonnés. Ainsi, lorsqu'il reçoit un message, il sait simplement où transmettre la demande et à quel acteur (nous parlons de programmation de modèle d'acteur). En d’autres termes, il peut être utilisé pour partager l’état entre les participants générés sur un cluster, que ce soit sur la même machine ou non. Mais par préférence personnelle, je n'opterais pas pour une communication spécifique à une langue et je m'en tiendrai à l'idée générale car cela pourrait poser des problèmes à l'avenir.

Résumé

Explication assez longue :). Pour comprendre de quoi je parle, retraçons exactement le même scénario, mais avec un modèle de communication différent : 🎜
  1. Le client envoie la requête "a" au service server_app.
  2. Le service sélectionne l'un des pods (par exemple server_app_pod_b) pour traiter la demande.
  3. Ensuite, le pod essaie de définir une clé pour la requête et la transmet à la passerelle avec la requête et attendezqu'un message avec cette clé soit publié dans la file d'attente.
  4. La passerelle fait ce qu'elle est censée faire et envoie le message à la file d'attente des messages à l'aide de la clé .
  5. Exactement le même pod serer_app_pod_b reçoit le message avec la clé, obtient les données du message et continue de traiter la demande du client.

Il existe peut-être d'autres moyens de résoudre ce problème, mais c'est ce que je veux. j'espère que cela vous aidera!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer