{
 "id": 36959,
 "slug": "2020-12-02_concevoir-une-file-de-capacite-multidimensionnelle",
 "url": "https://agents.willem.com/fr/posts/2020-12-02_concevoir-une-file-de-capacite-multidimensionnelle/",
 "source_url": "https://willem.com/fr/2020-12-02_concevoir-une-file-de-capacite-multidimensionnelle/",
 "language": "fr",
 "date": "2020-12-02",
 "published": "2020-12-02T00:00:00+01:00",
 "created": "2025-06-26T22:09:41.003000+02:00",
 "updated": "2026-10-20T09:21:07.940000+02:00",
 "title": "Concevoir une file de capacité multidimensionnelle",
 "subtitle": "Gérer les capacités de cuisine, de livraison et de retrait",
 "summary": "Ce mois-ci, j'ai dû ajouter des dimensions supplémentaires à un mécanisme de file de capacité. L'appli de commande de repas que j'ai créée devait pouvoir limiter la capacité selon le nombre de commandes, le contenu de chaque commande et le mode de remise (à emporter ou livraison). Lis la suite pour savoir comment j'ai utilisé une architecture Lambda pour y arriver.",
 "topics": [
  "data",
  "ecommerce",
  "lemmid-store",
  "payments",
  "server",
  "work"
 ],
 "author": {
  "name": "Willem L. Middelkoop",
  "url": "https://willem.com"
 },
 "provenance": {
  "kind": "model",
  "method": "Claude Sonnet, two passes (translation, then proofreading) against a glossary and hunspell",
  "date": "2026-10-20",
  "reviewed_by_native_reader": false,
  "language": "fr",
  "source_language": "en"
 },
 "translations": [
  {
   "language": "en",
   "title": "Designing a multi dimensional capacity queue",
   "url": "https://agents.willem.com/en/posts/2020-12-02_designing-a-multi-dimensional-capacity-queue/",
   "source_url": "https://willem.com/en/2020-12-02_designing-a-multi-dimensional-capacity-queue/"
  },
  {
   "language": "nl",
   "title": "Het ontwerpen van een multidimensionale capaciteitswachtrij",
   "url": "https://agents.willem.com/nl/posts/2020-12-02_het-ontwerpen-van-een-multidimensionale-capaciteitswachtrij/",
   "source_url": "https://willem.com/nl/2020-12-02_het-ontwerpen-van-een-multidimensionale-capaciteitswachtrij/"
  },
  {
   "language": "de",
   "title": "Entwurf einer mehrdimensionalen Kapazitätswarteschlange",
   "url": "https://agents.willem.com/de/posts/2020-12-02_entwurf-einer-mehrdimensionalen-kapazitatswarteschlange/",
   "source_url": "https://willem.com/de/2020-12-02_entwurf-einer-mehrdimensionalen-kapazitatswarteschlange/"
  },
  {
   "language": "es",
   "title": "Diseño de una cola de capacidad multidimensional",
   "url": "https://agents.willem.com/es/posts/2020-12-02_diseno-de-una-cola-de-capacidad-multidimensional/",
   "source_url": "https://willem.com/es/2020-12-02_diseno-de-una-cola-de-capacidad-multidimensional/"
  },
  {
   "language": "it",
   "title": "Progettare una coda di capacità multidimensionale",
   "url": "https://agents.willem.com/it/posts/2020-12-02_progettare-una-coda-di-capacita-multidimensionale/",
   "source_url": "https://willem.com/it/2020-12-02_progettare-una-coda-di-capacita-multidimensionale/"
  },
  {
   "language": "pt",
   "title": "Desenhar uma fila de capacidade multidimensional",
   "url": "https://agents.willem.com/pt/posts/2020-12-02_desenhar-uma-fila-de-capacidade-multidimensional/",
   "source_url": "https://willem.com/pt/2020-12-02_desenhar-uma-fila-de-capacidade-multidimensional/"
  },
  {
   "language": "pap",
   "title": "Desèñá un fila di kapasidat multidimensional",
   "url": "https://agents.willem.com/pap/posts/2020-12-02_desena-un-fila-di-kapasidat-multidimensional/",
   "source_url": "https://willem.com/pap/2020-12-02_desena-un-fila-di-kapasidat-multidimensional/"
  },
  {
   "language": "fy",
   "title": "In multidimensjonale kapasiteitswachtrige ûntwerpe",
   "url": "https://agents.willem.com/fy/posts/2020-12-02_in-multidimensjonale-kapasiteitswachtrige-untwerpe/",
   "source_url": "https://willem.com/fy/2020-12-02_in-multidimensjonale-kapasiteitswachtrige-untwerpe/"
  }
 ],
 "image": "https://willem.com/global/images/774a2243490d.webp",
 "image_width": 2560,
 "images": [
  {
   "url": "https://willem.com/global/images/e9229d524bd1.webp",
   "description": "Manger de la pizza pendant le développement, c'est « vivre l'algorithme »",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_36959_images-1.jpg"
  },
  {
   "url": "https://willem.com/global/images/db564dd30d9f.webp",
   "description": "Trois contraintes de capacité : cuisine / livraison / retrait",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_36959_images-2.jpg"
  },
  {
   "url": "https://willem.com/global/images/1e59e0b31de7.webp",
   "description": "Un flux d'événements de commandes est le cœur du mécanisme, et les requêtes sont satisfaites en examinant ce flux : combien de pizzas seront prêtes à 18:00 ?",
   "manager_file": "148-bf2d6faf6057f115dc72e82d984e71359f16b48d8c42b4b41c2ee918cf46b556_ContentAsPost_36959_images-3.jpg"
  }
 ],
 "text": "Limiter la capacité\nTu ne t'en rends peut-être pas compte, mais l'une des fonctions les plus puissantes de l'appli_de_commande_de_repas_que_j'ai_créée (https://willem.com/blog/lemmid-store/) est justement de pouvoir limiter le nombre de commandes. Ça paraît contre-intuitif, mais en limitant le nombre de commandes passées, mes clients (les restaurateurs et commerçants qui utilisent mon appli) s'assurent que les commandes soient préparées et livrées correctement.\nLa complexité de trois pizzas\nDisons que tu veux commander trois pizzas. L'appli doit alors savoir :\n- Veux-tu les retirer sur place ou te les faire livrer ?\n- À quelle heure ? Quand devront-elles passer au four ?\n- Y a-t-il assez de place pour trois pizzas dans le four à ce moment-là ?\n- Si tu as choisi le retrait : peut-on t'accueillir en toute sécurité à cette heure-là ?\n- Si tu as choisi la livraison : un livreur ou une livreuse est-il disponible pour t'apporter tes pizzas ?\n- Oui à tout ? Alors merci de payer pendant que nous gardons tes pizzas planifiées au four et pour la livraison ou le retrait. Paiement échoué ? Un doute ? Alors on « annule » toute la planification et on attend que quelqu'un d'autre commande des pizzas !\nTrois dimensions de capacité\nSurtout autour de l'« heure du dîner », il y a un risque que trop de gens commandent à manger en même temps. Même si l'appli encaisse le surcroît de trafic grâce à son architecture_hautement_évolutive (https://willem.com/en/2020-05-11_scalable-application-design-without-magic/), les contraintes physiques demeurent, comme :\n- capacité de la cuisine : le nombre de plats qu'on peut préparer en même temps\n- capacité de retrait : le nombre de personnes qu'on peut accueillir en toute sécurité en même temps, compte tenu des restrictions COVID-19\n- capacité de livraison : le nombre de commandes qu'on peut livrer, en tenant compte de la circulation, de la distance et de l'itinéraire\nDistinctes mais interdépendantes\nCes trois types de contraintes sont interdépendants. Par exemple, une grosse commande à emporter peut absorber toute la capacité de la cuisine, ce qui rend la livraison indisponible aussi. De plus petites commandes pourraient encore être acceptées pour remplir la capacité de la cuisine, alors qu'il n'y aurait peut-être plus assez de capacité pour de grosses commandes. Il faut donc un mécanisme qui examine toutes les mesures ensemble pour déterminer la disponibilité pour de nouvelles commandes, y compris le contenu d'une commande non encore passée (par exemple ce qu'il y a dans ton panier).\nDifférences de granularité temporelle\nIl est courant de définir une contrainte physique par une durée, par exemple « la cuisine peut produire 10 plats par tranche de 15 minutes ». Ça se corse quand d'autres contraintes physiques sont définies avec des durées différentes. Alors que la cuisine pourrait être limitée par tranche de 15 minutes, la capacité de livraison pourrait utiliser une durée plus longue (par exemple 3 livraisons par tranche de 30 minutes). Le mécanisme doit pouvoir gérer ces différences de granularité temporelle.\nCommander à l'avance\nL'option de commander à l'avance ajoute au défi. Les gens peuvent choisir un créneau futur et faire réserver la capacité nécessaire. Parfois, je vois des gens passer commande des jours à l'avance pour être sûrs d'être livrés un jour et à une heure précis. Il y a donc (au moins) deux heures associées à chaque commande : l'heure de commande et l'heure de livraison.\nRéserver et libérer de la capacité\nLa plupart des commerçants exigent un paiement en ligne pour les commandes en ligne, afin que toutes les commandes soient légitimes et qu'aucune capacité (ni nourriture) ne soit gaspillée en cas de défection ou de commandes fantômes. Le problème_des_paiements_en_ligne (https://willem.com/en/2020-03-25_designing-and-implementing-a-micro-payment-system/), c'est que toutes les transactions ne réussissent pas. Parfois un paiement par carte de crédit ou de débit est refusé (par exemple faute de fonds). Parfois les gens ferment simplement l'appli avant de terminer la commande. Le système doit réserver la capacité requise pour une commande donnée pendant que la personne effectue le paiement en ligne, et libérer cette capacité si la commande est abandonnée ou si le paiement échoue.\nGros volume, grande vitesse\nEnfin, le mécanisme doit être fiable et performant. La disponibilité pour une commande doit être déterminée en quelques millisecondes, malgré une forte concurrence d'accès, car de nombreux clients sont connectés à l'appli pendant le coup de feu. Quand quelqu'un passe une commande, cela influence la disponibilité de toutes les autres commandes (potentielles). Tout le monde n'est pas connecté de façon fiable : certains utilisent l'appli sur des téléphones avec une mauvaise réception ou en wifi. Le système doit bien fonctionner dans des conditions variées, avec beaucoup de personnes connectées.\nArchitecture Lambda\nL'architecture_Lambda (https://en.wikipedia.org/wiki/Lambda_architecture) est une façon de traiter de grandes quantités de données en combinant traitement de flux et traitement par lots. Une architecture lambda repose sur un modèle de données avec une source de données immuable où l'on ajoute seulement, souvent composée d'événements horodatés.\nDonnées immuables\nC'est une fondation très importante du mécanisme : toutes les données sont horodatées et ne changent jamais. Au lieu de modifier des enregistrements existants, on ajoute simplement de nouveaux enregistrements qui écrasent les existants. Cela permet une forte concurrence et des algorithmes distribués, car la synchronisation devient plus simple : il suffit de chercher les nouvelles données (et non les nouvelles et les modifiées !).\nCouche temps réel / vitesse\nLe traitement de flux, ou couche temps réel/vitesse, d'une architecture lambda est conçu pour fournir des réponses ultra rapides aux besoins de données en temps réel. Il maintient des vues et des mesures fondées sur le traitement en temps réel des événements.\nCouche de précalcul\nLe traitement par lots, ou couche de précalcul, fournit une base complète et exacte de toutes les données du système. Comme traiter de grandes quantités de données peut prendre du temps, le traitement par lots n'est pas assez rapide pour tout faire instantanément. C'est pourquoi les deux couches travaillent en tandem dans une architecture lambda.\nMise en œuvre\nLes serveurs backend qui traitent les commandes de l'appli travaillent avec un flux de données d'événements horodatés. En gros, chaque commande est un événement du système. Chaque commande est stockée avec sa date/heure de commande, sa date/heure de remise (livraison ou retrait planifié), les informations du client et le contenu de la commande (nombre de plats, etc.).\nRéserver et libérer de la capacité\nSi le paiement échoue ou si une commande est abandonnée, une commande « négative » est ajoutée au flux de données. Ses mesures négatives neutralisent tout effet sur les contraintes de capacité. Par exemple, pour annuler une commande de trois pizzas, on crée dans le flux une commande négative de « moins trois pizzas » avec le même horodatage de remise. C'est une façon élégante de garantir que la capacité soit à la fois réservée et libérée.\nMesures temps réel multidimensionnelles\nAu lieu de résumer la capacité en compteurs, le serveur backend utilise les vraies données du flux pour répondre aux requêtes de mesures en temps réel. Cela permet au système de gérer les différences de granularité temporelle.\nQuand une requête arrive pour la première fois pour une mesure donnée, le système charge les données historiques par un mécanisme par lots pour initialiser le modèle, qu'il peut ensuite tenir à jour en temps réel. Cette mesure est tenue à jour en examinant toutes les nouvelles commandes qui arrivent dans le système, tant que des requêtes pour cette mesure continuent d'arriver. Quand les données ne sont plus demandées, le modèle est déchargé. S'il est de nouveau nécessaire, le processus se répète.\nLe grand avantage de cette approche, c'est que la plupart des requêtes sont traitées en quelques millisecondes, car elles sont lues directement dans la mémoire RAM, sans interaction avec une base de données ni un disque. Cela donne des performances ultra élevées « à la demande ». C'est parfait pour l'appli de commande de repas, car toutes les durées ne sont pas également populaires.\nL'appli interroge régulièrement un serveur central de capacité qui tient à jour les mesures de la file. Elle filtre ensuite les créneaux disponibles en regardant ce que la personne sélectionne réellement pour sa commande. Choisir un créneau (probablement) disponible se fait donc côté client, ce qui allège la charge du backend. Une fois la commande passée, le backend réserve la capacité en mettant à jour les mesures centrales de la file, ce qui empêche d'autres personnes de prendre la même place dans la file.\nConclusion\nLes mécanismes de file d'attente peuvent être délicats quand plusieurs mesures contrôlent la vitesse. Prends vraiment le temps de bien modéliser, réfléchis aux données dont tu as vraiment besoin pour faire les vérifications liées à la file.\nMaintenant tu sais que commander trois pizzas n'est pas si simple ! Garantir qu'elles puissent être servies chaudes et à l'heure est un énorme défi technique, en plus d'être un bon chef. Heureusement pour toi, moi je ne me concentre pas sur ce dernier point, ha !",
 "word_count": 1484,
 "markdown_url": "https://agents.willem.com/fr/posts/2020-12-02_concevoir-une-file-de-capacite-multidimensionnelle/post.md"
}