Question

Ma classe C # doit pouvoir traiter un grand nombre d'événements reçus via une connexion socket de type flux tcp. Le volume de messages d'événements reçus du serveur TCP par le socket de la classe est complètement variable. Par exemple, il ne reçoit parfois qu'un message d'événement dans une période de dix secondes et à d'autres moments, il reçoit soixante messages d'événement en une seconde.

J'utilise Socket.ReceiveAsync pour recevoir des messages. ReceiveAsync renvoie true si l'opération de réception est en attente ou false s'il existe déjà des données sur le fil et que l'opération de réception est terminée de manière synchrone. Si l'opération est en attente, le socket appelle mon rappel sur un thread d'achèvement d'E / S, sinon j'appelle mon propre rappel dans le thread actuel (IOC). De plus, en plus des messages d’événement, je reçois aussi des réponses aux commandes envoyées à ce serveur TCP. Les messages de réponse sont traités immédiatement. individuellement, en renvoyant un ouvrier threadpool.

Toutefois, je souhaite mettre en file d'attente les messages d'événement jusqu'à ce que j'ai "suffisant" (N) d’entre eux OU jusqu’à ce qu’il n’y ait plus de fil sur le fil ... puis déclenchez un travailleur threadpool pour traiter un lot de messages d’événement. De plus, je souhaite que tous les événements soient traités de manière séquentielle, de sorte que je ne souhaite qu’un seul agent de traitement de pool de threads puisse y travailler à la fois.

Le processeur des messages d’événement a seulement besoin de copier le tampon de message dans un objet, de déclencher un événement, puis de relâcher le tampon de message dans le pool de mémoire tampon. Ma question est donc la suivante: quelle est, à votre avis, la meilleure stratégie pour y parvenir?

Avez-vous besoin de plus d’informations? Faites le moi savoir. Merci !!

Était-ce utile?

La solution

Je n’appellerais pas 60 événements par seconde en volume élevé. À ce faible niveau d’activité, n’importe quelle méthode de traitement de sockets convient. J'ai traité 5 000 événements par seconde sur un seul thread en utilisant un matériel beaucoup moins capable que les machines actuelles, en utilisant simplement select.

Je dirai que si vous envisagez de faire évoluer votre système, la transmission individuelle des messages entre les threads sera un désastre. Vous devez effectuer un traitement par lots, sinon vos commutateurs de contexte nuisent aux performances.

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