Ich habe eine Entwurfsfrage für einen Multithreading-Windows-Dienst, der Nachrichten von mehreren Clients verarbeitet. Die Regeln sind
- Jede Nachricht dient dazu, etwas für eine Entität (mit einer eindeutigen ID) zu verarbeiten und kann unterschiedlich sein, z. B. DoA, DoB, DoC usw. Die Entitäts-ID steht in der Nutzlast der Nachricht.
- Die Verarbeitung kann einige Zeit dauern (bis zu einigen Sekunden).
- Die Nachrichten müssen in der Reihenfolge ihres Eintreffens für jede Entität (mit derselben ID) verarbeitet werden.
- Nachrichten können jedoch gleichzeitig für eine andere Entität verarbeitet werden (d.h. solange es sich nicht um dieselbe Entitäts-ID handelt)
- Die Anzahl der gleichzeitigen Verarbeitungen ist konfigurierbar (im Allgemeinen 8)
- Nachrichten können nicht verloren gehen. Wenn bei der Verarbeitung einer Nachricht ein Fehler auftritt, müssen diese Nachricht und alle anderen Nachrichten für dieselbe Einheit für eine spätere manuelle Verarbeitung gespeichert werden.
- Die Nachrichten kommen in einer transaktionalen MSMQ-Warteschlange an.
Wie würden Sie den Dienst gestalten? Ich habe eine funktionierende Lösung, aber ich würde gerne wissen, wie andere dieses Problem angehen würden.