Je travaille sur une application Web, qui a toujours été construite sur une pile PHP / MySQL. P>
L'une de ces opérations clés de l'application a dû effectuer des calculs lourds qui nécessitaient itérant sur chaque rangée d'une table de DB entière. Inutile de dire que c'était un goulot d'étranglement sérieux. Ainsi, une décision a été prise de réécrire tout le processus en Java. P>
Cela nous a donné deux avantages. L'un était que Java, en tant que langue, était beaucoup plus rapide qu'un processus PHP. Le second était que nous pouvions maintenir l'ensemble des données définies dans la mémoire de serveur d'applications Java. Alors maintenant, nous pouvons faire les opérations de calcul des fortes en mémoire, et tout se passe beaucoup plus vite. P>
Cela a travaillé pendant un certain temps, jusqu'à ce que nous réalisions, nous devons augmenter, nous avons donc besoin de plus de serveurs Web. P>
Problème est - par conception actuelle, ils doivent tous conserver exactement le même état. Ils interrogent tous la dB, traitent les données et le maintiennent en mémoire. Mais que se passe-t-il lorsque vous devez modifier ces données? Comment tous les serveurs maintiennent-ils la cohérence? P>
Cette architecture me semble imparfaite. La performance bénéficie de la tenue de toutes les données en mémoire est évidente, mais cela entrave sérieusement l'évolutivité. P>
Quelles sont les options d'ici? Basculez vers une mémoire en mémoire, une valeur de la clé, un magasin de données? Devrions-nous abandonner l'état de maintien à l'intérieur des serveurs Web entièrement? P>
4 Réponses :
Ceci peut être cliché, mais les données se développent toujours pour remplir l'espace que vous avez placé. Vos données pourraient tous correspondre à la mémoire aujourd'hui, mais je vous garantissons que cela ne sera pas à un moment donné à l'avenir. À quelle distance c'est-à-dire que c'est le délai que vous devez trouver une meilleure architecture. L'état de votre application est juste un symptôme de ce problème plus important. P>
Est-ce que tout le monde fait des calculs différents sur l'ensemble du jeu de données? Est-ce quelque chose que vous pouvez faire dans un lot de nuit et avoir accès aux gens pendant la journée? Dans quelle mesure est-il sensible? P>
Je pense que ce sont les questions dont vous avez besoin pour répondre à Becuase à un moment donné, vous ne pourrez pas acheter suffisamment de membres pour stocker les données dont vous avez besoin. Cela pourrait sembler idiot donné où vous êtes maintenant, mais que vous devriez planifier cela être vrai. De nombreux développeurs, je parlais de ne pas penser à ce que ressemble à la réussite et quel impact il a sur leurs conceptions. P>
Je suis totalement d'accord avec vous. Nous I> va i> un point où contenir toutes ces données en mémoire va être un problème. Quelles solutions existent pour cette situation? Une banque de données K-V est-elle une option? Stocker une fois pour tous les serveurs Web? Ou en outre, si les données brutes sont stockées dans une DB lourde sur le backend, où stockez-vous des méta-données qui doivent être facilement accessibles?
Je ne sais pas assez sur la nature de vos données ou des calculs pour vous aider avec cela.
Je suis d'accord avec vous - cela semble imparfait, mais j'aurais besoin de plus en détail pour savoir à coup sûr. P>
Vous mentionnez un ensemble de données volumineux et des calculs lourds, mais vous ne parlez pas de la mise à jour des données, lorsque les calculs sont effectués, qu'il s'agisse d'une journée de données ou de l'ensemble de données, etc. Il sonne un Lot comme un travail de lot qui pourrait être fait quotidiennement hors ligne. p>
Si c'est le cas, je ne suis pas sûr de l'endroit où le Web se lie. Vos utilisateurs Web sont-ils simplement en train de faire des questions personnalisées après que le crunching est effectué? Les données sont-elles en lecture seule ou en lecture-la-loi pour les utilisateurs? Ou change-ils continuellement les données à la volée? P>
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 de MongoDB distribué. P>
De manière générique, où est-il propre pour stocker les méta-données qui aide les calculs lourds à courir plus vite?
Passez maintenant à Erlang: -) p>
Ouais, c'est une blague; Mais il y a un grain de vérité. La question est la suivante: vous avez à l'origine votre état dans un référentiel externe et partagé: la DB. Maintenant, vous l'avez (partiellement) préalculé dans un référentiel interne non partagé: des objets Java RAM. La manière évidente est de le faire toujours précalculée mais dans un référentiel partagé externe, plus il est plus rapide. P>
Une réponse facile est memcached. p>
Un autre consiste à construire votre propre "serveur de calcul", qui centralise à la fois la tâche de calcul et les résultats (partiels). Les processus Web avanttend ont simplement accès à ce serveur. Dans Erlang, ce serait le moyen naturel de le faire. Dans d'autres langues, vous pouvez le faire, juste plus de travail. Vérifiez Zeromq pour l'inspiration, même si vous ne l'utilisez pas à la fin (mais c'est un putain de bonne implémentation). P>
Il s'agit d'une question de moteurs de données, je crois, autant qu'il s'agit d'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)? P>
Vous pouvez stocker des valeurs préalculées qui sont signalées comme étalées lorsque les données sous-jacentes sont modifiées, nécessitant un recalc. Il n'y a pas de contourner la nécessité de recalculer lorsque des données changent. Il vous suffit de gérer quand et comment le changement se produit car il affectera les consommateurs des données. P>
La base de données ne détient que les données brutes. Il n'est pas conçu pour contenir les méta-données dérivées des données brutes.
Je ne pense pas qu'il soit 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 les données et non des données dérivées des données. Dans tous les cas, le moteur de données est imo le lieu 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 consommateurs clients des données s'abonnent à un service de publication de changement, afin qu'ils puissent actualiser leurs copies distribuées locales de l'ensemble de données de base.