Comment communiquer efficacement entre des applications liées à une database?

Nous avons un certain nombre de différentes applications côté client C # WinForm client-server old school qui sont essentiellement des frontaux pour la database. Ensuite, il y a un service Windows côté server C # qui attend que les applications clientes soumettent des commands et ensuite les traite.

La façon dont le service côté server découvre s'il y a du travail à faire est d'interroger la database. Au fil des ans, la logique des sondages pour les commands en attente s'est beaucoup compliquée en raison de la myriade de règles commerciales. Donc, à cause de cela, le process d'interrogation stocké lui-même utilise un peu de ressources SQL Server même s'il n'y a rien à faire. Ajoutez à cela l'exigence que les commands soient traitées au moment où elles sont soumises et vous avez vous-même rencontré un problème de performances, car la database est constamment interrogée.

La configuration fonctionne très bien en ce moment, mais la charge est sur le sharepoint passer à travers le toit et, il est évident, qu'elle ne tiendra pas.

Quels sont les moyens efficaces pour communiquer entre un tas d'applications côté client différentes et un service Windows côté server, qui sera plus à l'épreuve du futur que la méthode actuelle?

Le server de database est SQL Server 2005. Je peux probablement get les pouvoirs pour poney jusqu'à la dernière version de SQL Server si cela arrive vraiment, mais je préfère ne pas me battre.

Il existe de nombreuses façons de notifier les clients.

  • Vous pouvez utiliser une solution prête à l' emploi comme NServiceBus pour publier des informations du server sur les clients ou d'autres servers. NServiceBus utilise MSMQ pour publier un message à plusieurs abonnés de manière très simple et durable.
  • Vous pouvez utiliser MSMQ ou un autre produit de mise en queue pour publier des messages à partir du server qui sera remis aux clients.
  • Vous pouvez héberger un service WCF sur le service Windows et vous y connecter à partir de chaque client à l'aide d'un canal Duplex. Chaque fois qu'il y a un changement, le service avertira les clients appropriés ou même tous. Ceci est plus complexe à coder mais aussi beaucoup plus flexible. Vous pourriez probablement envoyer assez d'informations aux clients pour qu'ils n'aient pas besoin d'interroger la database.
  • Vous pouvez requestr au service de diffuser un package UDP à tous les clients pour les informer des modifications qu'ils doivent effectuer. Vous pouvez probablement append suffisamment d'informations dans le package pour permettre aux clients de décider s'ils doivent extraire des données du server ou non. C'est très léger pour le server et le réseau, mais cela suppose que tous les clients sont dans le même LAN.

Vous pouvez peut-être utiliser SqlDependency pour recevoir des notifications uniquement lorsque datatables changent réellement.

Vous pouvez utiliser n'importe quel middleware de messagerie comme MSMQ, JMS ou TIBCO pour communiquer entre votre client et le service.

De loin, la réponse la plus facile, et probablement la less chère, est simplement d'acheter un plus gros server.

Sauf cela, vous êtes dans un effort de développement qui a une forte probabilité d'échec précoce. Par échec, je ne veux pas dire que vous finissez par gratter quoi que ce soit que vous finissez par build. Au contraire, je veux dire que vous lancez les changements et les commands seront foirées pendant que vous déboguez votre myriade de règles métier.

Très franchement, je ne considérerais pas approcher un changement de communication sous pression; En supposant que votre déclaration sur le chargement va "à travers le toit" à court terme.

Si votre exposition au risque est telle qu'elle doit être 100% fonctionnelle le premier jour (ce qui est normal lorsque vous prévoyez une forte augmentation des commands), sans hoquet, il vous suffit de migrer le server de database. Heck, je ne voudrais même pas installer le dernier server SQL sur celui-ci. Au lieu de cela, il suffit d'acheter une machine plus grande, installez le même operating system et le même server DB (et les niveaux de correctif) et déplacez votre database.

Ensuite, examinez votre architecture pour déterminer ce qui doit disparaître et ce qui peut être récupéré.

Si tout le monde se connecte à SQL Server, il existe également l'option Service Broker . Contrairement aux autres solutions de messagerie / mise en queue recommandées jusqu'ici, elles sont entièrement contenues dans votre database (pas de produit séparé à déployer, administrer et configurer), elles offrent une seule histoire par rapport à vos besoins de sauvegarde / restauration. pour le magasin de messages, pas DR / HA séparé, quelle que soit votre solution DB est également votre solution de messagerie) et sur une API de programmation uniforme (SQL).

Même lorsque tout est dans une seule instance SQL Server (c'est-à-dire qu'il n'est pas nécessaire de communiquer via le réseau entre plusieurs instances de service SQL) Service Broker a toujours un as que personne ne peut égaler: activation . Avec l'activation, vous éliminez complètement le besoin d'interroger car le système lance lui-même votre code de traitement (va «activer») lorsqu'il y a des events à traiter. Le code de traitement peut être interne (procédure T-SQL ou procédure SQLCLR .Net) ou externe (voir activateur externe ).