Développement

Concevoir une application mobile adossée à une architecture résiliente et hautement scalable

Vous cherchez une agence capable de soutenir une croissance fulgurante sans que vos serveurs ne fondent. L'écosystème mobile exige une rigueur implacable au niveau de l'infrastructure sous-jacente. L'enjeu n'est pas d'afficher des écrans fluides mais de garantir que l'arrière-boutique encaisse des millions de requêtes asynchrones sans ciller.

photo de profil de Yanis
Yanis
Ingénieur / Développeur
Temps de lecture : 5 minutes
Agence de développement mobile avec infrastructure scalable

Le mirage de l'autoscaling magique face aux verrous transactionnels

Vous pensez probablement qu'il suffit d'instancier un cluster Kubernetes avec un autoscaler bien configuré pour absorber n'importe quel pic de trafic mobile. C'est une vision particulièrement naïve de l'ingénierie système. La réalité nous rattrape toujours au niveau de la couche de persistance. Quand votre application mobile génère des milliers de requêtes concurrentes d'écriture (par exemple lors d'un événement en direct ou d'une notification push massive), le goulot d'étranglement se déplace instantanément vers votre base de données relationnelle. Les verrous de lignes s'accumulent, les transactions s'empilent et soudainement, vos utilisateurs voient un spinner infini sur leur écran.

Prenons le cas très documenté de Discord. Ils ont d'abord utilisé MongoDB, puis ont dû migrer vers Cassandra pour gérer des milliards de messages, avant de finalement tout réécrire sur ScyllaDB pour réduire les latences garbage collector inhérentes à la JVM. Ce type de trajectoire montre bien que le choix du moteur de stockage dicte la véritable scalabilité de l'ensemble. Une agence technique digne de ce nom doit anticiper ces problématiques de partitionnement dès la phase de conception. Sur AWS DynamoDB par exemple, vous devez savoir qu'une partition physique est strictement limitée à 1000 unités d'écriture et 3000 unités de lecture par seconde. Si votre clé de partitionnement (votre fameux partition key) est mal choisie, vous créez un "hot partition" et votre backend rejette les requêtes avec des erreurs 400 (ProvisionedThroughputExceededException).

C'est précisément pour éviter ces écueils architecturaux que nous avons affiné notre approche chez Dexon. Vous pouvez d'ailleurs consulter notre site pour comprendre comment nous lions l'applicatif client aux contraintes d'infrastructure. Nous refusons catégoriquement de concevoir une application mobile sans modéliser exhaustivement les accès aux données sous-jacentes , un principe d'ingénierie que nous appliquons systématiquement.

Par exemple, la modélisation des données dans un univers NoSQL exige de dénormaliser massivement les entités métier. Contrairement à une base PostgreSQL classique où l'on utilise des jointures complexes (JOIN) pour agréger les informations, une base orientée documents nécessite d'embarquer les relations directement dans le même objet JSON. Si votre équipe mobile réclame une vue agrégée du profil utilisateur incluant ses dix dernières transactions, le backend doit être capable de fournir ce document pré-calculé en une seule opération de lecture (O(1) lookup). C'est ce changement de paradigme fondamental qui sépare les architectures robustes des prototypes bricolés . La latence réseau est le pire ennemi de l'expérience mobile. Chaque aller-retour supplémentaire entre le smartphone et les serveurs d'API dégrade drastiquement la perception de fluidité.

L'état applicatif mobile quand le réseau s'effondre

L'environnement mobile est intrinsèquement hostile. Contrairement à une application web exécutée sur une connexion fibre stable, le smartphone de votre utilisateur bascule constamment entre la 5G, la 3G vacillante et des zones blanches totales. L'infrastructure scalable ne sert à rien si l'application mobile panique à la moindre perte de paquets. Nous devons implémenter des mécanismes de compensation robustes côté client.

Uber a d'ailleurs open-sourcé son architecture RIBs (Router, Interactor and Builder) pour isoler rigoureusement la logique métier de la gestion de l'interface utilisateur. Cette séparation stricte permet de maintenir un état déterministe même quand le backend est injoignable. L'application mobile doit agir comme un système distribué autonome. Elle accumule les mutations d'état localement dans une base embarquée (comme SQLite ou Realm) et synchronise ces deltas de manière optimiste dès que la connectivité est rétablie.

Sauf que si l'API ne répond plus dans les délais impartis...

C'est là qu'intervient la complexité des files d'attente asynchrones.

