Camp de codes de Boston 31

Optimiser l'ASP.NET Core Performances avec cache distribué

Par Iqbal Khan
Président et évangéliste de la technologie

ASP.NET Core devient rapidement populaire pour le développement d'applications Web à fort trafic. Apprenez à optimiser l'ASP.NET Core performances pour gérer des charges de transaction extrêmes sans ralentir en utilisant un cache distribué .NET Open Source. Cette conversation porte sur :

  • Aperçu rapide de l'ASP.NET Core goulets d'étranglement de performance
  • Présentation de la mise en cache distribuée et de la manière dont elle résout les problèmes de performances
  • Où pouvez-vous utiliser la mise en cache distribuée dans vos applications
  • Quelques fonctionnalités importantes du cache distribué
  • Exemples pratiques utilisant Open Source NCache en tant que cache distribué

Ok merci, tout le monde, est-ce que tout le monde m'entend bien ? D'accord, j'ai oublié d'inclure la diapositive, remerciant tous les sponsors. Je vais juste aller sur le site et vous montrer les logos de tous les sponsors. nous sommes l'un d'eux d'ailleurs, donc, je le montrerai également à la fin. C'est ce que nous ont dit les organisateurs. Donc, je vais revenir sur ce sujet et j'aimerais garder cette conversation plus interactive si possible. Donc, si vous avez des questions, n'hésitez pas à m'arrêter. Laissez-moi juste m'assurer que tout est enregistré.

Donc, le sujet d'aujourd'hui est de savoir comment optimiser ASP.NET core performances applicatives avec mise en cache distribuée ? Je vais utiliser un produit open source appelé NCache. Combien ici ont entendu parler de NCache avant que? C'est un bon chiffre. D'accord, je vais utiliser NCache par exemple. Ce discours ne concerne pas NCache, il s'agit d'ASP.NET Core performances et comment utiliser la mise en cache ? Donc, je suis sûr que vous étiez ici parce que l'ASP.NET core est devenu populaire, il devient populaire, c'est la nouvelle architecture légère et propre, c'est la technologie multiplateforme, la réarchitecture de .NET est open source, il y a beaucoup d'applications héritées ASP.NET qui migrent également vers ASP.NET core. ASPIC.NET core sera la principale technologie avec laquelle vous développerez des applications Web en .NET.

Ainsi, de plus en plus de personnes développent maintenant des applications qui ont besoin d'évolutivité. Alors, ASP.NET core bien sûr aussi besoin d'évolutivité. Permettez-moi de définir rapidement ce qu'est l'évolutivité ? Je suis sûr que la plupart d'entre vous le savent déjà, mais à des fins d'exhaustivité, je vais définir cela.

Qu'est-ce que l'évolutivité?

L'évolutivité, c'est si vous avez une application qui a un très bon temps de réponse, elle fonctionne vraiment bien avec cinq utilisateurs, si vous pouvez maintenir les mêmes performances avec cinq mille, cinquante mille, cinq cent mille utilisateurs, votre application est évolutive. Si votre application ne fonctionne pas bien avec cinq utilisateurs, alors vous avez d'autres problèmes que nous n'allons pas aborder ici. Donc, je vais parler de la façon dont vous pouvez maintenir ces bonnes performances de cinq utilisateurs à cinquante mille ou cinq cent mille utilisateurs.

Évolutivité linéaire

L'évolutivité linéaire signifie que votre application est conçue de telle manière que vous pouvez simplement ajouter plus de serveurs en production à mesure que votre charge augmente et que vous ajoutez plus de serveurs, votre capacité de transaction augmente et c'est ce qui vous donne cette bonne performance si vous êtes capable de maintenir évolutivité linéaire. Si vous n'êtes pas en mesure de maintenir une évolutivité linéaire, il y a une sorte de goulot d'étranglement auquel votre application sera confrontée très bientôt lorsque vous ajouterez plus de serveurs, bientôt peu importe si vous ajoutez plus de serveurs ou non et vous allez vient de frapper un goulot d'étranglement, il y a et je vais parler du goulot d'étranglement.

Les applications suivantes ont besoin d'évolutivité

Alors, quelles applications ont besoin d'évolutivité ? Généralement, les applications serveur, ce sont des applications web, ASP.NET core, des services Web, qui sont utilisés par d'autres applications Web. Les services Web peuvent être des applications indépendantes utilisées par des applications externes ou ils peuvent faire partie d'applications Web que vous développez, de toute façon, s'ils sont à transactions élevées, ils auront également besoin d'évolutivité.

Les microservices deviennent un nouveau mot à la mode, c'est ainsi que vous voulez réorganiser votre application. Les microservices vont également utiliser leur technologie côté serveur, ils sont utilisés dans des applications à transactions élevées et auront besoin d'évolutivité. Pour toutes les autres applications serveur, de nombreuses grandes organisations ont un traitement par lots dans le backend et elles doivent effectuer un workflow dans le backend. Un tas d'applications de serveur principal qui ont juste besoin d'essayer de gérer un grand nombre de transactions, elles vont également avoir besoin d'évolutivité. Donc, si votre entreprise ou si vous êtes engagé dans l'un de ces types d'applications et que vous souhaitez avoir ces bonnes performances, c'est la conversation qu'il vous faut.

Le problème de l'évolutivité

Donc, maintenant que nous avons établi que vous avez compris que ces applications ont besoin d'évolutivité, y a-t-il un problème d'évolutivité ? Oui, il y en a et ce n'est pas dans le niveau application, l'ASP.NET core application, vous pouvez très facilement ajouter plus de serveurs à mesure que la charge de transaction augmente, et généralement, vous avez un équilibreur de charge devant le niveau application, qui dirige le trafic uniformément vers tous les serveurs et comme vous avez de plus en plus d'utilisateurs, il vous suffit d'ajouter plus de boîtes, pas de problème là-bas. Le problème est bien sûr le stockage des données ou les bases de données. Ce sont vos bases de données relationnelles, votre ordinateur central et c'est l'une des raisons pour lesquelles NoSQL databases ont commencé à gagner du terrain, mais il s'avère que dans la majorité des situations, vous devez toujours utiliser des bases de données relationnelles, pour des raisons techniques et non techniques. Donc, si vous regardez la plupart des applications que vous avez faites ou que vous faites, vous finissez par utiliser des bases de données relationnelles dans le cas de .NET, la plus populaire étant bien sûr un serveur SQL. Donc, si vous n'êtes pas en mesure d'utiliser un NoSQL database, à quoi cela sert-il d'aider à l'évolutivité ? Et la raison est que le NoSQL database vous demande d'abandonner la base de données relationnelle et de déplacer les données dans NoSQL, ce qui pour certaines données vous pouvez, pour beaucoup de données d'entreprise vous ne pouvez pas, tous vos clients, vos comptes, vos activités tout ce qui doit encore rester dans une base de données relationnelle. Donc, vous devez résoudre ce problème d'évolutivité avec des bases de données relationnelles dans l'image et c'est pourquoi je dis que NoSQL database n'est pas toujours la réponse parce que vous n'êtes pas capable de l'utiliser.

