Ich suche nach Ideen, wie ein Nebenläufigkeits-Framework für meine spezifische Architektur implementiert werden könnte, unter Verwendung von C#:
Ich habe mehrere Module/Container (implementiert als Klassen) erstellt, die alle individuell eine Verbindung zu einem Nachrichtenbus herstellen sollen. Jedes Modul produziert hauptsächlich oder konsumiert hauptsächlich, aber alle Module implementieren auch ein Anfrage/Antwort-Muster für die Kommunikation zwischen zwei bestimmten Modulen. Ich bin ganz neu in der Nebenläufigen und asynchronen Programmierung, möchte aber im Grunde genommen die gesamte Architektur nebeneinander laufen lassen, anstatt synchron. Ich würde mich sehr über Hinweise freuen, welche Technologie (TPL, ThreadPool, CTP, Open-Source-Bibliotheken usw.) für meinen spezifischen Anwendungsfall in Betracht gezogen werden sollte, basierend auf den folgenden Anforderungen:
- Das gesamte System läuft nur auf einem lokalen Rechner (im Prozess, auch der Nachrichtenbus)
- Mindestens ein Modul führt intensive E/A-Vorgänge durch (liest mehrere Millionen 16-Byte-Nachrichten pro Sekunde von einem physischen Laufwerk) und veröffentlicht während der gesamten Zeit mehrere 16-Byte-Chunks an eine blockierende Sammlung.
- Ein anderes Modul konsumiert die Informationen aus der blockierenden Sammlung während der gesamten Zeit.
- Der Einstiegspunkt ist der Produzent, der beginnt, Nachrichten zu versenden, und beendet den Vorgang, wenn der Produzent eine endliche Menge von 16-Byte-Nachrichten veröffentlicht hat.
- Die einzige Kommunikation, die den Nachrichtenbus umgeht, ist die Veröffentlichung/von der blockierenden Sammlung aus zu konsumieren aus Gründen der Durchsatz- und Reaktionszeit. (Ich bin bereit, Vorschläge anzuhören, um den Nachrichtenbus loszuwerden, wenn dies möglich ist)
- Andere Module führen Operationen wie Schreiben in eine SQL-Datenbank, Veröffentlichen an einen GUI-Server, Verbinden mit APIs, die mit externen Servern kommunizieren, durch. Solche Operationen laufen seltener/geregelt und könnten potenziell als Aufgaben ausgeführt werden, anstatt durchgehend einen ganzen Thread während des Betriebs des Systems zu nutzen.
- Ich betreibe eine Maschine mit 64-Bit, Quad-Core und 16 GB Arbeitsspeicher, aber idealerweise möchte ich eine Lösung implementieren, die auch auf einer Dual-Core-Maschine laufen kann.
Basierend darauf, was ich verwalten möchte, auf welche Nebenläufigkeits-Implementierung würden Sie empfehlen, dass ich mich fokussieren sollte?
EDIT: Ich möchte betonen, dass das größte Problem, dem ich gegenüberstehe, ist, wie ich jedes Behälter/Modul bequem mit einem Thread/Aufgaben-Pool verknüpfen kann, so dass jedes Modul asynchron ausgeführt wird und dennoch eine vollständige Ein- und Aus-Kommunikation zwischen solchen Modulen bereitstellt. Ich mache mir nicht allzu große Sorgen darüber, ein einzelnes Produzenten-/Konsumentenmuster zu optimieren, bevor ich nicht das Verknüpfungsproblem aller Module mit einer nebeneinander laufenden Plattform gelöst habe, die die Anzahl der dynamisch beteiligten Aufgaben/Threads bewältigen kann.