2009-09-09 6 views
3

Lors de l'utilisation de la multidiffusion MSMQ, si une file d'attente (multidiffusion) reçoit des messages et que la machine subit une perte de connexion réseau temporaire, elle recommence à recevoir des messages lorsque la connexion est rétablie. Si la panne de réseau est de courte durée, la file d'attente recevra tous les messages (même ceux qui ont été envoyés alors que la machine de réception a été déconnectée). Cependant, si la durée est suffisamment longue (quelques minutes), certains messages seront perdus ... il y aura un écart dans les messages reçus.Comment détecter une perte de données irrécupérable lors de l'utilisation de la multidiffusion de MSMQ?

Ce comportement est attendu car la multidiffusion MSMQ fournit une distribution fiable (mais non garantie). Ma question est de savoir si MSMQ expose des informations en cas de perte de données. Si je comprends bien, PGM est déjà capable de détecter "perte de données irrécupérable", mais MSMQ expose-t-il cette information?

Une idée est d'inclure un entier avec chaque message qui est incrémenté à chaque envoi. Cela permettrait au récepteur de détecter une lacune dans les messages (provenant d'un expéditeur individuel). Cependant, je crois que PGM le fait déjà. Je ne veux pas ajouter cela au niveau de l'application si PGM/MSMQ peut déjà le détecter.

Des suggestions?

Répondre

1

Je n'ai jamais travaillé avec MSMQ, donc je ne suis pas sûr qu'il existe un moyen d'être averti d'une perte irrémédiable de la socket PGM sous-jacente. Toutefois, sur un socket PGM brut, le socket serait déconnecté s'il ne pouvait pas récupérer les paquets manquants (par exemple, l'expéditeur n'a plus les données dans son cache de renvoi). Dans ce cas, la méthode Receive de ce socket retournera avec WSAECONNRESET. Existe-t-il des événements de connexion/déconnexion dans MSMQ qui pourraient vous alerter d'une réinitialisation de connexion de socket sous-jacente? Personnellement, j'inclue toujours une sorte d'en-tête de niveau d'application dans mes messages, avec par exemple. pour votre cas, une source (vous le voulez dans le cas d'un récepteur, reçoit des données de plusieurs expéditeurs) et une propriété de numéro de séquence, puis vérifiez les lacunes, avec un service instantané hors bande qui vous permet de demander des données manquantes via un protocole fiable comme TCP.

Questions connexes