La solution (mise en cache distribuée)

Donc, la façon de résoudre ce problème, bien sûr, est d'utiliser un cache distribué et c'est ainsi qu'un cache distribué est déployé dans votre environnement.

cache distribué

Donc, c'est le niveau application, dans certains cas, vous pouvez avoir un équilibreur de charge devant ici, qui dirige le trafic vers tous les serveurs d'applications. Dans certains cas, il peut ne pas y avoir d'équilibreur de charge, il peut y avoir un autre moyen de partager la charge car il s'agit d'applications principales, mais de toute façon, vous avez plusieurs serveurs qui exécutent vos applications. Donc, c'est très évolutif mais la base de données ne peut pas continuer à ajouter de plus en plus de bases de données. Maintenant que les sociétés de bases de données relationnelles essaient de faire tout ce qu'elles peuvent pour évoluer de leur côté, par exemple, elles ont des tables en mémoire, qui sont beaucoup plus rapides. Je pense que SQL Server n'a pas non plus introduit ce concept de répliques en lecture seule là où elles se trouvent, donc si vous combinez des tables en mémoire avec des répliques en lecture seule, vous obtenez une amélioration des performances, mais comme vous le verrez, je vais entrer dans cette. Plus vous créez de répliques, plus vous avez de maux de tête, en termes de mise à jour chaque fois que vous mettez à jour quoi que ce soit, il doit être mis à jour sur toutes les répliques. Ainsi, pour obtenir les meilleures performances avec l'évolutivité, vous devez vous assurer que vous n'avez pas plus d'un réplica. Donc, une copie principale et une réplique de chaque élément de données, et en même temps, vous devez pouvoir évoluer. Ainsi, la raison pour laquelle ils ne peuvent pas le faire est qu'une base de données relationnelle ne peut pas être partitionnée de la même manière qu'un cache distributif peut l'être ou qu'un NoSQL database peut être parce que le cache distribué et NoSQL sont des paires clé-valeur, ce qui est une conception très différente de celle d'une base de données relationnelle, mais au final, vous devez mettre un cache distribué en tant que niveau de mise en cache entre le niveau application et votre base de données.

Alors, à quoi cela ressemble-t-il en termes de configuration ? Donc, généralement, ce ne sont pas des boîtes très chères. Il s'agit généralement de boîtiers de 8 cœurs à 16 cœurs, de beaucoup de mémoire de 16 à 32 Go et de cartes réseau de 1 à 10 gigabits. Parfois, vous avez deux cartes réseau, une pour le clustering et une pour le type d'outils des clients, mais c'est à peu près tout, c'est très différent de l'obtention d'un serveur de base de données haut de gamme, beaucoup de puissance de traitement pour faire votre travail parce que il n'y en a qu'un ou très peu. Donc, il n'y a pas d'autre moyen de contourner cela. Nous disons à nos clients de ne pas obtenir plus de 64 Go de RAM par boîte, car lorsque vous avez plus de 64 Go de RAM dans un environnement .NET, cette mémoire doit être collectée via la récupération de place et collectée à mesure que vous collectez de plus en plus de mémoire. que vous avez besoin de plus de puissance de traitement. Alors, vous entrez dans le même problème de commencer à obtenir des boîtes vraiment chères. Il est préférable d'obtenir une mémoire de 32, 16 à 32 bits, 16 à 32 Go, mais plus de boîtes la rendent moins chère.

Comment fonctionne un cache distribué ?

Alors, à quoi sert un cache distribué ? Il construit en fait un cluster et encore une fois je parle d'un NCache perspective, il y en a aussi d'autres comme Redis qui font des choses similaires mais d'une manière différente. Ainsi, le cache distribué construira un cluster, c'est un cluster basé sur TCP et la chose la plus importante dans un cluster est que, tout comme vous ne voulez pas que la base de données tombe en panne et en production, vous ne voulez pas que le cache descendre non plus. Ce cluster doit donc être hautement disponible. Ainsi, la meilleure façon de le rendre hautement disponible pour les clients est de s'assurer qu'il a une architecture peer-to-peer, où chaque nœud est un citoyen égal et n'importe quel nœud peut tomber en panne ou vous pouvez ajouter plus de boîtes, il n'y a pas de maître- esclave parce que cela crée des complications et des problèmes de haute disponibilité. Ainsi, il a regroupé les ressources, la mémoire, le processeur et la carte réseau en tant que ressources. Donc, au fur et à mesure que vous en ajoutez, disons que vous avez de plus en plus de trafic ou de plus en plus de transactions, vous ajoutez plus de serveurs ci-après à un rapport de 4 à 1, 5 à 1, vous ajouteriez généralement plus de boîtes. Minimum de deux serveurs de cache et puis vous continuez à en ajouter, donc vous allez commencer avec deux, vous allez commencer à avoir de plus en plus de charge et du coup tout va commencer à ralentir et vous ajoutez une troisième boite tout s'améliore quand vous en ajoutez plus charger et ajouter plus de boîtes, ici les choses commencent à ralentir jusqu'à un certain point. Vous ajoutez une quatrième boîte et l'image s'en va.