Pour gérer cette résilience de bout en bout, nous imposons plusieurs paradigmes stricts :

  • L'utilisation systématique d'identifiants idempotents générés côté client (UUID v4) pour éviter les doublons lors des re-tentatives de requêtes.
  • La mise en place de stratégies de backoff exponentiel avec un facteur de jitter (une variance aléatoire) pour ne pas foudroyer le serveur lors d'une reconnexion massive de millions de clients simultanés.
  • Le chiffrement asymétrique des payloads stockés hors-ligne pour garantir l'intégrité des données sensibles.
  • L'adoption du protocole gRPC combiné à des buffers de protocole (Protobuf) pour minimiser drastiquement la taille des trames réseau face aux API REST traditionnelles.
  • Le déploiement de points de terminaison (endpoints) spécifiques dédiés à la synchronisation par lots (batching) plutôt que des appels unitaires coûteux.
  • L'implémentation de compteurs logiques (Vector Clocks) pour résoudre les conflits de fusion (merge conflicts) entre l'état local et l'état distant.

Il arrive parfois de douter de la pertinence de GraphQL sur des réseaux très dégradés. Bien que la flexibilité des requêtes soit séduisante pour le frontend, la gestion de la mise en cache au niveau du CDN (Content Delivery Network) devient un véritable cauchemar d'ingénierie. Un endpoint REST classique avec des en-têtes ETag bien configurés est souvent beaucoup plus performant pour soulager l'infrastructure. J'admets que nous nous posons souvent la question lors des comités d'architecture technique. Faut-il sacrifier l'élégance de GraphQL au profit de la robustesse brute d'une API REST fortement cachée en périphérie (Edge) ? La réponse n'est pas toujours évidente.

Microservices et complexité accidentelle (une erreur de casting chez les prestataires ?)

Le marché actuel est obnubilé par la ségrégation des responsabilités. On vous vendra systématiquement une architecture orientée microservices pour soi-disant garantir une scalabilité infinie. C'est souvent une aberration monumentale pour un produit qui n'a pas encore rencontré son marché. La complexité de maintenir des dizaines de services indépendants avec leurs propres bases de données engendre une latence réseau inter-services (le fameux "network hop") qui pénalise directement le temps de réponse de l'application mobile. Un monolithe modulaire bien structuré est infiniment supérieur pour démarrer.

Cependant, je dois avouer que nous concevons presque toujours nos backends sous forme de microservices dès le premier jour. Cette approche nous permet d'isoler les composants gourmands en ressources de calcul (comme le traitement asynchrone d'images ou l'ingestion de flux analytiques) du reste de l'API transactionnelle. C'est paradoxal, je vous l'accorde. Nous dénonçons la complexité accidentelle des microservices tout en les imposant dans notre méthodologie de base. Mais cette rigueur initiale nous protège des refontes douloureuses lorsque la charge utilisateur explose soudainement.

C'est une gymnastique mentale permanente. Les requêtes réseau que nous avons envoyé depuis le client mobile nécessitent une observabilité absolue. Vous ne pouvez pas déboguer une transaction qui traverse une API Gateway, un Load Balancer, trois microservices et un cluster Redis . Sans un traçage distribué (Distributed Tracing) implémenté avec une précision chirurgicale, vous naviguez à l'aveugle. OpenTelemetry est devenu notre standard de facto pour propager le contexte de traçage depuis le smartphone jusqu'au fin fond de la base de données.

Stratégies d'invalidation de cache et propagation aux frontières du réseau

L'architecture ne se limite pas à provisionner des serveurs. C'est un architecture distribuée complexe qui pose les fondations de la résilience. Le secret d'une application mobile qui répond en quelques millisecondes réside dans l'art complexe de ne jamais solliciter la base de données principale. Nous devons repousser la donnée le plus près possible de l'utilisateur final.

Nos implémentations reposent généralement sur deux strates distinctes :

  • Un cache en mémoire distribué (type Redis Cluster ou Memcached) pour stocker les résultats des requêtes complexes calculées par les nœuds applicatifs.
  • Une couche CDN (comme Cloudflare ou Fastly) couplée à des fonctions serverless (Edge Workers) pour intercepter les requêtes directement depuis le point de présence géographiquement le plus proche du smartphone.

L'invalidation de ces caches est notoirement l'un des problèmes les plus ardus en informatique distribuée. Lorsqu'une ressource est modifiée par un utilisateur mobile, le système doit garantir que les millions d'autres clients ne lisent pas une donnée périmée (stale data). Nous utilisons le modèle "Cache-Aside" combiné à des événements de capture de changement de données (Change Data Capture ou CDC) directement branchés sur les journaux de transactions (Write-Ahead Logs) de nos bases PostgreSQL. Des outils comme Debezium scrutent ces journaux et publient les mutations dans des topics Kafka.

C'est une machinerie lourde ! Mais elle est absolument indispensable. Sans cela, vos bases de données s'effondrent sous la pression des lectures (read-heavy workloads). Par ailleurs, l'application mobile doit elle-même participer à cet effort en respectant scrupuleusement les directives de cache envoyées par le serveur via les en-têtes HTTP (Cache-Control). Si le client mobile ignore ces directives, tout le travail d'infrastructure en amont est réduit à néant.

Une agence de dévelopement mobile doit maîtriser cette topologie réseau complexe. Il ne suffit pas de coder de jolies animations avec Flutter ou React Native. Les véritables défis se situent dans la gestion de la cohérence éventuelle (Eventual Consistency).

