2010-03-24 5 views
5

Ich frage mich, wie es möglich ist, eine Socket-Verbindung pr zu vermeiden. Faden in Scala. Ich habe viel darüber nachgedacht, aber ich habe immer einen Code, der auf eingehende Daten für jede Clientverbindung wartet.Die Scala Möglichkeit, einen Akteur pro Socket-Verbindung zu verwenden

Das Problem ist, dass ich eine Anwendung entwickeln möchte, die gleichzeitig vielleicht ein paar tausend Verbindungen handhaben sollte. Allerdings werde ich natürlich wegen der fehlenden Skalierbarkeit und Kontextwechsel nicht für jede Verbindung einen Thread erstellen wollen.

Was wäre der "richtige" Weg, dies zu tun. In meiner Welt sollte es möglich sein, einen Akteur für jede Verbindung zu haben, ohne einen Thread pro Akteur blockieren zu müssen.

Antwort

4

Ich habe eine Anwendung, die Schauspieler mit nicht blockierenden Sockets (d. H. NIO) mischt. Die Art und Weise, wie ich dies getan habe, ist ein dedizierter IO-Thread, der Nachrichten an Aktoren sendet (auf die gleiche Art und Weise, wie er Arbeit an einen Thread-Pool in einem Java-System delegiert) unter Verwendung des Reaktormusters.

Offensichtlich mit den alten blockierenden Sockets, sind Sie auf einen Thread pro Verbindung beschränkt. Und Schauspieler könnte damit umgehen, aber natürlich beschränkt dies die Anzahl der Verbindungen, die gleichzeitig behandelt werden können.

Im Fall eines einzelnen IO-Threads ist dieser ein theoretischer Engpass, aber in der Praxis (in unseren Beobachtungen) nicht viel, da der IO-Thread rechenintensiv arbeitet. Es gibt viele gute Diskussionen, die auf dem NIO reactor pattern gefunden werden können.