Donc, c'est comme ça que ça évolue linéairement, en théorie, rien n'est illimité mais ça s'adapte à plus de situations, ça évolue de manière illimitée là où il n'y a pas de goulot d'étranglement. Ainsi, cela vous permet de ne pas voir votre base de données devenir un goulot d'étranglement. Ainsi, cela est devenu à peu près une meilleure pratique essentielle de votre architecture d'application. Si vous faites des applications à transactions élevées, vous devez incorporer la mise en cache distribuée et parce que c'est le seul moyen, vous pourrez atteindre des performances car tout est en mémoire, tout ce qui touche le disque ne peut jamais être aussi rapide qu'en -mémoire et évolutivité car elle est distribuée. Des questions à ce sujet avant que je parte ? En fait, dans le cas de NCache vous pouvez. NCache prend en charge .NET et Java mais si vous avez d'autres applications comme Python ou autres, vous ne pouvez pas utiliser NCache, vous devez alors utiliser d'autres solutions de mise en cache mais l'application doit se trouver dans un environnement évolutif. Fondamentalement, peu importe la langue que vous utilisez, la fonctionnalité reste la même. Il y a quelques avantages, si vous êtes une application .NET alors NCache vous offre de nombreux avantages spécifiques à .NET car il s'agit d'une pile .NET complète, sa pile de cours .NET, donc elle s'intègre très bien. Il existe également des produits similaires du côté Java qui sont appelés grilles de données en mémoire et donc, ils s'adaptent très bien à la pile Java. Par exemple, je vais juste partager quelques informations. Alors, NCache a une API Java mais les seules personnes qui utilisent l'API Java sont celles qui achètent NCache ou de l'utilisation NCache d'un point de vue .NET. Alors, ils ont NCache en interne et ils ont dit qu'il pourrait aussi bien l'utiliser pour Java et qu'un magasin Java irait chercher une grille de données en mémoire basée sur Java, un magasin .NET chercherait NCache. C'est ainsi que le marché est segmenté en raison de toute l'expertise, si vous êtes un magasin .NET, vous avez toute l'expertise .NET par rapport à Java. Alors, pourquoi compliquer l'image? Pour les bases de données, donc une base de données non SQL peut-elle être utilisée ? N'importe qui, n'importe qui, car vous accédez à la base de données via votre propre code personnalisé qui réside sur le niveau de mise en cache.

Donc, c'est une autre fonctionnalité que je vais aborder est que l'une des fonctionnalités essentielles pour s'assurer que le cache reste synchronisé avec la base de données est que votre code personnalisé doit vivre sur le serveur de cache. Si vous faites du cache une boîte noire, où il n'y a rien sur le cache sauf des données qui ressemblent à une base de données relationnelle sans déclencheurs et procédures stockées ou autres choses. Donc, cela limite votre utilisation du cache. Ainsi, les caches ont commencé comme n'étant que la boîte noire. Memcached était un cache populaire, il ne faisait rien, était juste un magasin, et au fil du temps, ils ont évolué pour devenir une entité intelligente appropriée où ils peuvent également exécuter votre code. Quelconque NoSQL, n'importe quelle base de données relationnelle peut être utilisée avec. Et encore une fois, toutes ces fonctionnalités dont je parle sont à la fois open source et professionnelles. C'est pourquoi je le mentionne parce qu'il est open source. D'autres questions? Lorsqu'il s'agit de NCache est-ce principalement la mise en cache automatique ou est-ce que vous utilisez l'API pour mettre en cache ? Donc, je vais entrer dans les détails, mais cela dépend de ce que vous mettez en cache ? Certains types d'utilisation du cache sont automatiques. Par exemple, si vous mettez ASP.NET core sessions alors c'est un module enfichable, il se branche simplement et commence à stocker les sessions dans le cache, donc vous n'avez rien à faire, mais si vous allez mettre en cache les données d'application, c'est là que se trouve l'essentiel de l'avantage , il y a donc une API que vous devez appeler pour déterminer ce que vous voulez mettre en cache ? Combien de temps voulez-vous le mettre en cache ? Comment voulez-vous le synchroniser avec la base de données ? Il y a beaucoup d'autres choses, que vous devez garder à l'esprit. Donc, je vais passer en revue toutes ces fonctionnalités sur la façon dont vous devriez utiliser le cache distribué comme NCache pour vous assurer que vous pouvez mettre en cache toutes sortes de données, mais il existe une API. Oui.

Utilisation du cache distribué

D'accord. Donc, maintenant que nous avons établi qu'un cache distribué est important. Il vous offre performances et évolutivité. Voyons comment utiliser un cache distribué et il existe trois façons possibles de l'utiliser. Les trois grands cas d'utilisation technique.

Mise en cache des données d'application

Et le numéro un est la mise en cache des données d'application, c'est ce dont j'ai parlé jusqu'à présent et j'y reviendrai plus en détail bientôt. Dans la mise en cache des données d'application, il y a une chose que vous devez garder à l'esprit que les données existent dans la base de données et le cache. Donc, il y a deux endroits où les données existent, lorsque les données existent à deux endroits, quelle est la chose la plus courante qui pourrait mal tourner ? Ils pourraient se désynchroniser, de sorte qu'un client pourrait retirer ces millions de dollars deux fois de la banque, une fois du cache, ceux de la base de données et vous ne voudriez donc jamais avoir cette situation. Cette situation était si mauvaise dans le passé que les gens utilisaient lorsque vous mentionniez le mot cache, la plupart des gens pensaient que je vais juste mettre en cache des données en lecture seule. Les données ne changent jamais, car si je mets en cache tout ce qui change, je ne pourrais pas avoir de problèmes. Je vais donc expliquer comment vous pouvez vous assurer que cela ne se produit pas, mais c'est la chose la plus importante à garder à l'esprit dans la mise en cache des données d'application.

ASP.NET Core Mise en cache spécifique

Le deuxième cas d'utilisation est ASP.NET core-mise en cache spécifique et il y a deux choses que vous pouvez mettre en cache à partir de l'ASP.NET core. L'un est les sessions, qui sont à peu près tous les ASP.NET core application utilise des sessions et vous dans l'environnement ASP.NET précédent, Microsoft a donné trois options de stockage InProc, serveur d'état et SQL et quatrième était la coutume. Les trois premiers ne fonctionnaient pratiquement pas mais le quatrième permettait de brancher un cache mais en ASP.NET core ils ont en fait fait la bonne chose, c'est-à-dire à partir du code git, ils l'ont en fait conçu de manière à ce qu'il soit basé sur une interface IDistributedCache. Ainsi, cela vous permet de brancher un magasin tiers et vous pouvez brancher quelque chose comme NCache et il commence automatiquement à stocker vos sessions et je vais vous montrer comment cela se fait.

