2009-12-13 12 views
2

Dans un environnement avec un cluster ou un miroir de basculement SQL Server, comment préférez-vous gérer les erreurs? Il semble qu'il y ait deux options:Gestion des requêtes de base de données qui échouent en raison d'un basculement de serveur

  1. Fail toute demande du client en cours, et que l'utilisateur puisse retenter
  2. Catch l'erreur dans votre DAL, et essayez de nouveau il

Chaque approche a ses avantages et contre. La plupart des magasins avec lesquels j'ai travaillé font # 1, mais beaucoup d'entre eux ne respectent pas non plus les strictes limites transactionnelles, et me paraissent se montrer ouverts aux problèmes en cas d'échec. Malgré tout, j'ai de la difficulté à les mettre en # 2, ce qui devrait aussi améliorer l'expérience utilisateur (un retard est potentiellement long pendant le basculement).

Tout argument dans un sens ou dans l'autre serait apprécié. Si vous utilisez la seconde approche, avez-vous un wrapper standard qui aide à simplifier la mise en œuvre? Dans un cas comme dans l'autre, comment structurez-vous votre code pour éviter des problèmes tels que ceux liés au manque d'idempotence dans la commande qui a échoué?

Répondre

0

Le numéro 2 pourrait être une boucle infinie. Que faire si c'est lié au réseau, ou si le PC local a besoin d'être redémarré, ou autre chose?

Numéro 1 est ennuyeux pour les utilisateurs, bien sûr.

Si vous autorisez uniquement l'accès via un site Web, vous ne verrez jamais l'erreur, à moins que le basculement se produise en cours d'appel. Pour nous, c'est peu probable et nous avons échoué sans que les utilisateurs finaux se rendent compte.

Dans la vraie vie, il se peut que vous n'ayez pas de DAL propre et agréable sur un serveur Web. Vous pouvez avoir une feuille Excel reliant (la plupart des finances) ou WinForms où la connexion est maintenue ouverte, ainsi vous n'avez qu'une seule option.

Le basculement ne devrait prendre que quelques secondes. Si la récupération de BD prend plus que cela, vous avez des problèmes plus importants de toute façon. Et si cela arrive assez souvent d'avoir à penser à la manipulation, bien ...

En résumé, il arrivera que rarement que vous voulez savoir et le numéro 1 serait mieux. A MON HUMBLE AVIS. Est-ce que vous ne pouvez pas éviter une boucle infinie avec un compteur de réessayer?

+0

Si vos failovers ne prennent que quelques secondes, vous avez de la chance. La plupart des systèmes basés sur des clusters SQL Server avec lesquels j'ai travaillé mettent au moins 30 secondes pour tout restaurer, plus des retards supplémentaires lorsque le cache du serveur de secours se remplit - et peut durer jusqu'à 2 minutes. Les miroirs ne sont que quelques secondes, mais la plupart des magasins avec lesquels je travaille ne les utilisent pas (encore). – RickNZ

+0

Par quelques-uns, je veux dire 20-30 secondes: les utilisateurs ne remarquent pas. Quel serait un nombre de tentatives valide? Est-ce qu'il gère les délais d'attente, les blocages? Va-t-il réessayer seulement pour les déconnexions forcées? etc etc – gbn

+0

J'utilise normalement un nombre de tentatives de 2, avec un retard entre les deux. L'idée n'est pas d'empêcher l'utilisateur de voir une erreur; juste pour minimiser les chances que cela se produise. Comment vous assurez-vous que les insertions qui ont réussi juste avant une commande qui a échoué sur la même page ne sont pas émises une seconde fois après un échec? Rien de plus que juste une conception de transaction minutieuse? – RickNZ