Utilisation de CDN

Bonjour à toutes et tous,

Petite question à laquelle vous pourrez peut être répondre : est-il parfois raisonnable d’utiliser un CDN ? Pour mon projet (agorakit.org) j’essaie de me passer de cdn pour les librairies javascript mais avec probablement une perte de performance et un cache pas optimisé. Du coup, si par exemple j’utilise la librarie full calendar, je pourrais utiliser l’un ou l’autre CDN, style:

Que penser des ces services? Je vois que jsdeliver se vante d’être utilisé par mozilla par exemple…

Merci pour vos éclairages

Bravo pour le projet ça à l’air chouette !

Pour ce qui est des CDN, en général on préfère éviter que les requêtes qui nous sont adressées passent à droite à gauche, clairement.

Niveaux performance et cache, honnêtement je pense pas non plus que ce soit du JS minified qui te pénalise beaucoup, surtout si ton site n’a pas de portée particulièrement internationale.

Pour le cache, c’est ton serveur web ou ton appli qui vont définir au navigateur client la durée du cache, donc la balle est dans ton camp. Du coup après un premier téléchargement, ton JS ne sera plus sollicité pour les prochains échanges avec ce client, et ce jusqu’à la fin du cache-control.

Après ça dépend aussi de ton lien côté serveur, mais encore une fois, du JS / CSS minifié et envoyé à la première connexion, je vois pas trop le problème.

1 « J'aime »

Je me rend compte que j’ai pas répondu à la questions :sweat_smile:

Je ne connais pas les domaines que tu mentionnes, je pourrais donc pas me prononcer là-dessus du coup :neutral_face:.

Le problème c’est que si tu mets des CDN comme ceux cités, il pourront recevoir l’instruction HTTP_REFFERER, ce qui leur permet de suivre quelle page ou quel domaine (en navigation privée) est ouvert par la personne qui visite le site.
La parade consiste à spécifier une balise meta referer pour spécifier la politique du site en matière de référant HTTP de sorte à envoyer le domaine du CDN (ou rien).
Le fait que la réponse soit mise en cache, limite l’étendue du problème en matière de vie privée. Mais ce cache dépend aussi du réglage du navigateur et du CDN. Rien n’indique d’ailleurs que le réglage du CDN est toujours le même, ni qu’il n’est pas différent selon les visiteurs…

De ma compréhension, ces CDN constituent un point de centralisation non négligeable et il y a fort à parier que les agences gouvernementales et les investisseurs en big data se soit penché sur la question.

Il y a aussi un risque que le code JS du CDN soit modifié, potentiellement uniquement pour ton site ou uniquement pour certaines plage d’IP ou certains navigateurs. Il convient donc de ne pas oublier d’utiliser l’attribut integrity dans ce cas.

Utiliser un CDN à l’avantage de permettre de passer le seuil des 10 requêtes simultanées (de mémoire) vers un même domaine. Ce qui peut fluidifier les sites avec de nombreuses requêtes.

Par contre, les visiteurs verront ces domaines CDN dans leurs bloqueurs de pub et potentiellement se diront que ton site n’est pas propre.

Et la balise meta referer et l’attribut integrity ne fonctionne pas sur tous les navigateurs (typiquement des navigateurs qui ne sont pas à jour pour une raison x ou y).

Ce serait chouette qu’on écrive un texte dans le wiki à ce sujet. Voir un article quelque part.

2 « J'aime »

Qu’apportent-ils vraiment ?

J’ai jamais bien compris le réel intérêt de déporter ces petits bouts de code, plutôt que de les servir soit même. Pareil pour les polices de caractère ou autre.

Cela permet un traçage et met ton site aussi en dépendance d’un service extérieur que tu ne contrôle pas. Quand je vais sur votre home, j’ai 7 autres destinataires au courant que je suis passé chez vous… et si l’un est injoignable, le site va avoir des problèmes et oui c’est de la re-centralisation masquée.

Côté serveur, ça fait juste économiser un peu de bande passante, mais si tu fais le compte tu verra que c’est marginal.
Côté visiteur, c’est censé économiser de la bande passante par la mise en cache, mais pour cela il faut tomber exactement sur les mêmes URL donc même version de lib et même CDN… je doute que ça soit majoritairement le cas.

1 « J'aime »

Flemme des développeurs ? On s’en aperçoit quand un même site fait appel à plusieurs (parfois 4 CDN différents). Je suspecte alors les développeurs d’avoir juste copier/coller le code avec le CDN préférés du développeur du code JS en question.

1 « J'aime »

Évidemment que c’est par flemme, en tout cas dans mon cas :slight_smile:
Mais bon vous m’avez convaincu de faire l’effort de tout rapatrier en local. Ce qui est un petit boulot surtout que je déteste npm et tout cet écosystème qui périme super vite. Mais ça y est presque sur l’application agorakit en tout cas.

1 « J'aime »

Il n’y a pas que la flemme, il y a aussi l’argument (recevable ou non) que si tu visites 150 sites qui proposent chacun de télécharger jquery-3.14.min.js depuis le même CDN, alors le navigateur ne le téléchargera qu’une seule fois.
Alors que si chacun de ces sites le propose depuis sa propre url, alors le navigateur le téléchargera et le mettra en cache 150 fois.