La deuxième chose en ASP.NET Core est la mise en cache des réponses, qui est la sortie de page que vous pouvez mettre en cache. Ainsi, la prochaine fois que cette page sera appelée, la page ne devrait même pas être exécutée, elle devrait simplement renvoyer la sortie si elle n'a pas changé. S'il va reproduire à nouveau la même sortie, pourquoi réexécutent-ils ou exécutent-ils la page ? Pourquoi ne pas simplement servir la sortie, c'est ainsi que la mise en cache de sortie était appelée dans ASP.NET, maintenant elle s'appelle la mise en cache de réponse. Il est maintenant basé sur davantage de normes HTTP. Ainsi, vous pouvez brancher la mise en cache de contenu tiers sur le bord, ce qui n'était pas possible, mais j'y reviendrai également. La différence à garder à l'esprit entre la mise en cache des données applicatives et ASP.NET core la mise en cache est que contrairement à la mise en cache des données d'application, où il y avait deux endroits où les données existaient, maintenant les données n'existent que dans le cache et parce que le cache est en mémoire, ces données seront perdues si un serveur de cache tombe en panne, sauf s'il y a réplication . C'est donc un point très important à garder à l'esprit que tout cache qui ne vous donne pas une bonne réplication n'est pas adapté aux sessions de mise en cache ou à d'autres tendances dans les données.

Il y a un troisième ASP.NET core- chose spécifique qui s'appelle SignalR, dans laquelle je ne vais pas entrer, si vous avez des applications Web en direct, qui peuvent donner des commentaires en direct, disons que les cours des actions doivent être mis à jour tout le temps. Donc, cela peut également utiliser un cache distribué comme fond de panier, mais je ne l'ai pas mentionné.

Sécurité

Toutes les questions dans les deux premiers et j'irai plus en détail si besoin sur ces derniers. Donc, tout d'abord, le cache vit derrière votre application. Il vit entre l'application et la base de données. Généralement, dans un environnement assez sécurisé. Nous avons des clients qui gardent le cache plus près, si leur application est dans la DMZ, ils peuvent garder le cache non pas dans la DMZ mais derrière le pare-feu. Parfois, ils le gardent dans la DMZ mais la plupart du temps, c'est dans une situation sécurisée mais beaucoup de nos clients des services financiers comme les grandes banques et autres, ils ne sont pas satisfaits de cela, alors ils veulent plus de sécurité. C'est donc là que l'édition Enterprise de NCache a des fonctionnalités, où il peut faire du cryptage. Ainsi, toutes les données que vous mettez dans le cache seront automatiquement cryptées avec un cryptage comme 3DES ou AES256, puis il y a aussi la sécurité, que toutes les connexions au cache seront authentifiées via Active Directory et il y aura des choses d'autorisation. Ainsi, toutes les fonctionnalités de sécurité sont intégrées à l'édition entreprise.

Un client moyen n'utilise le cryptage que si ses données sont sensibles. Donc, s'ils conservent des données financières, il y a des problèmes de conformité ou HIPAA, donc si dès que vous entrez dans des problèmes de conformité, même si votre environnement est sécurisé, vous devez aller plus loin et c'est là que vous feriez le cryptage . Alors, NCache Enterprise, par exemple, effectuera la connexion TLS entre le client et le niveau de mise en cache. Ainsi, cette connexion elle-même est entièrement sécurisée et vous avez un cryptage intégré, donc quelles que soient les données conservées en mémoire, elles sont également conservées sous une forme cryptée. Et cela satisfait à peu près, je veux dire que nous avons beaucoup de clients des services financiers et ils en sont totalement satisfaits.

NCache peut être déployé et la plupart de nos clients l'utilisent encore dans une situation sur site. Donc, ils ont leur propre centre de données où leur application est déployée, donc ils déploient NCache dans le cadre de leur candidature. Si vous êtes dans le cloud, NCache est disponible à la fois dans Azure et AWS et il est disponible en tant que VM ou nous sommes sur le point de lancer également le service de cache géré, de toute façon, nous nous assurons que NCache vit au sein de votre réseau virtuel dans le cloud. Donc, dans un environnement sur site, ce n'est pas un problème car toujours dans votre propre environnement, vous obtenez juste un tas de machines virtuelles ou si vous êtes votre propre centre de données, vous obtenez vos propres serveurs et vous les déployez avec l'application. Vous installez NCache en tant que logiciel et c'est pour les installations à l'intérieur, vous pouvez également utiliser docker et vous avez vu tout ce que vous attendez des applications modernes capables de faire, NCache ça ira. Et puis dans le cloud, vous pouvez soit obtenir les machines virtuelles, soit obtenir le cache géré, mais dans le cloud, nous le ferons toujours dans votre VPC en cas d'AWS et vnet en cas d'azur. C'est dans votre réseau virtuel. Donc, c'est proche de votre application parce que si ce n'est pas si vous devez vous développer sur plusieurs sauts, et disons s'il s'agissait d'un cache hébergé, ce qui est probablement acceptable pour les petites applications mais tout ce qui est sérieux, NCache est presque toujours utilisé dans les applications critiques où vous effectuez vos activités via cette application. Donc, c'est là que vous utiliseriez NCache.

Donc, dans ces situations, vous ne pouvez pas vous permettre d'avoir un ralentissement et si vous ne pouvez pas vous permettre d'avoir un ralentissement, c'est là que vous voulez tout le contrôle et garder le cache aussi près que possible de l'application. Cela dépend du cas d'utilisation que vous allez faire, donc par exemple, le bénéfice le plus important et le plus rapide est celui des sessions et vous le brancheriez immédiatement sans aucun changement de code. C'est juste un changement de configuration. Dans le cas de l'ASP.NET core, ce n'est pas un changement de configuration. C'est un changement de code de fichier de démarrage mais juste très petit mais si vous voulez faire la mise en cache des données d'application, c'est toujours un changement très simple.

Permettez-moi de vous montrer rapidement à quoi ressemble l'API. Alors, regardez cette API.

Connexion au cache
Cache cache = NCache.InitializeCache("myCache");
cache.Dispose();
Récupération des données
Employee employee = (Employee) cache.Get("Employee:1000");
Employee employee = (Employee) cache["Employee:1000"];
bool isPresent = cache.Contains("Employee:1000");
Écrire des données
cache.Add("Employee:1000", employee);
cache.AddAsync("Employee:1000", employee);

