Der beste Weg, um viele eingehende Pakete zu behandeln

8

Ich entwickle gerade 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.

Immer wenn ich ein Paket erhalte, starte ich einen neuen Thread, der dieses spezifische 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 habe über eine Warteschlange oder etwas nachgedacht, wo ich alle eingehenden Pakete ablege und einen einzigen Thread habe, der alle Pakete einzeln aus dieser Warteschlange behandelt (so 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 verarbeiten, ohne für jeden einen neuen Thread zu starten? Soll ich mit dem was ich habe, den Produzenten verzehren oder etwas anderes machen?

    
Wondering 29.11.2012, 21:58
quelle

2 Antworten

0

Wie lange dauert es, bis Ihre Anwendung ein Paket bearbeitet?

Für die ping-Verfahren ist es wahrscheinlich schneller, sie einfach so zu verarbeiten, wie sie empfangen werden. Sie können die anderen in eine gemeinsame Datenstruktur wie eine bestimmte blockierende Warteschlange stellen. Wenn die Warteschlange leer ist, warten die Worker-Threads auf neue Jobs Wenn ein neuer Job hinzugefügt wird, wird ein Thread aktiviert und führt den Job aus.

Wenn Sie wahrscheinlich einen Thread pro Paket starten, verbrauchen Sie mehr Zeit beim Starten und Stoppen der Threads als beim eigentlichen Ausführen des Jobs.

Wenn die Dinge, die als Antwort auf ein Paket zu tun sind, für alle Arten von Paketen nicht so zeitaufwendig sind, kann es sein, dass die zusätzliche Zeit mit den Sperren der Warteschlange und dem Planen von Threads Ihr Programm eher langsamer macht als schneller.

Benutze in jedem Fall den Thread-Pool und starte die Worker am Anfang. Wenn Sie möchten, können Sie die Anzahl der aktiven Threads abhängig von der Last der letzten Minuten dynamisch erhöhen oder verringern.

    
LtWorf 29.11.2012, 22:15
quelle
0

Ich würde ein event driven architecture verwenden. Das Erstellen eines neuen Threads für jedes Paket ist nicht skalierbar, daher funktioniert dies mit einer gewissen Arbeitslast, aber es gibt einen Punkt, an dem es nicht mehr funktioniert. Du könntest das mit z.B. ein Chat-Programm wie der Facebook-Chat, bei dem Nachrichten die Pakete sind. Eine ereignisgesteuerte Architektur wäre skalierbar und IMHO genau das, wonach Sie suchen. Einfach googeln, da Bibliotheken für viele Programmiersprachen, also wähle einfach die richtige für dich aus (ich mache das gerne in Erlang, Scala, C oder Python).

edit: ok, habe das Java-Tag nicht gesehen. Aber die Sprache ist egal.

Sehen Sie sich zum Beispiel diesen Link an: Ссылка

Ich finde es ziemlich gut, die Idee der ereignisgesteuerten Programmierung zu verstehen.

    
Cravid 29.11.2012 22:48
quelle

Tags und Links