Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Ich habe da nicht so viel Erfahrung drin, aber ich denke nicht dass es gesund sein wird später 600 Threads zu haben. Im Moment sind es nur ugf. 200, die aber nicht parallel laufen sondern immer erzeugt und zerstört werden (z.B. auf Programm-Ebene) wenn einer der 200 User was machen will. Sollte ich es vermeiden so viele Threads zu haben?
Mein alternativer Ansatz wäre, in einem Thread einen Selector laufen zu lassen, der bei einem Event (Accept/Read) einen Thread aus einem ThreadPool disponiert, der den Request verarbeitet und im selben Thread falls nötig eine Response sendet. Ich weiß nicht welche Modelle da gängig sind für solche Client-reichen Server. Die Gefahr die ich da sehe ist, dass ein Bottleneck dadurch entsteht, dass der Pool keine Threads mehr hat. Welche Werte sind da empfohlen als Maximum?
Ich hatte neulich einen Bug dass ein TimerTask der jede 3 Minuten ausgeführt werden sollte (scheduleAtFixedRate) einfach nicht mehr gelaufen ist und der Server neugestartet werden musste. Ich weiß nicht ob das was damit zu tun haben könnte.
Wenn du von asynchron wieder auf synchron wechselst gewinnst du nicht viel. Aber Datei- und Netzwerkoperationen sind inzwischen zum großen Teil asynchron vorhanden (NIO 2 & Netty). Problematisch sind meist nur die Datenbankzugriffe. Da wird ein Ansatz wie deiner mit einem Connection Pool verwendet. Da der Connection Pool sich aber nur auf die Datenbankverbindungen bezieht, ist die Größe recht beschränkt. Die Datenbank wird durch eine große Anzahl an Verbindungen nicht schneller.
Fängst du alle Exceptions in deinem Task? Sollte nämlich eine Exception durchfliegen, wird der Task nicht wieder gescheduled.
Mein Gedanke ist, dass wenn ich 400 Threads habe und dann plötzlich einer was von der DB will, ist das eine blockierende Operation für den Thread (?) und ein anderer kriegt dann solange mehr Zeit.
Wenn ich nur eine begrenzte Anzahl von Threads habe, und die sind plötzlich alle blockiert, profitiert keiner davon, da die anderen Requests ja noch auf einen Thread warten.
Treue Seele
Das möchte ich abschaffen und auf eine konstante Verbindung setzen, da sowieso jede 10 Sekunden eine Nachricht geschickt wird und der Server auch auf seine Initiative Nachrichten schicken können soll
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »birdfreeyahoo« (23.01.2019, 17:37)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Treue Seele
Werbeanzeige