Question

Je dois mettre en file d'attente les événements et les tâches des systèmes externes de manière fiable / transactionnelle. Utiliser des éléments comme MSMQ ou ActiveMQ semble très séduisant, mais la partie transactionnelle devient compliquée (MSDTC, etc.).

Nous pourrions utiliser la base de données (SQL Server 2005+, Oracle 9+) et obtenir un support transactionnel plus facile, mais la partie en file d'attente devient plus laide.

Aucune de ces voies ne semble si géniale et regorge de méchants pièges et de cas extrêmes.

Quelqu'un peut-il offrir des conseils pratiques dans ce domaine?

Pensez: E / C / A ou un moteur de tâches planifié qui se réveille de temps en temps et voyez s’il existe des tâches planifiées devant être exécutées à ce moment-là pas encore atteint).

Était-ce utile?

La solution

notre système compte 60 ordinateurs, exécutant chacun 12 tâches (tâches) qui doivent "obtenir le travail suivant". Au total, cela représente 50 000 "emplois". par jour. Faites le calcul du nombre de transactions par minute et réalisez que le temps de travail est variable, il est donc possible d’obtenir plusieurs "pop". événements au même moment.

Nous avons eu notre première version en utilisant MSMQ. conclusion: rester à l'écart . Bien que les problèmes de charge et de synchronisation se soient bien déroulés, il y avait 2 problèmes. un ennuyeux et un briseur d'affaire.

Ennuyeux: en tant que logiciel d'entreprise, MSMQ a des besoins de sécurité qui en font un élément supplémentaire à configurer et à combattre avec l'administrateur réseau du client.

Deal breaker: vint ensuite le moment où nous voulions accepter le prochain travail, mais sans utiliser un simple pop, mais quelque chose comme "obtenir le prochain travail BLEU". ou "obtenir le prochain travail JAUNE". ne peut pas le faire!

Nous sommes allés au plan B: implémenté notre propre Q avec une seule table SQL 2005. ne pourrait pas être plus heureux

J'ai insisté pour le tester avec 200 000 messages par jour, et cela a fonctionné. Nous pouvons faire le " next " logique aussi compliquée que nous voulons.

le piège: vous devez être très prudent avec le SQL qui prend le prochain élément. Puisque vous voulez que ce soit rapide et NON bloquant. Il existe 2 astuces SQL très importantes que nous avons utilisées et qui sont basées sur des recherches. La magie ressemble à ceci:

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy

Autres conseils

J'ai vu MSMQ utilisé de manière transactionnelle et cela ne semblait pas particulièrement compliqué - Transaction SCope encapsulait les appels de mise en file d'attente ou de retrait de la file d'attente avec l'accès à la base de données. Tout allait bien tant que la file d'attente était définie comme transactionnelle une fois créée. Je ne pense pas que cela soit vrai avec ActiveMQ, qui est un courtier de messages, mais MSMQ est installé localement sur chaque ordinateur d'extrémité, de sorte que l'introduction d'un élément de manière transactionnelle dans la file d'attente ne nécessite pas une transaction distribuée sophistiquée.

Vous êtes probablement déjà au courant de cela, mais sur .NET, il existe quelques bibliothèques légères qui fournissent quelques abstractions intéressantes sur MSMQ (et théoriquement d'autres transports également)

nServiceBus: www.nservicebus.com

Transport en commun: http://code.google.com/p/masstransit/

En outre, Oren Eini dispose d’une file d’attente transactionnelle intéressante, si elle est basée sur un système de fichiers expérimental. L'avantage de cette bibliothèque réside dans le fait que, contrairement à MSMQ, elle peut être déployée en tant que bibliothèque et ne nécessite pas la maintenance du déploiement de MSMQ.

Vous en saurez plus à ce sujet ici: http://ayende.com/Blog/archive/2008/08/01/Rhino.Queues.Storage.Disk.aspx

De plus, SQL Server 2005 gère la mise en file d'attente de manière assez élégante, à l'aide de SQL Server Service Broker, mais vous aurez besoin d'installer SQL Server sur chaque ordinateur d'extrémité et je ne sais pas si SSB traverse le pare-feu.

Enfin, si vous ne trouvez pas la réponse à votre question ici, je vous recommande vivement le forum de discussion nSErviceBus. Udi Dahan répond à ce type de questions avec son petit groupe d'adeptes orientés message. C'est la meilleure ressource que j'ai trouvée jusqu'à présent pour obtenir des réponses rapides et compétentes à mes questions orientées sur la file d'attente. Ce forum est ici: http://tech.groups.yahoo.com/group/nservicebus/

Quartz.Net est un système de planification de travaux open source.

C’est ce que MSMQ a été conçu pour - la mise en file d’attente avec des transactions. Si cela ne fonctionne pas, consultez la rubrique "Service Broker". fonctionnalité de SQL Server - c'est la "file d'attente dans une table SQL" que 'csmba' décrit dans sa réponse, mais il s'agit d'un composant intégré de SQL Server, bien emballé et exposé pour votre usage.

WebSphere MQ (MQ Series) est-il une option? Prend en charge la messagerie transactionnelle.

Vous pouvez consulter la fonctionnalité Oracle nommée . Mise en file d'attente avancée

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top