Ich entwickle derzeit ein einfaches P2P-Netzwerk als Übung. Jeder Knoten im Netzwerk sendet Heartbeats an eine Teilmenge der anderen Knoten, um Knoten zu erkennen, die das Netzwerk verlassen haben. Neben den Heartbeat-Paketen sende ich Pakete, wenn neue Knoten dem Netzwerk beitreten/verlassen, wenn sie eine Ressource (kleine Textdateien) usw. suchen wollen. Alle Pakete sind UDP-Pakete.Der beste Weg, um viele eingehende Pakete zu behandeln
Immer wenn ich ein Paket erhalte, starte ich einen neuen Thread, der dieses spezielle Paket behandelt. Ich mache mir jedoch Gedanken über die Anzahl der Threads, die ich während einer Anwendungslebensdauer starte, was ziemlich viel ist (vor allem wegen der Herzschläge). (Es besteht auch die Gefahr von Deadlocks und dergleichen, die ich gerne vermeiden würde).
Ich dachte über eine Warteschlange oder etwas, wo ich alle eingehenden Pakete und einen einzigen Thread alle Pakete nacheinander aus dieser Warteschlange (etwas wie das Producer-Consumer-Muster). Ich möchte, dass die Pakete schnell bearbeitet werden, so dass der Absender das Paket nicht verloren sieht.
Was ist der beste Weg, um viele verschiedene eingehende Pakete zu behandeln, ohne für jeden einen neuen Thread zu starten? Soll ich mit dem was ich habe, den Produzenten verzehren oder etwas anderes?
Sicher. Verwenden Sie den Producer-Consumer mit einer LinkedList. Der einfachste Weg, den ich mir vorstellen kann. – DankMemes
Sie können mit etwas altmodischem beginnen, wie Sie es selbst genannt haben, einige Benchmarks machen und dann etwas Neues ausprobieren, wie "Disruptor" (http://lmax-exchange.github.com/disruptor/) und dann noch etwas mehr Benchmarks. –
Es kann helfen, "viele verschiedene eingehende Pakete" zu quantifizieren ... Relativ gesehen sollten Herzschläge nicht viel sein, wenn ein modernes System typischerweise Hunderte bis Tausende von Paketen pro Sekunde verarbeiten kann, abhängig von der Anzahl und Art Ihrer NICs . Ich vermute, dass Herzschläge im Bereich von Dutzenden pro Minute liegen könnten ... – twalberg