2010-12-14 48 views
1

Mon besoin est d'agréger les statistiques en temps réel d'un serveur d'applications Web. Par exemple:Comment implémenter la base de données de statistiques en mémoire Java/Scala?

  • Combien de demandes de type de contenu X ont été fait
  • Combien de temps qu'il faut pour traiter la demande de type Y

Et ainsi de suite.

Ces données doivent être entièrement en mémoire, pas dans un fichier, pour de meilleures performances. Il ne consigne pas toutes les requêtes, mais stocke uniquement les compteurs de différents aspects.

Le moyen le plus simple que je connaisse est de stocker les valeurs dans une table de type SQL et de faire des requêtes de type SQL. L'avantage est que l'indexation est disponible immédiatement sans effort de développement. Je suppose que certaines bases de données Java intégrées comme Apache Derby feraient le travail.

L'autre solution consiste à implémenter une collection (disons une liste) et une table de hachage pour chaque "colonne d'index". De cette façon, tout est fait avec l'API des collections Java/Scala, mais je dois implémenter moi-même le mécanisme d'indexation, le tester, le maintenir, etc.

Donc, ma question est de savoir de quelle façon est-ce que vous préférez, et s'il y a d'autres moyens de mettre en œuvre facilement et rapidement cette fonctionnalité?

Merci.

+0

Je viens de découvrir RRDtool. Je me demande si c'est la façon préférée d'aller au lieu de réinventer la roue. Il y a aussi l'implémentation Java appelée rrd4j (https://rrd4j.dev.java.net/) –

Répondre

3

Je choisirais H2 database, j'ai des expériences très positives avec elle, la performance est très bien aussi. Etes-vous sûr que la base de données SQL est bien adaptée à vos besoins, et avez-vous regardé javamelody, pour voir si cela correspond à vos besoins, ou si cela ne vous convient pas, jetez un oeil à JRobin pour une implémentation de base de données roulante.

0

J'imagine que vous avez seulement besoin d'une collection par type d'information que vous avez besoin de collectionner. Pour améliorer les performances, simplifiez le code que j'utiliserais TObjectIntHashMap. par exemple.

Combien de demandes de type de contenu X ont été fait

TObjectIntHashMap<ContentType> contentTypeCount 
    = new TObjectIntHashMap<ContentType>(); 

contentTypeCount.increment(contentType); 

Pendant combien de temps il faut pour traiter la demande de type Y

TObjectLongHashMap<ProcessType> contentTypeTime 
    = new TObjectLongHashMap<ProcessType>(); 

contentTypeTime.adjustValue(processType, processTime); 

Je ne voyez comment vous pouvez le rendre plus court/plus simple/plus rapide en utilisant les autres approches que vous avez mentionnées.

Le temps moyen pour effectuer incrément (clé) sur mes machines prend 15 ns (milliardièmes de seconde)

0

J'ai aussi été remarqué à propos Twitter Ostrich qui est une bibliothèque de statistiques pour Scala.

Il contient des compteurs, des jauges et des compteurs de temps.

Les données sont accessibles à partir de l'API HTTP REST.