cache.Insert("Employee:1000", employee);
cache.InsertAsync("Employee:1000", employee);
cache["Employee:1000"] = employee;

Employee employee = (Employee) cache.Remove("Employee:1000");
cache.RemoveAsync("Employee:1000");

C'est juste un tout petit cache.get, cache.add, Insert, remove. Ainsi, vous avez une clé et une valeur comme objet. Donc, très facile à intégrer, mais vous devez y aller et le faire, donc chaque fois que vous obtenez des données de la base de données, vous vérifiez d'abord le cache, si le cache en a, vous le prenez du cache, ou bien vous allez à la base de données récupérez-le et vous le mettez dans le cache, c'est le modèle. Exactement. Je vais accélérer sinon, je n'y arriverai pas. je vais te montrer NCache un petit peu plus tard.

Messagerie Pub/Sub et événements

Ainsi, la messagerie pub/sub est également une fonctionnalité très puissante. Beaucoup d'applications aujourd'hui doivent coordonner l'effort. Je parlais à quelqu'un aujourd'hui, qui a dit qu'il avait besoin de faire beaucoup de programmation événementielle. Ainsi, la messagerie pub/sub vous offre un modèle de programmation événementiel très puissant, car vous disposez d'une infrastructure où il s'agit d'une plate-forme évolutive en mémoire maintenant au sein de votre application, vous pouvez la considérer comme un bus de messagerie. Ce n'est pas pour les environnements distribués. C'est pour le même centre de données un type d'emplacement d'une situation mais c'est super rapide car tout est en mémoire et c'est évolutif. C'est donc le troisième cas d'utilisation que vous aurez pour utiliser un cache distribué comme NCache. Oui, c'est le cas, c'est le cas et l'open source le prend également en charge. Ainsi, toutes ces fonctionnalités sont disponibles à la fois en open source et en entreprise, en fait, toutes les NCache L'API est à peu près la même entre l'open source et l'entreprise.

Ce que nous avons vu avec pub/sub, c'est encore une fois si vous avez une application à fort trafic, une transaction élevée, alors vous avez vraiment besoin que le moteur pub/sub soit super rapide et c'est là NCache brille vraiment.

ASP.NET Core Mise en cache des données d'application

D'accord. Donc, mise en cache des données d'application. Comment faites-vous? Donc, c'est aussi pour répondre là, donc il y a trois façons de le faire.

IDistributedCache

Vous pouvez utiliser l'interface IDistributedCache qu'ASP.NET core est livré avec et si vous l'avez programmé, vous pouvez simplement brancher NCache en tant que fournisseur. Ainsi, il n'y a plus de changement de code une fois que vous avez fait la programmation de l'API IDistributedCache. Ainsi, l'avantage est que vous programmez une fois et que vous n'êtes pas enfermé dans un seul fournisseur de cache. L'inconvénient est que c'est le plus petit dénominateur commun. Je vais vous montrer à quoi ça ressemble, c'est tout. Il y a Get et Put c'est tout. Vous savez Get, Remove et Set, alors qu'il y a beaucoup plus que vous devez être capable de faire pour utiliser pleinement le cache, que nous parlions du fait que vous voulez que le cache soit synchronisé avec la base de données. Donc, il y a des avantages et des inconvénients.

Entity Framework Core Cache

La seconde est que si vous avez une application EF Core, vous l'avez une application EF core, c'est un moyen plus simple de se connecter NCache et je vais vous montrer. Donc, nous avons en fait implémenté des méthodes d'extension pour EF Core et encore une fois, c'est à la fois open source et entreprise. Il y a l'exemple EF Core. D'accord. Donc, si vous aviez une application EF Core, vous auriez généralement une requête EF Core comme celle-ci, vous allez en quelque sorte récupérer quelque chose en utilisant une requête de style LINQ. Donc, nous avons implémenté une méthode d'extension, disons FromCache, donc ce sont un tas de méthodes, c'est l'une d'entre elles donc cela dira aller au cache si cette requête a été stockée pour la dernière fois dans le cache, récupérez-la à partir du cache. Si ce n'est pas dans le cache, accédez à la base de données, exécutez cette requête principale EF régulière, récupérez-la et placez-la dans le cache. Donc, c'est juste cette ligne ou juste cet appel de méthode qui commence automatiquement à mettre en cache toutes les données provenant de la base de données. Ainsi, cela simplifie votre travail et vous savez exactement où brancher, il n'y a pas beaucoup d'appels d'API supplémentaires que vous devez faire.

Ainsi, pour les applications principales EF, il y a encore une fois un changement de code, mais le moins possible que vous pouvez faire et commencer à mettre en cache les données. Donc, en fait, pour le noyau EF, il y a un tas de méthodes, c'est FromCache, la plupart proviennent de, il y a environ quatre ou cinq méthodes que vous pouvez utiliser, FromCache, puis LoadIntoCache, FromCacheOnly. Ainsi, et également avec EF Core, lorsque vous enregistrez des modifications, il met également à jour le cache avant ou après la mise à jour de la base de données, il met également à jour le cache. Ainsi, le cache contient la version mise à jour des données. L'intégrité du cache est maintenue tout d'abord en s'assurant que quelles que soient les données que vous conservez dans le cache et je vais sauter, par exemple, il s'agit d'un serveur de cache. Disons que si vous avez deux serveurs et disons que vous avez trois serveurs. L'intégralité du cache est divisée en partitions, chaque partition possède son propre ensemble de compartiments, de sorte que vos données ne résident que dans l'une des partitions. Ainsi, ces données sont ensuite répliquées sur un autre serveur, appelé les répliques, mais les répliques dans le cas de NCache n'est pas actif, il est passif votre application ne parle pas aux répliques. Votre application ne parle qu'à la partition. Ainsi, comme les données ne sont stockées qu'à un seul emplacement, il n'y a pas de problème de synchronisation. Tout le monde va sur le même serveur mais parce qu'il est partitionné, tout le monde ne va pas sur le même serveur, certaines clés sont stockées ici, certaines sont stockées ici, certaines sont stockées ici.

partition-réplica