Encore faut-il que ce soit la même version sur tous les sites, ce qui n’est pas le cas en pratique, donc l’argument me semble peu pertinent.

1 « J'aime »

Il y a une distinction à faire entre CDN public, privé,…etc.

1 « J'aime »

Ceci dit les navigateurs pourraient très bien utiliser l’attribut HTML integrity pour gérer une sorte de cache locale. Si le même hash est demandé alors on retélécharge pas le fichier… Ce qui mettrais fin à cet argument.

Oh… j’avais pas osé, mais oui, il y a aussi de ça je pense ou (plus grave, mais bon, je me lâche) une méconnaissance du fonctionnement primaire d’internet (et des réseaux, et du hardware, etc).

Je me suis battu il y a peu avec une appli incapable de traiter un hit en moins de plusieurs centaines de ms sur la homepage. La réponse des « dev »: tu mets un load balancer et plus de VM derrière.

Signé: un vieux geek au premier ordi qui n’avait que 16Ko de RAM (et un magnétocassette)

1 « J'aime »

Niveau performance, je lis quand même souvent que l’usage d’un cdn est conseillé (limite du nombre de requête, serveurs plus proches de l’utilisateur, cache global, cache correctement configuré, http 2).
Mais bon quel est l’intérêt de celui qui conseille ça ?
Et je me suis toujours demandé si un service gratuit type cdn propose vraiment une meilleur performance que mon hébergeur payant…

Je pense que la majorité des CDN gratuits reposent sur des CDN payants.

Avec HTTP/2 la limite en nombre de requêtes parallèles n’a plus trop d’importance, tout est multiplexé dans un flux TCP. Si le cache est bien configuré, les URL stables, que tu gère ça en « static » et pas via toute le reste de la stack, ça dépote.

Pour le côté « plus proche », ça n’a de réelle importance que pour la latence initiale… et ça aussi http/2 l’élimine grandement (en attendant http/3 encore plus radical), surtout depuis la généralisation d’https un peu bavard au démarrage.

Autre avantage: sans CDN moins de résolutions DNS et de négo TLS… pas neutre non plus en latence :wink:

Bref, quand les fondamentaux sont correctement mis en place (http/2, static, cache, dns) pour l’ensemble de ton site, le CDN pour quelques bouts de script et quelques polices n’apporte vraiment plus grand chose.

Pour ta home mon firefox m’indique:

  • 209ms pour le / de redirection vers /fr, dont 29ms pour le DNS et… 171ms pour TLS
  • 6ms pour la vraie home en /fr
  • 5 css… la tienne arrive en 6ms, les autres (cdn) entre 25 et 78ms à cause des résolution DNS et de l’établissement des connexions TLS
  • 4 js… le tien 320ms, car sur un autre domaine, donc DNS + TLS… mais les CDN restent à 55/78ms
  • 5 polices… de 16 à 34ms pour chaque
  • 10 images, dont une (favicon.ico) sur un 3ème domaine maison (app.agorakit.org) donc re DNS+TLS juste pour elle

Sur les 1.95Mo transférés en 1.87s, 1.64Mo venaient de tes 3 domaines, donc 15% seulement viennent des CDN.

1 « J'aime »

Ah oui le site de présentation je n’ai fait aucun effort. Par contre sur https://app.agorakit.org/ ça me semble déjà mieux. Mais j’ai quand même une page qui fait 2 mb, c’est fou.

Au niveau des optimisations, je devrais charger les scripts quand ils sont nécessaires (principalement ckeditor et full calendar qui font bien 1mb à eux seul).

Cela dit le site est très rapide une fois chargé, il y a 2 niveaux de cache côté client : unpoly a un cache de 60 secondes + un service worker avec stratégie qui privilégie le réseau pour le contenu html et qui privilégie le cache pour le reste. Les service workers ça change pas mal la donne, et encore là je débute.

Une requête vers un CDN, c’est une requête de tierce partie qui peut potentiellement constituer, à mon sens, un non-respect de la Charte si les CDN en question sont hébergés par des acteurs qui ne sont manifestement pas bienveillants (une pensée toute particulière à gstatic.com, de Google, que l’on retrouve partout).

Un CDN tolérable (de mon point de vue, une fois de plus) serait hébergé par le CHATONS lui-même ou un autre CHATONS, ou un hébergeur éthique qui ne fait pas partie du collectif.

Qui plus est, a priori, à l’échelle d’un CHATONS, le gain de performance apporté par un CDN est assez négligeable, à moins d’avoir un trafic vraiment important…

~ Neil

1 « J'aime »

Le CDN a une véritable utilité si t’as un très fort trafic sur des sites dynamiques. Genre si tu dois gérer des milliers ou millions de requêtes par seconde. Clairement le CDN a sa place voire est indispensable dans de tels cas ! Il te permet de te focaliser sur les traitements au coeur de ton activité.

Une ressource concernant les principes de design sur des archi à fort trafic : https://github.com/donnemartin/system-design-primer#content-delivery-network

1 « J'aime »

Ce qui serait très intéressant serait un CDN éthique !

2 « J'aime »

Ca pourrait être un genre de proxy pour certaines requêtes partageable entre les chatons (justement pour les librairies les plus utilisées par les différents services hébergés par les chatons).

Idéalement chaque chaton devrait héberger ce service afin d’avoir l’effet cdn (surtout le « N » :slight_smile: )

2 « J'aime »