.NET Core et ASP.NET Core gagnent en popularité grâce à leur conception simple, leur légèreté, leur caractère open source et leur compatibilité avec Windows et Linux. De ce fait, de nombreuses applications existantes migrent du .NET Framework vers .NET Core. La quasi-totalité des nouvelles applications sont désormais développées en .NET Core.
Bon nombre de ces applications .NET Core génèrent un trafic important, gérant des millions d'utilisateurs et de transactions. Par conséquent, elles ont un impact considérable sur votre activité et sont donc essentielles.
Les applications .NET Core qui nécessitent généralement une grande scalabilité sont des applications serveur qui doivent traiter un grand nombre de transactions très rapidement, avec des temps de réponse extrêmement courts. Nombre de ces applications sont orientées client et traitent donc les requêtes des utilisateurs. Si elles ne répondent pas rapidement aux demandes des clients, le coût pour l'entreprise est important, en termes de pertes de revenus et de mécontentement des clients.
Les applications .NET Core nécessitent une capacité d'évolution :
Fait intéressant, toutes les applications mentionnées ci-dessus ont des architectures de niveau application très évolutives. Chacun d'eux vous permet d'évoluer de manière linéaire à mesure que votre charge de transaction augmente en ajoutant plus de serveurs, de machines virtuelles ou d'instances de conteneurs avec un équilibreur de charge.
Malgré une architecture très évolutive au niveau applicatif, les applications serveur .NET Core sont aujourd'hui confrontées à d'importants problèmes de scalabilité. Ces problèmes se manifestent dans différents domaines, notamment :
Le principal goulot d'étranglement pour toutes les applications .NET Core à fort trafic est leur base de données. La plupart des applications utilisent encore aujourd'hui une base de données relationnelle comme SQL Server ou Oracle. Ces bases de données deviennent rapidement des freins à la scalabilité lorsque la charge transactionnelle augmente. Cela reste vrai, que vous utilisiez SQL Server sur une machine virtuelle ou Azure SQL Database.
Cela s'explique par le fait qu'une base de données relationnelle ne peut pas être partitionnée logiquement comme une base de données NoSQL et reste physiquement localisée ; même un partitionnement au niveau des colonnes est très différent d'un véritable partitionnement de type NoSQL. Par conséquent, il est impossible d'augmenter la capacité transactionnelle de la base de données en ajoutant des serveurs, comme c'est le cas pour une base de données NoSQL.
Par exemple, alors que votre niveau d'application peut facilement avoir 10, 20, 30 serveurs d'applications ou plus à mesure que votre charge de transaction augmente, votre niveau de base de données ne peut pas du tout croître de la même manière.
À cause de tout cela, votre base de données relationnelle devient un goulot d'étranglement pour toutes les données que vous y stockez (données d'application ou autres données).
SQL Server a introduit des optimisations en mémoire pour augmenter le nombre de transactions par seconde. Oracle a également fourni sa propre version des tables en mémoire.
Bien que les optimisations en mémoire améliorent les performances, elles ne résolvent pas le problème central de l'évolutivité linéaire. Les tables en mémoire sont généralement utilisées pour les données en lecture seule et afin de mettre à l'échelle une capacité de transaction en lecture seule, vous devez ajouter plus d'instances de SQL Server sur des machines haut de gamme.
Les tables en mémoire ont également des limitations sur la taille des données ; vous ne pouvez pas mettre de grandes tables en mémoire puisque toute la table doit être mise en mémoire. Et leur réplication vers d'autres instances de SQL Server ne peut être effectuée que vers d'autres tables en mémoire et non vers une base de données appropriée.
En résumé, ces optimisations en mémoire dans les bases de données SQL Server et Oracle ne permettent pas de répondre pleinement aux besoins d'évolutivité de votre application .NET Core.
L'une des raisons de la popularité des bases de données NoSQL est leur capacité à partitionner efficacement les données grâce à des algorithmes de hachage et autres techniques. Ceci résout de nombreux problèmes d'évolutivité liés à la capacité transactionnelle rencontrés par les bases de données relationnelles telles que SQL Server et Oracle.
Cependant, il existe des raisons pour lesquelles les bases de données NoSQL ne constituent pas la solution idéale pour ces goulots d'étranglement.
La solution à tous les problèmes mentionnés ci-dessus est d'utiliser un cache distribué en mémoire comme NCache dans le déploiement de votre application .NET Core. NCache Il s'agit d'un cache distribué open source pour .NET et .NET Core, extrêmement rapide et à scalabilité linéaire. Imaginez-le comme un système de stockage de données en mémoire distribué. Le stockage en mémoire lui confère une vitesse exceptionnelle, tandis que la distribution assure une scalabilité linéaire.
NCache est linéairement évolutif car il crée un cluster TCP de serveurs de cache à faible coût (même configuration que vos serveurs d'applications Web mais avec plus de mémoire) et regroupe la mémoire et les ressources CPU de tous ces serveurs en une seule capacité logique. NCache vous permet ensuite d'ajouter des serveurs de cache à ce cluster lors de l'exécution à mesure que votre charge de transaction augmente. Et depuis NCache Tout se déroule en mémoire, ce qui le rend ultra-rapide et vous offre des temps de réponse inférieurs à la milliseconde, chose que vous ne pouvez pas attendre de vos bases de données relationnelles ou même de vos bases de données NoSQL.
En plus de fournir une évolutivité linéaire, un cache distribué comme NCache réplique les données intelligemment afin que vos performances ne soient pas compromises tout en garantissant la fiabilité des données en cas de panne d'un serveur de cache.
NCache vous permet de faire évoluer vos applications .NET Core grâce aux éléments suivants :
Le principal goulot d'étranglement des applications .NET Core est la « base de données de l'application ». L'avantage de NCache c'est que, contrairement aux bases de données NoSQL, NCache ne vous demande pas d'arrêter d'utiliser votre base de données relationnelle existante. Vous pouvez continuer à utiliser SQL Server, Azure SQL Database, Oracle, etc. comme base de données tout en obtenant une évolutivité linéaire en utilisant NCache au-dessus de votre base de données relationnelle. Ceci est dû au fait NCache supprime tous les goulots d'étranglement de l'évolutivité de la base de données relationnelle, car contrairement à votre base de données, NCache est en fait linéairement évolutif.
La mise en cache des données d'application vous permet de supprimer les goulots d'étranglement de votre base de données. NCache vous permet de mettre en cache les données d'application et de réduire ces déplacements coûteux de la base de données. Vous pouvez vous attendre à détourner 80 à 90 % du trafic de la base de données vers NCache. Cela réduit la pression sur votre base de données et lui permet de fonctionner plus rapidement et de gérer des charges de transactions plus importantes sans ralentir.
La mise en cache des données d'application signifie que vous mettez en cache toutes les données d'application que vous obtenez de votre base de données relationnelle. Cela se présente généralement sous la forme d'objets de domaine (également appelés entités). Voici un exemple d'utilisation d'un cache distribué comme NCache pour la mise en cache des données d'application.
Customer Load(string custId)
{
ICache cache = CacheManager.GetCache("myCache");
string key = "Customer:CustomerID:" + custId;
Customer cust = cache.Get<Customer>(key);
if (cust == null)
{
// Item not in cache so load from db
LoadCustomerFromDb(cust);
// Add item to cache for future reference
cache.Add(key, cust);
}
return cust;
}
Figure 3 : Utilisation du cache distribué en mémoire pour la mise en cache des données d'application
Un autre goulot d'étranglement potentiel survient si vous stockez vos sessions ASP.NET Core dans SQL Server ou dans un cache mémoire autonome. Ces deux options présentent des limitations importantes en termes de performances et d'évolutivité. Le stockage SQL Server n'est pas adapté aux sessions ASP.NET Core et devient rapidement un goulot d'étranglement, tout comme pour les données de l'application.
NCache est un excellent endroit pour stocker vos sessions ASP.NET Core car il est beaucoup plus rapide et plus évolutif que les autres options de stockage. NCache Il est plus rapide car il s'exécute en mémoire et offre une interface clé-valeur où la valeur est un « objet », comme une session ASP.NET Core. De plus, il est évolutif car il s'agit d'un cache distribué.
Et, NCache Il réplique également intelligemment les sessions ASP.NET Core grâce à ses topologies de cache avancées, de sorte que même en cas de panne d'un serveur de cache, aucune donnée de session n'est perdue. Cette réplication est nécessaire car NCache fournit un magasin en mémoire et la mémoire viole le stockage.
NCache accélère également la sérialisation de la session ASP.NET Core, nécessaire avant son stockage hors processus. NCache Pour ce faire, elle utilise sa fonctionnalité de sérialisation compacte dynamique, 10 fois plus rapide que la sérialisation .NET et .NET Core classique. Vous pouvez utiliser cette fonctionnalité sans modifier votre code.
Vous pouvez utiliser NCache comme votre magasin de sessions ASP.NET Core de deux manières.
Vous trouverez ci-dessous un exemple de configuration de votre application ASP.NET Core. NCache Fournisseur de sessions :
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Specify NCache as the session provider
services.AddNCacheSession(Configuration.GetSection("NCacheSettings"));
...
}
public void Configure(IApplicationBuilder app, ...)
{
// select NCache session provider for ASP.NET Core
app.UseNCacheSession();
...
}
}
Figure 4 : Plug-in NCache en tant que sessions ASP.NET Core
Les applications ASP.NET Core, dont le contenu est généralement très dynamique, rencontrent des situations où le contenu ou la réponse de certaines pages reste inchangé malgré plusieurs requêtes. Or, ces pages doivent être exécutées à chaque requête, ce qui surcharge inutilement les ressources du serveur web et l'ensemble des couches de l'application. Il en résulte des goulots d'étranglement en termes de performances et une limitation de la scalabilité de l'application.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Turn on ASP.NET Core Response Cache with IDistributedCache
services.AddResponseCaching();
// Select NCache as IDistributedCache provider
services.AddNCacheDistributedCache(Configuration.GetSection("NCacheSettings"));
...
}
}
Figure 5 : Plug-in NCache en tant que middleware de cache de réponse ASP.NET Core
Pour pallier la surcharge liée à l'exécution répétitive de pages dont la réponse ne change pas, ASP.NET Core propose un mécanisme de mise en cache des réponses de page appelé ASP.NET Response Cache Middleware. NCache a implémenté l'interface IDistributedCache dans ASP.NET Core, ce qui vous permet de vous connecter facilement. NCache en tant que middleware de cache de réponses ASP.NET Core.
Vous pouvez donc utiliser NCache Pour mettre en cache les réponses des pages ASP.NET Core pendant une certaine période, afin que lors du prochain appel à la même page avec les mêmes paramètres, cette réponse mise en cache puisse être renvoyée au lieu de réexécuter la page entière. Voici un exemple de code pour la configuration. NCache en tant que middleware de cache de réponses ASP.NET Core.
Si votre application ASP.NET Core est une application web temps réel, elle utilise très probablement ASP.NET Core SignalR pour assurer ce comportement en temps réel. Les applications web temps réel fournissent des mises à jour fréquentes du serveur au client. Parmi ces applications, on peut citer les jeux, les ventes aux enchères, les systèmes de vote, les réseaux sociaux, etc.
Si votre application ASP.NET Core s'exécute dans un environnement multi-serveurs à charge équilibrée, elle doit utiliser un fournisseur de backplane SignalR ASP.NET Core pour partager les événements entre plusieurs serveurs web. Ce backplane doit être évolutif, sous peine de rencontrer des problèmes de performances.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Specify NCache as the ASP.NET Core SignalR Backplane
services.AddSignalR().AddNCache(ncacheOptions =>
{ ncacheOptions.CacheName = "myPartitionedCache"; });
...
}
public void Configure(IApplicationBuilder app, ...)
{
// Use SignalR in ASP.NET Core
app.UseSignalR(config => { config.MapHub<MessageHub>("/messages"); });
...
}
}
Figure 6 : Plug-in NCache en tant que fournisseur de fond de panier SignalR pour ASP.NET Core
NCache a implémenté un fournisseur de backplane SignalR pour ASP.NET Core. NCacheLe fournisseur de fond de panier SignalR d'ASP.NET Core utilise les fonctionnalités de messagerie Pub/Sub de NCache Ces événements sont extrêmement rapides car ils sont entièrement exécutés en mémoire. Cela permet à votre application ASP.NET Core SignalR d'accélérer la propagation des événements SignalR entre tous les serveurs web et, par conséquent, vers les clients.
Et cela rend votre application Web en temps réel plus réactive pour fournir ces mises à jour fréquentes aux clients. Et, vous pouvez continuer à augmenter le nombre de clients et également ajouter plus de serveurs Web sans craindre de goulots d'étranglement de performances.
Si votre application .NET Core utilise la messagerie Pub/Sub ou les événements, il est fort probable qu'elle utilise une plateforme de messagerie Pub/Sub qui n'est pas entièrement en mémoire et stocke tous les messages sur disque. Par conséquent, cela peut facilement créer un goulot d'étranglement en termes de performances si votre application génère un volume élevé de transactions.
NCache fournit également une messagerie Pub/Sub ultra-rapide car entièrement en mémoire. Et, il réplique tous les messages à un autre NCache serveur pour s'assurer qu'il n'y a pas de perte de données en cas de panne d'un serveur.
Par conséquent, si votre application .NET Core utilise NCache en tant que plate-forme de messagerie Pub/Sub, elle bénéficiera de performances ultra-rapides et d'une évolutivité linéaire car NCache elle-même est linéairement évolutive.
Vous trouverez ci-dessous un exemple d'utilisation de la messagerie Pub/Sub fournie par NCache dans votre application .NET Core.
private void PublishMessage (string topicName)
{
ITopic topic = _cache.MessagingService.GetTopic(topicName);
Order order = Order.GenerateOrder<Order>();
// Publish message containing "order" with expiry
Message message = new Message(order, new TimeSpan(0, 0, 15));
topic.Publish(message, DeliveryOption.All, true);
}
private ITopicSubscription SubscribeMessage (string topicName)
{
ITopic topic = _cache.MessagingService.GetTopic(topicName);
// Subscribes to the topic. Message delivered to MessageReceivedCallback
return topic.CreateSubscription(MessageReceivedCallback);
}
static void MessageReceivedCallback(object sender, MessageEventArgs args) { ... }
Figure 7 : Utilisation de la messagerie Pub/Sub dans les applications .NET Core
Le principal goulot d'étranglement en matière de scalabilité que votre application .NET Core doit éliminer provient de la base de données. Dans ce domaine, la mise en cache des données permet à vos applications d'atteindre des performances élevées et une scalabilité linéaire. La raison est simple : la plupart des applications .NET Core effectuent d'importants échanges de données avec la base de données.
En ce qui concerne la mise en cache des données d'application, la plus grande crainte des utilisateurs est que le cache devienne obsolète, ce qui signifie qu'il contient une ancienne version des données qui a déjà été modifiée dans la base de données par un autre utilisateur ou une autre application.
Cette crainte qu'un cache devienne obsolète est si forte que la majorité des gens ne cachent que des données en lecture seule ou statiques (données de référence). Mais ces données en lecture seule ne représentent que 20 % du total des données sous la forme de tables de recherche et d'autres données de référence. La majeure partie des données de la base de données est transactionnelle, y compris les clients, les comptes, les activités, etc. Et, si vous ne mettez pas en cache ces données transactionnelles, vous ne bénéficiez pas pleinement de la mise en cache.
Ainsi, le véritable avantage de la mise en cache vient si vous pouvez mettre en cache tous les types de données sans craindre que la mise en cache ne devienne obsolète. NCache fournit une multitude de fonctionnalités pour résoudre ce problème.
Le moyen le plus efficace de garder votre cache à jour est de toujours le synchroniser avec votre base de données. NCache vous permet de faire cela pour une variété de bases de données comme suit :
Lorsque vous synchronisez votre cache avec SQL Server, vous demandez NCache pour s'enregistrer en tant que client de SQL Server, puis émettre un appel SqlDependency avec un ensemble de données basé sur une requête SQL. Ensuite, lorsque SQL Server voit des modifications dans cet ensemble de données, il notifie NCache à propos de ça
private static void CreateSqlDependency (Product product)
{
string connectionString = "Data Source=localhost;Database=northwind;...";
// SQL stmt on which the SQL Dependency is created in SQL Server
string sqlStmt = "SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice " +
"FROM dbo.PRODUCTS WHERE ProductID = " + product.Id;
CacheDependency sqlDependency = new SqlCacheDependency(connectionString, sqlStmt);
CacheItem cacheItem = new CacheItem(product) { Dependency = sqlDependency };
string key = "Product:ProductId:" + product.Id; ;
cache.Add(key, cacheItem);
}
Figure 8 : Utilisation de SqlDependency pour synchroniser le cache avec SQL Server
Puis, NCache supprime cet élément du cache de sorte que la prochaine fois que l'application en aura besoin, elle devra récupérer la dernière copie de la base de données. Si vous utilisez le gestionnaire de lecture (voir ci-dessous), alors NCache peut également recharger automatiquement la dernière copie de la base de données pour vous. Vous trouverez ci-dessous un exemple d'utilisation de SqlDependency pour synchroniser votre cache avec SQL Server.
Le cache de lecture est un cache capable de lire les données de votre base de données en appelant un gestionnaire de lecture que vous avez développé et fourni au cache. De même, un cache d'écriture immédiate est capable d'écrire des modifications de données dans votre base de données en appelant un gestionnaire d'écriture immédiate que vous avez développé et fourni au cache. Write-behind Cache est identique à Write-through sauf que les mises à jour de la base de données sont effectuées de manière asynchrone.
Les modes de lecture directe, d'écriture directe et d'écriture différée offrent de nombreux avantages à vos applications .NET Core, notamment :
Vous trouverez ci-dessous un exemple de la façon dont vous pouvez utiliser Read-through avec NCache.
// Read through handler for SQL Server
public class SqlReadThruProvider : Runtime.DatasourceProviders.IReadThruProvider
{
public void Init(IDictionary parameters, string cacheId) {}
public void Dispose() {}
// Get object from the database/data-source based on the key
public ProviderCacheItem LoadFromSource(string key) {}
// Bulk-Get objects from the database/data-source based on the keys
public IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection<string> keys)
{}
}
Figure 9 : Utilisation du gestionnaire de lecture avec NCache
Une fois que vous êtes à l'aise avec la mise en cache de toutes les données, vous pouvez commencer à mettre beaucoup de données dans un cache distribué. Ici, vous pouvez commencer à faire face à un autre problème particulier, à savoir comment trouver rapidement et facilement vos données. Étant donné que la plupart des caches distribués sont des magasins clé-valeur, il devient très difficile de suivre toutes vos données uniquement via des clés.
C'est ici que NCache vous offre une variété de façons de trouver rapidement des données à partir de votre cache. Les exemples comprennent:
Vous trouverez ci-dessous un exemple de la façon dont vous pouvez utiliser des requêtes basées sur LINQ avec NCache.
// Search the cache based on object attributes by using LINQ
IQueryable>Product< products = new NCacheQuery<Product>(_cache);
var result = from product in products
where product.Id > 10
select product;
if (result != null)
{
foreach (Product p in result1)
{
// Process each “product” fetched from the database
Console.WriteLine("ProductID : " + p.Id);
}
}
Figure 10 : Utilisation des requêtes LINQ avec NCache
Les applications .NET Core à fort trafic ne peuvent se permettre aucune interruption de service, surtout aux heures de pointe. Pour ce type d'applications, trois objectifs architecturaux essentiels sont atteints grâce à un cache distribué en mémoire performant. NCache remplit.
Laissez-moi vous expliquer chacun ci-dessous.
NCache fournit un cache client qui est un cache local très proche de votre application. Il peut s'agir d'InProc (c'est-à-dire qu'il réside dans votre processus de candidature) ou d'OutProc local. Dans tous les cas, il fournit un accès très rapide à un sous-ensemble des données mises en cache dont votre application sur ce serveur d'applications a besoin à ce moment. Le cache client reste en même temps synchronisé avec le niveau de mise en cache afin que toutes les données modifiées par d'autres utilisateurs ou applications dans le niveau de mise en cache soient immédiatement propagées au cache client. Le client vous permet d'avoir une vitesse InProc tout en faisant partie d'un niveau de mise en cache très évolutif.
L'un des objectifs architecturaux les plus importants de NCache est d'atteindre une évolutivité linéaire avec la fiabilité des données grâce à ses topologies de mise en cache. Voilà quelque NCache Topologies de mise en cache qui aident à atteindre ces deux objectifs.
L'un des objectifs architecturaux les plus importants de NCache est d'obtenir une haute disponibilité et une élasticité du cache. Pour ce faire, il utilise les fonctionnalités architecturales suivantes :
© Copyright Alachisoft 2002 - . Tous droits réservés. NCache est une marque déposée de Diyatech Corp.