Donc, c'est à quoi ressemble un cache distribué NCache est capable de faire ce que le serveur SQL ne peut pas faire car la nature de la base de données relationnelle est que vous ne pouvez pas partitionner, mais la nature du cache distribué est que vous pouvez et lorsque vous partitionnez ici, ce sont trois serveurs, ils sont peut-être partagés par dix serveurs d'application et chaque serveur d'application peut avoir quatre ou cinq ou six ou huit processus de travail. Ainsi, de nombreux processus clients différents communiquent avec le cache, il n'y a pas de problème de synchronisation car les données réelles ne sont stockées qu'à un seul endroit. Maintenant, il existe d'autres topologies dans NCache qui sont répliquées, où les mêmes données existent actives-actives et multiples et dans ce cas, NCache doit synchroniser les modifications. C'est basé sur des jetons, c'est un algorithme de mise à jour basé sur une séquence, ce n'est pas très évolutif. Nous ne le recommandons donc pas pour un environnement à transactions élevées.

Le cache partitionné avec réplication est la meilleure stratégie ou nous l'appelons une meilleure topologie de mise en cache à utiliser. Alors, c'est comme ça NCache s'assure que dans le cache, les données sont toujours correctes. Cela a-t-il répondu à votre question ? Donc, le port que vous avez montré, y a-t-il une configuration ou un paramètre sur le code qui dit, à partir de quel cache il doit le récupérer ? Ouais. Ainsi, par exemple, lorsque vous entrez dans le app.config, vous verrez qu'il va dire que vous utilisez mycacheId et je vais vous montrer ce qu'est le cache. Ainsi, lorsque vous créez un cache dans NCache. Chaque cache reçoit un nom et ce nom derrière la scène sait où se trouve le cache, donc tout ce que vous avez à faire est de spécifier le nom ici et ensuite il sait où aller et récupérer le cache. Et je vais vous montrer à quoi ressemble réellement la cache. Un nom de cache est sur tous ces serveurs et dans les mêmes serveurs, vous pouvez avoir plusieurs noms de cache, sur le même serveur, vous pouvez avoir plusieurs caches et un cache peut vivre sur plusieurs et est un cache distribué, le seul nom de cache doit vivre sur plusieurs serveurs, c'est ainsi qu'il est distribué, mais les mêmes serveurs peuvent également être utilisés pour d'autres noms de cache, et chaque nom de cache donne son isolation. Bonne question.

Haute Disponibilité

Donc, c'est là que je disais que la haute disponibilité est vraiment très importante. Si vous n'êtes pas en mesure d'ajouter ou de supprimer des serveurs au moment de l'exécution sans aucun arrêt, votre application n'est vraiment pas hautement disponible. Nous avons des clients qui courent NCache pendant des mois et des années sans aucun arrêt. Ainsi, par exemple, disons que vous avez une configuration à deux serveurs et que vous venez d'ajouter un troisième serveur car votre charge a augmenté. Donc, vous devez ajouter un troisième serveur, tout ce que vous ferez est d'ajouter un troisième serveur et je vous le montrerai juste à travers l'outil, ajoutez-en un, et NCache les coulisses seront repartitionnées. Ainsi, ces deux partitions vont maintenant être transformées en trois partitions. Certains des buckets d'ici et d'ici seront automatiquement affectés à la troisième partition pendant l'exécution d'une application, votre application ne le remarquera même pas. Dans les coulisses maintenant qu'il y a une troisième partition qui existe et maintenant que la réplique existe également, une troisième réplique est créée, alors disons que la réplique 2 doit être déplacée ici et que la réplique 3 est créée ici.

partition-replica2

NCache le maintient, derrière ce NCache utilise des clés pour le mappage de hachage, mais il le fait de manière dynamique, donc comme une carte de distribution, qui est comme une carte de compartiment qui est repartitionnée et réaffectée. Ainsi, les données se déplacent automatiquement d'un serveur à l'autre lors de l'exécution.

Affinité de localisation

Ainsi, dans certains cas, vous souhaiterez peut-être conserver certaines des données ensemble sur la même partition. NCache a une fonction d'affinité de localisation, où vous pouvez spécifier et ensuite vous le spécifierez. Vous direz que ces deux données sont liées, je veux qu'elles soient sur le même serveur, puis NCache le conservera sur le même serveur grâce à une clé supplémentaire qu'il créera par-dessus. Comme je l'ai dit, toutes ces fonctionnalités sont avancées, que vous n'obtenez pas si vous utilisez simplement le plus petit dénominateur commun, et en utilisant ces fonctionnalités, vous pouvez ajuster NCache à votre environnement sur vos besoins spécifiques.

Fonctionnalités de mise en cache des données d'application

Donc, la première chose que je voulais aborder, ces sujets, ils sont très importants. Pour la mise en cache des données d'application, le plus important est que le cache soit toujours frais, ce qui signifie qu'il contient des données correctes. Si les données changent dans la base de données, le cache contient les dernières données.

Expirations basées sur le temps

Ainsi, l'expiration est la manière la plus courante dont les caches le font, presque tous les caches ont l'expiration comme fonctionnalité. NCache l'a aussi. Il y a une expiration absolue et puis il y a une expiration glissante. L'expiration absolue est, disons que vous ajoutez des données au cache, peut dire ok après cinq minutes d'expiration car je ne pense pas qu'il soit sûr pour vous de le conserver dans le cache pendant plus de cinq minutes. Donc, vous faites une supposition éclairée, qu'il est sûr de conserver les données dans le cache pendant cinq minutes et que c'est assez bon pour certaines données, pour d'autres données, ce n'est peut-être pas le cas.

L'expiration glissante est plus utile lorsque vous stockez des sessions et que vous dites d'accord après que personne ne l'utilise, une fois que tout le monde a fini d'utiliser cette session, supprimez-la simplement. Donc, c'est plus une expiration de nettoyage. L'expiration absolue est la synchronisation pour la maintenir cohérente avec la base de données, le glissement est un nettoyage, mais l'expiration est une supposition éclairée quelle que soit la supposition erronée

Dépendances de la base de données

