Si je vais mettre un programme en production, il y a plusieurs choses que j'ai besoin de ce programme pour le considérer "opérationnalisée" - c'est-à-dire de manière à une manière mesurable et contrôlée de manière mesurable et vérifiable des ingénieurs et du personnel des opérations. À mes fins, un programme opérationnel doit:
Dans le Scala World, il existe de bonnes bibliothèques pour traiter au moins les trois premières exigences. Exemples:
En ce qui concerne le déploiement, une approche prise dans le fichier Scala World est de regrouper le bytecode et les bibliothèques qui composent son programme avec quelque chose comme Assemblage-sbt , puis poussez le résultat résultant. Bundle (un "bocal gras") aux serveurs distants avec un outil comme - Capistrano qui exécute des commandes en parallèle sur SSH. Ce n'est pas un problème qui nécessite des outils spécifiques à la langue, mais je suis curieux si Un tel outil existe dans la communauté Haskell.
Il y a probablement des bibliothèques de haskell qui fournissent les traits que j'ai décrits ci-dessus. J'aimerais savoir laquelle des bibliothèques disponibles sont considérées comme "meilleures"; C'est-à-dire que les plus matures, bien entretenues, couramment utilisées dans la communauté Haskell et exemplaires des meilleures pratiques de haskell.
S'il y a d'autres bibliothèques, outils ou pratiques autour de la fabrication de Code Haskell "Prêt-prêt", j'aimerais aussi savoir à ce sujet.
C'est une excellente question! Voici une première coupe.
Être capable de se connecter à plusieurs niveaux (ex: débogage, avertissement, etc.).
HSlogger est facilement le cadre de journalisation le plus populaire.
Soyez capable de collecter et de partager des métriques/statistiques sur les types de travail que le programme effectue et combien de temps le travail prenait. Idéalement, les métriques collectées sont disponibles dans un format compatible avec des outils de surveillance couramment utilisés tels que des ganglions ou peuvent être ainsi connectés.
Je ne suis au courant d'aucun outil de rapport standardisé, cependant, extrayant des rapports de +RTS -s
Streams (ou via des drapeaux de sortie de profilage) a été quelque chose que j'ai fait dans le passé.
$ ./A +RTS -s
64,952 bytes allocated in the heap
1 MB total memory in use
%GC time 0.0% (6.1% elapsed)
Productivity 100.0% of total user, 0.0% of total elapsed
Vous pouvez également obtenir ceci en format lisible par la machine:
$ ./A +RTS -t --machine-readable
[("bytes allocated", "64952")
,("num_GCs", "1")
,("average_bytes_used", "43784")
,("max_bytes_used", "43784")
,("num_byte_usage_samples", "1")
,("peak_megabytes_allocated", "1")
,("init_cpu_seconds", "0.00")
,("init_wall_seconds", "0.00")
,("mutator_cpu_seconds", "0.00")
,("mutator_wall_seconds", "0.00")
,("GC_cpu_seconds", "0.00")
,("GC_wall_seconds", "0.00")
]
Idéalement, vous pouvez vous attacher à une exécution de GHC en cours d'exécution sur une prise et consultez ces statistiques de GC de manière interactive, mais ce n'est pas très super facile (nécessite une liaison FFI à l'interface "RTS/STATS.H"). Vous pouvez vous attacher à un processus à l'aide d'un processus ThreadScope
et moniteur GC et comportement de threading.
Les drapeaux similaires sont disponibles pour incrémental, enregistré -- heure et espace profilage, qui peut être utilisé pour la surveillance (par exemple, ces graphiques peuvent être construits de manière progressive).
hpc
Collecte beaucoup de statistiques sur l'exécution du programme, via son type Tix
Type et les personnes ont outils écrits pour se connecter quel code exécute.
Soyez configurable, idéalement via un système permettant de mettre à jour les propriétés configurées dans les programmes d'exécution sans redémarrer lesdits programmes.
Plusieurs outils sont disponibles pour cela, vous pouvez faire du rechargement de l'état de style xmonad; Ou déplacez-vous au code hotwapping via plugins
* paquets ou hint
. Certains d'entre eux sont plus expérimentaux que d'autres.
Déploiements reproductibles
Galois récemment libérés cabal-dev
, qui est un outil pour faire des constructions reproductibles (c'est-à-dire des dépendances sont scopées et contrôlées).
Exemple de configfile:
# Default options
[DEFAULT]
hostname: localhost
# Options for the first file
[file1]
location: /usr/local
user: Fred
J'échouerais tout ce que Don dit et ajoute quelques bits de conseils généraux.
Par exemple, deux outils et bibliothèques supplémentaires que vous voudrez peut-être envisager:
-Wall
Celles-ci sont ciblées à la qualité du code.
En tant que pratique codante, évitez les paresseux IO. Si vous avez besoin de streaming io, accédez à l'une des bibliothèques ITARTEE telles que Enumerator . Si vous regardez sur Hackage Vous verrez des bibliothèques comme http-énumérateur utilisant un style d'énumérateur pour les demandes HTTP.
En ce qui concerne les bibliothèques de cueillette sur Hackage, il peut parfois aider à regarder combien de packages dépendent de quelque chose. Voir facilement les dépendances inverse d'un colis que vous pouvez utiliser ce site Web, qui miroirs piratage:
Si votre application finit par faire des boucles serrées, comme un serveur Web gérant de nombreuses demandes, la paresse peut être un problème sous la forme de fuites d'espace. Il s'agit souvent d'ajouter des annotations de strictisme dans les bons endroits. Les principales techniques que je connaises pour la lutte contre ce genre de chose sont des techniques de profilage, d'expérience et de lecture. La meilleure référence de profilage que je connaisse est chapitre 25 de World Haskell .