24 points par GN⁺ 2024-09-30 | 2 commentaires | Partager sur WhatsApp

Depuis Go 1.22, la bibliothèque standard offre une meilleure prise en charge du routage

  • Auparavant, il fallait gérer le routage manuellement, mais il est désormais possible de le faire simplement avec mux.HandleFunc
  • Il est possible d’ajouter un middleware de connexion pour renforcer la sécurité

Point d’attention avec le routeur intégré : les redirections dues au slash final

  • Si l’on crée la route /records/, une requête vers /records sera redirigée vers /records/
  • Cela peut poser un problème : le corps d’une requête POST peut être supprimé et la requête transformée en GET
  • La solution consiste à utiliser des endpoints d’API comme POST /records plutôt que POST /records/

Génération automatique du code de requêtes SQL avec sqlc

  • Découverte de l’outil sqlc, qui permet d’écrire des requêtes SQL sans avoir à apprendre un ORM
  • Une fois les requêtes SQL écrites, elles sont automatiquement converties en code Go
  • Il devient ainsi facile d’écrire les requêtes SQL nécessaires sans devoir consulter la documentation d’un ORM

Conseils d’optimisation pour sqlite

  • Utiliser un objet dédié à l’écriture pour la base de données et définir db.SetMaxOpenConns(1)
  • Pour accélérer la lecture, utiliser des objets DB distincts pour l’écriture et la lecture
  • Deux tables qui n’ont pas besoin de JOIN peuvent être placées dans des bases de données séparées et connectées indépendamment

Définir une limite mémoire pour le GC de Go 1.19

  • En exécutant tous les projets Go sur une VM disposant d’une quantité de mémoire relativement faible, comme 256MB ou 512MB, l’application se faisait régulièrement tuer par des erreurs OOM
  • À cause de la configuration par défaut du garbage collector, l’allocation mémoire peut monter jusqu’à deux fois la taille actuelle du heap
  • Go 1.19 a ajouté un moyen d’indiquer à l’application de lancer le GC lorsqu’un certain niveau d’utilisation mémoire est atteint
  • Après avoir défini la limite mémoire du GC à 250MB, la fréquence des arrêts OOM a diminué export GOMEMLIMIT=250MiB

Pourquoi créer un site web avec Go

  • Le déploiement est simple grâce à un binaire statique unique
  • Un serveur web intégré utilisable en production est fourni, sans avoir besoin de configurer WSGI ou autre
  • La toolchain de Go est simple à installer et à utiliser
  • Envoyer des réponses HTTP est simple, ce qui facilite la maintenance des projets
  • La bibliothèque standard inclut net/http, ce qui permet de créer un site web sans installer de bibliothèques supplémentaires
  • Il est aussi facile d’effectuer des tâches au niveau système
  • Tout semble conçu pour rendre les projets faciles à manipuler

Problèmes qui ne sont pas encore résolus

  • Certaines choses n’ont pas encore été beaucoup pratiquées en Go
    • Le rendu de templates HTML
    • L’implémentation d’un véritable système de connexion
    • La mise en place de la protection CSRF
  • De manière générale, comme il n’est pas encore très clair comment implémenter des fonctionnalités sensibles du point de vue de la sécurité, les projets nécessitant connexion/CSRF ne sont pas commencés

C’est agréable de voir les nouvelles fonctionnalités de Go

  • Les deux fonctionnalités de Go mentionnées dans ce texte (GOMEMLIMIT et le routage) ont été ajoutées au cours des dernières années
  • Il faudrait sans doute prêter davantage attention aux release notes des nouvelles versions de Go

2 commentaires

 
secret3056 2024-09-30

sqlc, c’est vraiment excellent.

 
GN⁺ 2024-09-30
Avis Hacker News
  • Le langage Go permet de retravailler sur un projet sans difficulté, même après y avoir travaillé 5 jours puis l’avoir laissé de côté pendant 2 ans
  • L’apprentissage de Go a commencé il y a plusieurs années, mais le langage a très peu changé, ce qui le rend toujours utile après longtemps
  • Il est dommage que le package embed ne soit pas mentionné dans l’article sur le développement web en Go
    • Regrouper des ressources statiques dans un binaire unique est très pratique
  • Les transactions de base de données sont conçues pour pouvoir échouer, il faut donc toujours utiliser une boucle de retry
    • Il est conseillé d’ajouter Context à la boucle de transaction pour permettre l’annulation
  • sqlc a quelques limitations majeures et de petits désagréments, il vaut donc mieux consulter la liste des issues avant de l’utiliser
    • Ne prend pas en charge les requêtes dynamiques, les relations un-à-plusieurs, les CTE imbriquées, les types composites, etc.
    • Convient pour des besoins simples, mais pour des tâches complexes il faut adopter une approche manuelle
  • Lorsqu’on exécute Go dans un conteneur, il faut configurer correctement GOMAXPROCS pour éviter le throttling CPU
  • Utiliser GOMEMLIMIT permet de moins se soucier du GC
    • Il peut être défini automatiquement lors de l’utilisation de Kubernetes ou Docker
  • html/template est étrange et présente de nombreux problèmes, il vaut donc mieux l’éviter
    • Templ est préféré à la place
  • La mention du routage est appréciée
    • Habitué à mux depuis longtemps, sans avoir prêté attention aux nouvelles fonctionnalités des dernières versions
  • Après un mois d’utilisation de Go dans un nouveau travail, certains le détestent
    • Go donne l’impression de n’avoir rien appris des 20 dernières années de développement des langages
    • Le problème de nil complique même les tâches simples
  • Lors de l’utilisation de SQLite, il est recommandé d’avoir un pool d’écriture mono-thread et un autre pool pour la lecture
    • BEGIN CONCURRENT peut être utilisé pour améliorer la concurrence
  • La simplicité de Go et l’absence de dépendance à un framework sont très appréciées
    • Avec seulement la bibliothèque standard et des bibliothèques tierces éprouvées, on peut construire d’excellentes choses
    • Go est adapté à la création d’applications web ou d’outils CLI
    • La gestion explicite des erreurs est appréciée
    • Grand fan de Go