Utiliser SQL Service Broker pour découpler le service de la database?

Je cherche à mettre en place un service basé sur WCF assez simple, et j'ai une question sur la meilleure façon de le découpler de la database.

Context : Le service que je vais mettre en œuvre est très critique, dissortingbué géographiquement et doit être aussi disponible que possible en cas de sinistre ou de panne de database. La logique métier est assez simple. il reçoit des events d'une source externe, maintient une table d'état et diffuse les mises à jour traitées aux clients connectés. Je remplace un service qui gère actuellement 400 à 600 events entrants par seconde et environ 10 à 20 clients connectés simultanément. Plusieurs instances du service s'exécuteront dans plusieurs locations à travers les États-Unis. Toutes les instances hébergent les mêmes données d'état et partagent des events. Il existe une instance d'une database master (SQL Server 2008) dans un location.

Défi : J'ai déjà conçu un certain nombre d'applications semblables à celles-ci, et j'ai derrière moi la plupart des obstacles architecturaux. Mais j'ai rencontré un défi auquel je ne peux m'empêcher d'imaginer qu'il existe une meilleure solution: dans ma design, la database (MSSQL) est utilisée uniquement pour la persistance; la database n'est lue que lorsque la première instance du service démarre et pour les rapports hors ligne. En fonctionnement normal, l'application écrit uniquement datatables historiques dans la database.

Pour découpler complètement l'application de la database, j'ai déjà utilisé SQL Service Broker: Sur chaque server exécutant le service, j'installe une instance de SQL Server Express qui agit essentiellement comme une queue pour les messages Service Broker vers le kernel ( SSB "target") database. Dans des conditions de fonctionnement normales, l'application exécute toutes ses opérations SQL sur l'instance locale, qui les met en queue / les transmet à la database cible via SSB. Cela fonctionne assez bien, et pour être honnête je suis assez content … Tant que l'instance locale de SQL Server Express est en place, l'application restra évidemment pas au courant des problèmes de la database cible, les problèmes de réseau entre elle et la database cible, etc., et il est hautement survivable dans le cas d'une catastrophe localisée. C'est facile à surveiller, pas trop horrible à mettre en place, et tout est pris en charge. En bref, cela fonctionne, et je suis content de vivre avec si je dois le faire.

Mais ça me semble un peu un kludge. On dirait qu'il devrait y avoir une meilleure façon de faire cela.

Évidemment, une option consiste à mettre en queue les opérations de la database en cours. Je n'aime pas ça parce que si je vais découpler les choses, je préférerais vraiment découpler et garder mon application aussi loin que possible de la BD. Je pourrais aussi écrire un service de données qui met en queue ces opérations … En fait, j'ai brièvement suivi ce path avant de me dire: «Attendez, n'est-ce pas ce que SSB fait déjà?

En raison de contraintes externes non modifiables, une architecture HA / SQL Server plus robuste n'est pas une option. On m'a donné mon cluster à un DB et c'est tout.

Je suis donc ouvert à toutes les pensées et / ou critiques. Y a-t-il quelque chose d'évident qui me manque? Cela ressemble au genre de chose où il pourrait y avoir quelque chose de simple en pierre que j'ai oublié (mais pas par manque de search). Est-ce que je fais une sorte d'erreur architecturale plus large ici?

Merci d'avance!

Mon opinion est évidemment biaisée, mais pour l'anecdote je peux pointer vers plusieurs projets assez gros qui le font (ou l'ont fait) de la même manière, comme High Time Contiguos ETL , March Madness on Demand ou MySpace SQL Server Service Broker .

Mais plusieurs choses ont changé dans les dernières années, et le principal changement est l'augmentation des offres PaaS. Aujourd'hui, vous pouvez disposer d'une database et d'une plate-forme de messagerie hautement disponibles et évolutives, par exemple. SQL Azure et Azure Queues / Azure Service Buss . Ou DynamoDB et SQS si vous êtes prêt à sortir de SQL / ACID. On peut penser que le prix d'un parc d'instances SQL Express vers une version standard de SQL Server sera plus bas qu'une solution PaaS, mais il sera difficile de battre le PaaS en termes de disponibilité, de maintenance gratuite et d'évolutivité à la request.

Donc, mis à part le sharepoint vue PaaS ci-dessus, je dirais que la solution que vous avez est supérieure à presque tout ce que la stack MS a. La WCF est facile à programmer, à less que vous ayez la fièvre anti-SOAP, mais que vous ayez 0 (zéro) à offrir en termes de disponibilité / fiabilité. Votre process est parti === Vos données ont disparu, fin de l'histoire. WCf sur MSMQ est 'WCF' juste de nom, le model de programmation des canaux de queue est à des kilomètres du model de programmation WCF de binding http / net. Et MSMQ n'a pas grand chose à faire face à Service Broker (à part l'omniprésence). mais encore une fois, comme vous le savez probablement, je suis vraiment partial à mon avis …