Ce que nous construisons véritablement en arrière-plan (au-delà de l'interface)

Nous observons régulièrement des entreprises qui investissent des budgets colossaux dans l'UX/UI tout en négligeant dramatiquement l'ingénierie backend. C'est un non-sens stratégique total ! Les utilisateurs pardonnent un design rudimentaire mais ils désinstallent instantanément une application qui plante lors d'un paiement ou qui met dix secondes à charger un flux d'actualité.

Nos références démontrent que les produits qui survivent à l'hyper-croissance sont ceux qui traitent l'infrastructure comme une fonctionnalité métier à part entière. Nous concevons des topologies réseau capables de survivre à la perte d'une zone de disponibilité (Availability Zone) complète sans que l'utilisateur final ne perçoive la moindre interruption de service.

Il faut comprendre que la scalabilité est multidimensionnelle. Elle concerne la capacité à traiter plus de requêtes par seconde (scalabilité verticale et horizontale) mais aussi la capacité à gérer l'augmentation exponentielle du volume de données stockées. Le partitionnement horizontal (sharding) devient incontournable au-delà de quelques téraoctets de données relationnelles.

Je reste parfois perplexe face aux nouvelles architectures "Serverless" pures impliquant des bases de données à l'usage (pay-per-request). Certes la promesse de s'affranchir totalement de la gestion des instances est alléchante. Toutefois les temps de démarrage à froid (cold starts) des fonctions lambdas peuvent introduire des latences rédhibitoires pour des applications mobiles exigeant du temps réel strict. Nous préférons souvent conserver un pool de conteneurs pré-chauffés (warm pools) pour les chemins critiques (critical paths) de l'application.

Un autre aspect crucial concerne la gestion des WebSockets pour le temps réel. Maintenir des millions de connexions TCP persistantes ouvertes simultanément épuise rapidement les descripteurs de fichiers (file descriptors) des serveurs frontaux. Nous implémentons des passerelles dédiées (comme des clusters Erlang ou des instances NodeJS ultra-optimisées) dont l'unique rôle est de maintenir ces tunnels ouverts et de router les messages pub/sub vers les bons clients. Le backend lourd reste ainsi protégé de ce trafic hautement concurrentiel.

La gestion fine des pools de connexions (connection pooling) via des outils comme PgBouncer est également un prérequis absolu pour éviter d'épuiser les ressources du moteur de base de données lorsque des milliers d'instances applicatives éphémères tentent de s'y connecter simultanément.

La scalabilité n'est pas une option qu'on active en fin de projet. C'est le socle même sur lequel repose la pérennité de votre produit. Vous devez exiger une infrastructure pensée pour la haute disponibilité dès le premier jour. N'attendez pas que votre backend s'effondre pour revoir votre architecture fondamentale. Prenez des décisions techniques audacieuses dès maintenant.

Nos derniers articles

Explorez l'univers digital à travers nos articles captivants, abordant les dernières tendances et astuces du domaine numérique.

De la puce à l'écran : matérialiser l'action métier via l'alliance RFID et smartphone

De la puce à l'écran : matérialiser l'action métier via l'alliance RFID et smartphone

Jordan - Chef de projet IT
Société spécialisée dans le développement mobile avec API REST sécurisée

Architecture Mobile et API REST Sécurisée : L'Ingénierie Derrière l'Interface

Yanis - Ingénieur / Développeur
Génération de contenu dans une app : quand l'IA rédige, résume et traduit à la place de l'utilisateur

Génération de contenu in-app : quand l'IA prend la plume à la place de vos utilisateurs

Jordan - Chef de projet IT
De l'idée au store : orchestrer la naissance d'une application mobile sans perdre le cap

De l'idée au store : orchestrer la naissance d'une application mobile sans perdre le cap

Dorian - Chef de projet IT

Confiez votre projet à nos
experts en applications

Notre équipe pluridisciplinaire de designers, développeurs et coachs apporte à votre solution une véritable plus-value à court, moyen et long terme grâce à une maîtrise parfaite de son architecture globale.

Développeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et webDéveloppeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et webDéveloppeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et webDéveloppeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et webDéveloppeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et webDéveloppeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et webDéveloppeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et webDéveloppeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et webDéveloppeurs, designers, chefs de projet, travaillant au sein des bureaux de l'agence Dexon spécialisée en création d'applications mobiles et web

Ils parlent de nous

Découvrez ce que la presse dit de nous ! Nous sommes fiers de partager les mentions et analyses qui mettent en lumière notre travail et nos innovations.

logo BFM Businesslogo Le Figarologo Challengeslogo la Tribunelogo CNEWS

Un projet à nous soumettre ?

Étape 2/2
01 87 66 10 43

Paris • Lyon • Marseille • Nice • Genève

logo CII

Agrément CII

Votre entreprise peut prétendre à un crédit d'impôt équivalant à 20% des coûts liés au développement de sa solution.