2010-07-13 2 views
0

J'ai développé une visionneuse de rapports dans .NET Winforms (elle exécute simplement des requêtes et affiche les résultats).Gestion des exceptions dans un système piloté par SQL-Server en temps réel

Cela fonctionne par rapport à une base de données de rapports. Cependant, ce qui précède est un petit sous-ensemble d'une application beaucoup plus grande, qui obtient des données d'une autre base de données. Cela ressemble à ceci:

Le système surveillé a un changement d'état (par exemple augmentation de la latence) => L'événement est enregistré dans la base de données SQL Server (appelez cette base A) comme transaction => Ceci déclenche un déclencheur pour écrire le même événement dans la base de données de rapports. Je ne suis pas sûr des différences entre les deux bases de données, ils peuvent être réglés pour différents objectifs ou il peut y avoir une raison financière ou même politique pour les deux bases de données. De toute façon, le terme a été mentionné que la base de données de rapports est «dépendante de la transaction» sur la base de données principale. Qu'est-ce que cela signifie exactement? La base de données de reporting dépend entièrement des transactions de la base de données A? Cela m'a fait réfléchir à quelques questions:

1) Comment gérer la situation dans laquelle la base de données de rapports n'a pas d'espace disque, mais la base de données A envoie-t-elle toujours des déclencheurs à la base de données de rapports? Serait-il bon de mettre en file d'attente 2) Lié à ce qui précède, cela fonctionnerait-il si je mettais en file d'attente les déclencheurs et leurs données incapables de se lancer dans la db de reporting (pas sûr comment, mais conceptuellement ...)? Même alors, cela rend le système pas temps réel.

Existe-t-il d'autres dangers/problèmes avec la gestion des exceptions dans une configuration comme celle-ci?

Merci

Répondre

1

Ces dépendances sont en fait très mauvais dans la production. Pour une fois, les déclencheurs et la mise à jour (distante) des bases de données est un coup sûr pour tuer la performance. Mais plus important encore est la question de la disponibilité. Les applications qui dépendent de la base de données A sont maintenant liées à la disponibilité de la base de données B, car si la base de données B n'est pas disponible, le déclencheur ne peut pas faire son travail, il échouera et l'application rencontrera des erreurs. Donc, maintenant le ou les éditeurs de la base de données B sont connectés pour les opérations des applications utilisant la base de données A.

Il existe de nombreuses approches pour ce problème, la plus simple consiste à déployer la réplication transactionnelle à partir d'une publication dans la base de données A avec un abonnement dans la base de données B. Cela isole les deux bases de données d'un point de vue transactionnel, permettant à l'application dépendant de la base de données A de poursuivre sans hésiter lorsque la base de données B est indisponible, ou simplement lente.

0

Si le système doit être en temps réel, alors les déclencheurs sont le seul moyen. Notez que les déclencheurs sont entièrement synchrones - l'opération sur la base de données de rapports devra se terminer correctement ou le déclencheur échouera, et il est probable que vous échouerez votre opération sur la base de données de transaction car elle est dans un déclencheur, l'instruction sur la table d'origine Échec, qui peut ou non être détecté, mais de toute façon, la modification de cette table dans la base de données de transactions n'aura pas lieu. Il existe des raisons valables pour ce scénario, mais cela crée réellement une dépendance de la base de données de transactions sur la base de données de rapports, car si la base de données de rapports est désactivée, la base de données de transactions devient effectivement en lecture seule ou pire.

Ce n'est pas vraiment ce que vous voulez.

Vous pouvez regarder la réplication si votre base de données a la même structure.Généralement, lorsque je pense à une base de données de rapports, je pense à une structure différente, optimisée pour les rapports, et pas seulement à une autre copie des données isolée pour des raisons de performances (ce qui est bien, mais le problème d'arrêter de signaler les utilisateurs blessant les utilisateurs de transaction).