Dans certains cas, vous pouvez vous permettre d'avoir des données incohérentes dans certains cas, vous ne le pouvez pas. Donc, si vous ne pouvez pas, vous devez avoir d'autres fonctionnalités, c'est donc ici NCache se démarque vraiment qui est que, par exemple, vous pouvez avoir une synchronisation du cache avec la base de données. Alors, NCache utilise la dépendance SQL intégrée à SQL Server pour surveiller SQL Server. Ainsi, vous pouvez pour chaque élément que vous mettez en cache, vous pouvez dire ok le mapper avec cette ligne correspondante dans la table de base de données SQL, NCache le surveille, si cette ligne change, NCache puis supprime cet élément du cache ou le recharge à nouveau. Donc, maintenant, vous avez soudainement un cache intelligent, il est capable de s'assurer que tout ce que vous mettez en cache sera toujours cohérent et c'est quelque chose que vous n'obtenez pas si le cache est une boîte noire.

Donc, vous devez être en mesure d'avoir ce type d'intelligence avec le cache, et les dépendances SQL sont une fonctionnalité .NET, c'est donc là que NCache être .NET aide si votre base de données est SQL. Maintenant, nous sommes également une dépendance Oracle qui utilise également les notifications de la base de données Oracle et il y a une autre façon de faire qui est notre notification basée sur l'interrogation, qui est plus efficace mais ce n'est pas aussi en temps réel et vous pouvez également synchroniser le cache avec sources de données non relationnelles. Vos données peuvent se trouver dans un NoSQL database, il peut être dans le cloud, il peut être n'importe où et vous souhaitez pouvoir le surveiller. Ainsi, vous pouvez créer ce que nous appelons une dépendance personnalisée, qui est votre code qui réside sur le serveur de cache. NCache l'appelle à un certain intervalle, il va vérifier votre source de données, si les données changent, il notifie NCache, ok les données ont changé veuillez les supprimer ou les recharger.

C'est donc un domaine où NCache est vraiment très fort. Si vous voulez garder vos données à jour, vous devez pouvoir faire ces choses pour vous assurer que le cache est à jour.

Lecture et écriture

Une autre caractéristique est la lecture et l'écriture. Donc, maintenant, cela est combiné avec l'expiration et la synchronisation de la base de données. Cela permet au cache de charger les données de votre base de données et c'est ainsi, par exemple, si vous avez une lecture, je vais vous montrer à quoi ressemble une lecture. C'est juste une interface que vous implémentez et votre code réside en fait sur le cache, alors voici une interface pour implémenter ce code. Donc, il y a un chargement depuis l'appel source, il vous donne une clé, puis NCache appelle votre méthode, le serveur de cache appelle votre méthode, ce code tourne sur les serveurs, tous les serveurs de cache, NCache appelle cette méthode et dit s'il vous plaît allez-y et chargez cette clé car elle n'est pas dans le cache. Donc, si je fais un cache.Get, je pense que la clé n'est pas dans le cache, soit je renvoie un null, en disant que la clé n'existe pas, soit si j'ai une lecture, je peux simplement aller dans le cache, et NCache pouvez aller à la base de données et le lire pour vous. Ainsi, vous l'aurez toujours. Maintenant, c'est très utile dans de nombreux cas, où vous voulez toujours garder ces données dans le cache.

Ainsi, la lecture vous permet, lorsque vous combinez la lecture avec les expirations ou la synchronisation de la base de données, ce que cela fait, c'est lorsque les données expirent NCache peut l'actualiser automatiquement, pourquoi le supprimer ? Si vous allez le recharger, la prochaine fois de toute façon parce que ces données sont nécessaires et que vous les expirez juste pour les garder fraîches. Alors, pourquoi ne pas simplement avoir NCache revenez en arrière et rechargez-le. Si vous avez implémenté la lecture continue, NCache le fera automatiquement et la même chose se produit, si les données changent dans la base de données ou la source de données et que cette fonction de synchronisation indique que là-bas, ok, cette base de données a changé, alors si vous avez implémenté la lecture, elle ira automatiquement la recharger .

De même, l'écriture immédiate vous offre un autre avantage, à savoir que si vous avez une écriture différée, vous pouvez mettre à jour le cache. Donc, certaines données ne sont pas si sensibles pour les mises à jour, je veux dire bien sûr s'il s'agit de soldes de banques de données financières que vous ne voulez pas écrire derrière, mais dans certains cas, ce n'est pas grave si vous pouvez simplement mettre les mises à jour en file d'attente. Donc, si vous mettez à jour le cache, la mise à jour du cache est beaucoup plus rapide que la mise à jour de la base de données, bien sûr, plus évolutive car elle est distribuée et vous mettez à jour le cache et vous dites NCache s'il vous plaît allez-y et mettez à jour ceci, la base de données de manière asynchrone dans les coulisses. Donc, c'est la fonction d'écriture différée, et cela accélère soudainement votre application car quel est le goulot d'étranglement ? Lit à partir de la base de données et écrit dans la base de données. Les lectures que vous pouvez mettre en cache, de sorte que vous n'allez même pas dans la base de données mais que les écritures doivent aller dans la base de données, vous ne pouvez pas, je veux dire que la base de données est le maître, donc il n'y a pas de contournement, mais le type d'écriture derrière fait c'est facile.

Donc, c'est une autre fonctionnalité que si vous l'avez, NCache vous donne soudainement un coup de pouce supplémentaire dans votre application. Question : Donc, juste au cas où, il ne serait pas capable d'écrire dans la base de données et de faire de l'asynchronisme, il lèverait une exception ? Oui. Il lèvera une exception, vous pouvez avoir un rappel qui est appelé par NCache et encore une fois le code est, ce code en écriture derrière s'exécute sur les serveurs de cache mais le rappel est là, donc il notifiera le client et votre rappel sera appelé, vous pourrez alors prendre des mesures correctives. Une fois que vous vous êtes familiarisé avec ce cache, NCache pouvez synchroniser le cache avec la base de données, vous mettrez en cache de plus en plus de données. Plus vous mettez en cache de données, plus le cache commence à ressembler à une base de données, ce qui signifie qu'une méthode clé-valeur de récupération de données n'est pas assez intelligente. Donc, vous devez être capable de trouver des données basées sur SQL, en particulier des données de référence.

Recherche SQL

