Question

L'entreprise où je travaille pour créer des applications pour la plate-forme Blackberry.

Nous avons travaillé sur un « système d'analyse » propriétaires qui nous permet d'intégrer du code dans nos applications et ont les applications rendent compte des statistiques à nos serveurs centraux à chaque fois qu'ils sont exécutés. À l'heure actuelle, le système fonctionne bien; mais il est seulement en version bêta avec 100-200 visites par heure. Les « coups » sont envoyés aux serveurs sans problème. Nous avons construit une API très solide pour gérer l'acceptation et le stockage des coups (dans une base de données MySQL). Nous avons testé la charge et nous devrions être en mesure d'accueillir des centaines de milliers de visites par heure sans problème. Ce n'est pas vraiment un problème.

Le problème montre les statistiques. Nous avons construit un panneau d'affichage similaire, il montre les coups de menthe (haveamint.com) sur chaque heure, les derniers jours, des mois, des semaines, des années ... etc. La version poing a couru requêtes droites tirant des données de la table hits et d'interprétation à la volée. Cela ne fonctionne pas très longtemps. Notre solution actuelle est que les hits sont « mis en attente » pour le traitement et nous avons un Cron venir à travers toutes les 5 minutes en prenant les coups et les triant dans « caches » pour chaque heure, jour, semaine, mois, année ... etc. Cela fonctionne incroyable et il est incroyablement évolutif; cependant, il ne fonctionne que pour 1 fuseau horaire. nous Depuis toute l'entreprise a accès à cela, face à quelques centaines d'utilisateurs dans différents fuseaux horaires. Ce que je définirais comme « aujourd'hui » à San Jose est très différent de ce que mon collègue à Londres définit comme aujourd'hui. Étant donné que la solution actuelle est uniquement mis en mémoire cache à 1 fuseau horaire, c'est un cauchemar pour tous ceux qui vérifie de données en dehors de notre fuseau horaire.

Notre plan actuel pour résoudre ce problème est de créer des caches pour chaque fuseau horaire (40 au total); Cependant, cela voudrait dire que nous multiplions la quantité de données de 40 ... qui est terrible pour moi et étant donné que les caches peuvent être très grandes, multipliant ça sonne comme une mauvaise idée; De plus, quand nous allons traiter la file d'attente, il va prendre beaucoup plus de temps CPU pour les mettre dans 40 caches différentes.

Toute autre ont une meilleure idée de la façon de résoudre ce problème?

(Désolé pour une si longue question..it est pas vraiment facile à expliquer. Merci à tous!)

Était-ce utile?

La solution

La solution que vous proposez a trop de redondance. Je vous suggère de stocker les données dans au moins seaux de 30 minutes au lieu de toutes les heures et le fuseau horaire UTC à être normalisée.

Avec des seaux de 30 minutes, si un utilisateur demande des données horaires pour 1 - 14 heures de -4,5 UTC vous pouvez récupérer les données pour 5:30-18:30 de votre système et montrer que. Si vous stockez des données par incréments d'une heure, vous ne pouvez pas répondre aux requêtes aux utilisateurs dans les zones de temps avec N + 0,5 différences d'heure.

Pour connaître les numéros quotidiens vous devez regrouper 48 emplacements demi-heure. Les fentes pour choisir seraient déterminés par le temps de l'utilisateur de la zone.

Il devient intéressant quand vous obtenez des données annuelles parce que vous finissez par avoir à agréger 17,520 seaux demi-heure. Pour faciliter ce calcul, je vous conseille de prendre les données annuelles pré-agrégées par heure UTC et les données agrégées de Soustraire pour la première pendant 4,5 heures de l'année et ajouter des données agrégées pour les 4,5 premières heures de l'année prochaine. Ce sera essentiellement passer toute l'année de 4,5 heures et le travail n'est pas tant que ça. Travailler à partir d'ici, vous pouvez modifier davantage le système.

EDIT:. Active à Katmandou est 5,45 GMT alors vous devez stocker les données dans des seaux de 15 minutes au lieu de seaux de 30 minutes

EDIT 2: Une autre amélioration est facile avez agrège autour de vous annuel alors ne pas ajouter 17,520 seaux à chaque fois et sans nécessiter un agrégat par pays. Agréger les données annuelles du 02 janvier à décembre 30. Depuis la différence de fuseau horaire maximale entre deux pays est de 23 heures, cela signifie que vous pouvez prendre les données annuelles (2 janvier-30 décembre) et ajouter quelques seaux avant et après le cas échéant. Par exemple, pour un fuseau horaire UTC -5 vous ajouteriez tous les seaux sur 01 Jan après 0500, tous les seaux le 31 déc et 01 janv l'année suivante jusqu'à 0500 heures.

Autres conseils

Lors de la conception de logiciels qui touche plusieurs fuseaux horaires, je dirais toujours stocker vos dates / heures dans UTC avec un autre domaine pour le fuseau horaire original et une fonction qui prend le temps et le convertit en provenance et à UTC / fuseau horaire. Vous vous éviterez beaucoup de mal à gérer les différents cas de changement de date, l'heure d'été, les gens regardant les statistiques d'un pays de l'autre côté de la terre et ainsi de suite ....

Dans votre cas, ayant les caches en UTC et juste régler les demandes à convertir en UTC devrait aider. Ne pas stocker une stat comme étant « aujourd'hui », la stocker pendant des heures 00: 00: 00UTC à 23: 59. 59UTC et quand quelqu'un demande les statistiques pour aujourd'hui à New York, faire la conversion

Pour autant que je peux voir, vous êtes à la recherche de la partie de stockage d'un système d'entrepôt de données ici (vos rapports seraient le front-end).

En fait, la façon dont les systèmes commerciaux le font, est le cache que vous avez décrit: Preaggregate vos tables et créer des caches d'entre eux. La seule façon d'accélérer vos requêtes est de rendre le système de base de données ne moins pour eux. Cela signifie moins de données, ce qui signifie moins de temps passé à itérer les données ou moins de données dans les indices.

Cela dit, je propose soit la « solution à 40 cache » (y at-il vraiment plus de 24 fuseaux horaires). Vous devriez être en mesure de paralléliser trivialement la file d'attente de tri en créant des copies des données.

Une autre façon de le faire, serait de mettre en cache à l'heure granularité puis agréger les heures en jours (ou 30 minutes si vos fuseaux horaires exigent cela). Cela signifie que vous mettez en cache à une granularité plus fine que votre cache quotidienne, mais à une granularité plus grossière que les données d'origine.

ce type de données sont généralement stockées en utilisant round-robin ou des bases de données circulaires. vérifier http://www.shinguz.ch/MySQL/mysql_20070223.html cette http: //techblog.tilllate. com / 2008/06/22 / round-robin-stockage de données en MySQL / pour savoir comment ils fonctionnent et comment mettre en œuvre sous MySQL

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top