Soudainement, beaucoup de problèmes liés au délai d’attente des opérations d’attente sur SQL Azure

Il y a deux jours, sans changement de code ni de modification de la firebase database, je ne reçois pas beaucoup d’erreurs (toutes les 5 minutes environ) avec The wait operation timed out erreur d’ The wait operation timed out avec deux erreurs de soulignement complet différentes concernant la connexion préalable et la connexion. autre sur le post:

System.Data.Entity.Core.EntityException: le fournisseur sous-jacent a échoué lors de l’ouverture. —> System.Data.SqlClient.SqlException: le délai de connexion a expiré. Le délai d’attente s’est écoulé lors de la tentative d’utilisation de l’accusé de réception de connexion préalable à la connexion. Cela peut être dû à l’échec de la négociation préalable à la connexion ou à l’incapacité du serveur à répondre à temps. La durée passée lors de la tentative de connexion à ce serveur était – initialisation [Pré-connexion] = 21; poignée de main = 14988; —> System.ComponentModel.Win32Exception: l’opération d’attente a expiré

System.Data.Entity.Core.EntityException: le fournisseur sous-jacent a échoué lors de l’ouverture. —> System.Data.SqlClient.SqlException: le délai de connexion a expiré. Le délai d’attente s’est écoulé pendant la phase de post-connexion. La connexion a peut-être expiré en attendant que le serveur termine le processus de connexion et réponde; Ou bien, il aurait pu arriver à expiration lors de la tentative de création de plusieurs connexions actives. Cet échec s’est produit lors de la tentative de connexion à la destination de routage. La durée passée lors de la tentative de connexion au serveur d’origine était – initialisation [Pré-connexion] = 5; poignée de main = 3098; [Login] initialisation = 0; authentification = 0; [Post-Login] complete = 7; La durée passée lors de la tentative de connexion à ce serveur était – initialisation [Pré-connexion] = 20; poignée de main = 5; [Login] initialisation = 0; authentification = 0; [Post-Login] complete = 11003; —> System.ComponentModel.Win32Exception: l’opération d’attente a expiré

J’utilise Entity Framework et mon site Web est hébergé sur une application Web Azure. J’ai creusé et la plupart des questions SO que je trouve à ce sujet ne sont PAS liées à Entity Framework mais ADO.Net, les quelques publications que j’ai trouvées me conduisent à jour d’un service Basic to Standard (S0) pour la firebase database et à la création d’un GlobalDBConfig avec

 public class GlobalDBConfig : DbConfiguration { public GlobalDBConfig() { SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy(2, TimeSpan.FromSeconds(30))); } } 

Comment puis-je savoir ce qui ne va pas et le réparer? Ceci est une firebase database très simple avec des requêtes simples et très peu de trafic sur le site (moins de 1000 visites par jour)

Nous avons résolu ce problème, ainsi que d’autres types de délais d’attente aléatoires sur SQL Azure, en basculant sur “utilisateurs restreints”. L’utilisation de connexions au niveau serveur sur SQL Azure peut entraîner des problèmes:

Cela n’est pas très efficace, car dans SQL DB maître et utilisateur peuvent siéger sur deux serveurs SQL différents, potentiellement sur deux machines différentes. De même, lorsqu’un serveur dispose de plusieurs bases de données d’utilisateurs, le goulot d’étranglement du processus de connexion sera maître et, sous charge, cela peut entraîner un temps de réponse élevé pour les connexions. Si Microsoft met à jour le logiciel sur la machine / le serveur, alors le maître sera indisponible pendant quelques secondes et toutes les connexions à la firebase database utilisateur peuvent également échouer ( http://www.sqlindepth.com/contained-users-in -sql-azuree-db-v12 / )

Comme dans votre cas, j’avais des doutes car ma firebase database n’était pas surchargée, mais le passage à des utilisateurs confinés a tout de même fait une énorme différence.

Le code SQL permettant de créer ces utilisateurs est le suivant (exécutez cette opération sur la firebase database elle-même et non sur la firebase database maître comme vous le feriez pour la création de connexions au niveau du serveur):

 Create user ContainedUser with password = 'Password' ALTER AUTHORIZATION ON SCHEMA::[db_owner] TO [ContainedUser] ALTER ROLE [db_owner] ADD MEMBER [ContainedUser] 

Voici quelques options à essayer: Je vous recommande fortement d’utiliser si possible les options (1) et (3).

  1. Règles de pare-feu de firebase database utilisateur et authentification d’utilisateur contenu
  2. Augmenter le délai de connexion à une valeur importante (60-120 secondes?)
  3. Si possible, mettez à jour vos pilotes clients vers la dernière version (7.4 et supérieure)

Nous avons eu des problèmes similaires et notez que la mise à l’échelle AUTO n’existe pas sur les bases de données autonomes sur Azure et que vous utilisez Entity Framework, voici quelques suggestions ci-dessous.

  1. Si vous appelez Web-API pour récupérer et effectuer des transactions avec votre firebase database sur Azure SQL, assurez-vous que sur le portail Azure vous définissez l’option “ALLWAYS ON” pour l’API Web.

  2. Ensuite, votre application client devrait probablement réessayer si elle ne parvient pas à se connecter lors de la première tentative.

  3. Si les requêtes dans la firebase database entraînent des délais d’expiration en raison du volume de données et que les index ne parviennent pas à rattraper ce retard, vous devrez augmenter un peu le délai d’exécution des commandes et, surtout, mettre à jour les statistiques. la firebase database et recomstackr tous les objects de la firebase database.