Lorsque nous avons parlé de la requête EF Core, vous récupérez des données basées sur des attributs, pas seulement sur la clé. Donc, si vous êtes en mesure de rechercher les données avec des requêtes SQL ou LINQ ou avec le noyau EF, cela rend le cache beaucoup plus rapide. C'est une autre façon NCache se démarque est qu'une fois que vous avez mis toutes ces données dans le cache, vous pouvez effectuer une recherche, vous pouvez dire donnez-moi tous mes clients basés à Boston ou à New York et cela vous donnera une collection d'objets client du cache. Donc, cela commence à ressembler davantage à une base de données et vous enlevez toute cette pression sur cette base de données, en particulier pour les données de référence. Ainsi, la recherche SQL est vraiment très importante.

D'accord. Maintenant, je veux vous montrer ce NCache ressemble ou n'importe quel cache ressemblerait? Je suis donc connecté à Azure. Donc, j'ai deux VM de serveur de cache. donc, j'ai deux serveurs de cache, un client Windows et une ligne Linux car il y a .NET Core, vous pouvez exécuter l'application sous Windows ou Linux et NCache fonctionne peut-être, les serveurs de cache peuvent également fonctionner sous Linux en raison de .NET Core car NCache est .NET Core originaire de.

azur

Créer un cache

Donc, je suis, par exemple, j'ai fait un bureau à distance sur le client Windows. Je vais en fait continuer et créer un cache, donc mon cache va avoir deux serveurs et j'aurai un client Windows, un client Linux, et quand j'utilise le mot client, c'est en fait votre serveur d'applications. D'accord. Alors, je vais utiliser ça NCache outil de gestion. Maintenant, cet outil fait partie de l'édition Enterprise, mais vous pouvez faire les mêmes choses via les outils de ligne de commande open source ou les fichiers de configuration, mais juste pour des raisons de commodité, je vais continuer et créer un cache.

engendrent

J'appellerai ma cache democache comme je l'ai dit, toutes les caches sont nommées.

démocache

Je vais choisir une topologie. Je choisirai un cache partitionné avec réplication.

cache de partition

Je vais faire la réplication asynchrone, donc il y a une réplication asynchrone et une réplication asynchrone. La réplication de synchronisation se produit lorsque vous ne pouvez pas vous permettre de faire de l'asynchrone s'il s'agit de données plus sensibles, de données financières et d'éléments pour lesquels vous souhaitez que ces réplications se produisent dans le cadre de la mise à jour, ce qui bien sûr ralentit les choses mais les rend plus.

async

Donc, voici mon serveur de cache un, voici mon serveur de cache deux, donc je viens de créer un cluster à deux serveurs. il ne tourne pas encore. Je vais ajouter deux nœuds clients. Ceci est mes fenêtres, il y avait un serveur. Donc, 6 est mon client Windows et 7 est mon client UNIX. D'accord. Donc, j'ai généralement deux serveurs de cache et deux clients, comme je l'ai dit, vous aurez un minimum de deux serveurs de cache et un rapport de quatre pour un, cinq pour un entre les clients et le serveur. Donc, je commence juste le cache maintenant. Encore une fois, à partir d'un seul endroit, je peux faire tout cela et la même chose dans la prochaine version que nous sommes sur le point de lancer, tout est basé sur le Web, donc dans le cloud, vous pouvez le faire. Je vais ouvrir les statistiques et ce sont comme la surveillance, ce sont des statistiques de perfmon.

statistiques

Simuler le stress et surveiller les statistiques du cache

Je vais tester et voir si mon client est capable de lui parler, maintenant cette boîte est un client. donc, je vais ouvrir la console PowerShell. J'aurai deux partiels de Windows et je suis connecté à deux Linux ici, donc j'ai un Linux ici, maintenant le Linux ici. À droite? Ici, je dois démarrer PowerShell et ici, je dois également importer mon module, ce que je n'ai pas besoin de faire pour Windows, il est déjà là pour moi et je dois faire la même chose ici. Je dois démarrer PowerShell sous Linux et maintenant je vais démarrer un client. Alors, NCache est livré avec cet outil de test de stress, ce qui vous permet de tester très facilement le stress dans votre propre environnement. Pour que vous puissiez voir exactement comment NCache effectue? Ainsi, vous n'avez pas à prendre un mot pour sa performance. Donc, disons ici, je fais environ 500 requêtes par seconde et par serveur.

statistiques2

D'accord. Donc, je veux augmenter la charge, donc je vais passer à la deuxième console et je dirai de refaire un test de résistance.

cmd

Maintenant, tout à coup, vous verrez que cela va doubler, d'accord, et laissez-moi continuer et ajouter plus de stress. Je viendrai à l'un des Linux et je dirai la même chose et du coup maintenant je suis plutôt à 1500 par requête. Donc, maintenant j'ai un total d'environ 3,000 4,000 requêtes par seconde comme laissez-moi en faire une autre et maintenant je fais plus comme 50,000 XNUMX requêtes par seconde. Donc, je peux continuer à en ajouter de plus en plus si j'ai plus de machines virtuelles, je peux ou je peux juste avoir plus d'instances et vous verrez que très bientôt une fois, cela atteint le maximum de ce que cela va être et ces deux serveurs devraient être capable de gérer environ au moins XNUMX XNUMX requêtes par seconde, mais encore une fois, c'est avec le petit ensemble de données, à mesure que la taille de votre objet augmente, cela va bien sûr diminuer, mais une fois que j'aurai atteint le maximum, je continuerai ici et encore c'est fonctionne bien, je n'ai pas de troisième VM mais tout ce que j'ai à faire est de faire ceci et d'ajouter une troisième adresse et je dirai terminer et cela ajoutera une troisième boîte ici et cela fera tout ce partitionnement ou repartitionner automatiquement pour vous.

De même, si j'ai besoin d'arrêter l'une des machines virtuelles, cela le fera également. Ouais, ça y est, c'est la fin de mon discours. Pouvons-nous répondre à toutes les questions? C'est la seule solution .NET native, la seule autre solution native était AppFabric qui a été interrompu. Alors, Redis n'est pas une solution .NET même si c'est Microsoft qui l'a choisie pour Azure parce qu'ils voulaient être indépendants de la technologie, ils l'ont donc choisie mais nous sommes natifs .NET. Nous sommes comme ça depuis le premier jour et pour autant que nous sachions, nous sommes le choix préféré pour .NET.

Que faire ensuite?

 

Inscrivez-vous à la newsletter mensuelle par e-mail pour obtenir les dernières mises à jour.

© Copyright Alachisoft 2002 - . Tous droits réservés. NCache est une marque déposée de Diyatech Corp.