2010-12-30 1 views
8

Je travaille sur une application web qui, historiquement, était construite sur une pile PHP/MySQL. L'une des principales opérations de l'application consistait à effectuer des calculs lourds qui nécessitaient une itération sur chaque ligne d'une table DB entière. Inutile de dire que c'était un sérieux goulot d'étranglement. Il a donc été décidé de réécrire l'ensemble du processus en Java.L'utilisation de serveurs Web dynamiques a-t-elle un sens?

Cela nous a donné deux avantages. L'un était que Java, en tant que langage, était beaucoup plus rapide qu'un processus PHP. La seconde était que nous pouvions conserver l'ensemble des données dans la mémoire du serveur d'applications Java. Alors maintenant, nous pouvons faire les opérations lourdes de calcul en mémoire, et tout se passe beaucoup plus vite.

Cela a fonctionné pendant un certain temps, jusqu'à ce que nous nous rendions compte que nous avions besoin d'évoluer, nous avons donc besoin de plus de serveurs Web.

Le problème est - par la conception actuelle, ils doivent tous maintenir exactement le même état. Ils interrogent tous la base de données, traitent les données et la conservent en mémoire. Mais que se passe-t-il lorsque vous devez modifier ces données? Comment tous les serveurs conservent-ils leur cohérence?

Cette architecture me semble imparfaite. Les performances bénéficient de la conservation de toutes les données en mémoire, ce qui nuit considérablement à l'évolutivité.

Quelles sont les options d'ici? Passer à un magasin de données en mémoire, à valeur-clé? Devrions-nous abandonner l'état de conservation à l'intérieur des serveurs Web entièrement?

Répondre

4

Passons maintenant à l'Erlang :-)

ouais, c'est une blague; mais il y a un grain de vérité. le problème est le suivant: vous aviez initialement votre état dans un référentiel externe partagé: la base de données.maintenant vous l'avez (partiellement) précalculé dans un dépôt interne non partagé: objets RAM Java. Le moyen le plus évident est de le faire encore précalculé mais dans un référentiel partagé externe, le plus vite sera le mieux.

Une réponse facile est memcached. Un autre est de construire votre propre 'serveur de calcul', qui centralise à la fois la tâche de calcul et les résultats (partiels). Les processus web frontend accèdent simplement à ce serveur. À Erlang, ce serait la façon naturelle de le faire. Dans d'autres langues, vous pouvez le faire, juste plus de travail. Vérifiez l'inspiration de ZeroMQ, même si vous ne l'utilisez pas à la fin (mais c'est une très bonne implémentation).

+0

+1 pour le grain de vérité. – duffymo

1

Cela peut être un cliché, mais les données se développent toujours pour remplir l'espace dans lequel vous l'avez placé. Vos données peuvent toutes tenir dans la mémoire aujourd'hui, mais je vous garantis qu'il ne le sera pas dans le futur. À quelle distance se trouve le délai que vous avez pour trouver une meilleure architecture. L'état de votre demande n'est qu'un symptôme de ce problème plus important.

Est-ce que tout le monde fait des calculs différents sur l'ensemble des données? Est-ce quelque chose que vous pouvez faire dans un lot pendant la nuit et avoir accès aux gens pendant la journée? À quel point est-il sensible au temps?

Je pense que ce sont les questions auxquelles vous devez répondre parce qu'à un moment donné, vous ne serez pas en mesure d'acheter suffisamment de mémoire pour stocker les données dont vous avez besoin. Cela peut sembler stupide étant donné où vous êtes maintenant, mais vous devriez prévoir que cela soit vrai. Beaucoup de développeurs à qui j'ai parlé ne pensent pas à ce que le succès ressemble et quel impact il a sur leurs conceptions.

+0

Je suis entièrement d'accord avec vous. Nous * atteindrons un point où la conservation de toutes ces données en mémoire sera un problème. Quelles solutions existent pour cette situation? Un magasin de données K-V est-il une option? Stocker une fois pour tous les serveurs Web? Ou encore, si les données brutes sont stockées dans une base de données lourde sur le backend, où stockez-vous les métadonnées auxquelles vous devriez avoir accès facilement? –

+0

Je ne connais pas assez la nature de vos données ou de vos calculs pour vous aider. – n8wrl

1

Je suis d'accord avec vous - cela semble défectueux, mais j'aurais besoin de plus de détails pour être sûr. Vous mentionnez un grand ensemble de données et des calculs lourds, mais vous ne parlez pas de la façon dont les données sont mises à jour, quand les calculs sont effectués, que ce soit la valeur d'une journée ou l'ensemble des données, etc. beaucoup comme un travail par lots qui pourrait être fait quotidiennement hors ligne.

Si c'est le cas, je ne sais pas où le web se rattache. Est-ce que vos utilisateurs web font juste des requêtes personnalisées après le crunching? Les données sont-elles en lecture seule ou en lecture, principalement pour les utilisateurs? Ou changent-ils les données continuellement à la volée? Je me demande si la technologie de persistance que vous avez choisie affecte les choses? Peut-être qu'une alternative NoSQL pourrait être meilleure pour votre problème - comme un cluster MongoDB distribué.

+0

En général, où est-il approprié de stocker les métadonnées, ce qui aide les calculs lourds à fonctionner plus rapidement? –

1

C'est une question de moteur de données, je crois, autant que c'est une question de distribution de serveur Web. Pourquoi votre moteur de base de données (central) ne peut-il pas faire le calcul (assez rapidement)?

Vous pouvez stocker des valeurs précalculées marquées comme obsolètes lorsque les données sous-jacentes sont modifiées, ce qui nécessite un recalage. Il n'y a pas moyen de contourner le besoin de recalculer lorsque les données changent. Vous avez juste besoin de gérer quand et comment le changement se produit car cela affectera les consommateurs des données.

+0

La base de données contient uniquement les données brutes. Il n'est pas conçu pour contenir les méta-données dérivées des données brutes. –

+1

Je ne pense pas qu'il est approprié d'appeler des calculs basés sur des données "métadonnées". Ce terme pourrait induire en erreur. Les métadonnées sont des données sur des données, et non sur des données dérivées de données. En tout cas, le moteur de données est l'OMI l'endroit approprié et le plus simple pour résoudre la question. Le moteur de données a une capacité de calcul et la structure de la base de données est extensible. L'alternative est un schéma complexe dans lequel les clients clients des données s'abonnent à un service de publication de changements, afin de rafraîchir leurs copies locales distribuées. – Tim

Questions connexes