2013-03-21 5 views
48

Stavo solo confrontando le prestazioni degli attori scala rispetto ai thread java.Quanto sono pesanti i thread Java rispetto agli attori Scala/Akka?

Sono rimasto stupito nel vedere la differenza, ho osservato che con il mio sistema sono riuscito a generare massimo 2000 thread (dal vivo alla volta) Ma con lo stesso sistema sono riuscito a generare ~ 500.000 attori di scala.

Entrambi i programmi hanno utilizzato circa 81 MB di memoria Heap di JVM.

Puoi spiegare come i thread java sono molto pesanti rispetto agli attori scala/akka? Qual è il fattore chiave che ha reso lo scala-attore così leggero?

Se si desidera ottenere la migliore scalabilità, dovrei optare per un server Web basato su attori anziché server web/app basati su Java come JBoss o Tomcat?

Grazie.

+3

Come per la domanda del server Web, dipende da ciò che è necessario. Esistono soluzioni davvero scalabili per il throughput elevato, basate su NIO come Netty, e non usano attori. Hai bisogno di un server web completo? servizi ad alto traffico? Alta integrazione con framework noti (jee, spring, ...)? Attori in generale, e Akka 2.1 in particolare con supporto per il clustering, o giocare! che è basato su Akka, sono una soluzione "scalabile", ma non esiste un proiettile d'argento per tutti gli scenari. Dipende davvero dalle tue esigenze. –

risposta

37

Gli attori Scala (inclusa la varietà Akka) utilizzano i thread Java. Non c'è magia: più di qualche migliaio di thread in esecuzione contemporaneamente è un problema per la maggior parte delle macchine desktop.

Il modello di attore consente agli attori svegli on demand che non occupano una discussione a meno che non abbiano del lavoro da svolgere. Alcuni problemi possono essere modellati in modo efficace come molti agenti che dormono in attesa di lavorare, chi lo farà in tempi relativamente brevi e poi riaddormentarsi. In questo caso, gli attori sono un modo molto efficiente di usare il threading Java per portare a termine il tuo lavoro, specialmente se hai una libreria come Akka dove le prestazioni sono state una priorità.

Il Akka docs spiega le basi molto bene.

Tutti i server Web ragionevolmente scalabili devono risolvere questo tipo di problemi in un modo o nell'altro; probabilmente non dovresti basare la tua decisione sul server web principalmente sul fatto che gli attori siano usati sotto il cofano, e indipendentemente da ciò che usi puoi sempre aggiungere attori tu stesso.

+0

Non sono sicuro che i documenti supportino ciò che hai scritto, come si suol dire "... in genere molti attori condividono un thread". – Suma

+2

@ Suma - Non penso che tu abbia capito il mio secondo paragrafo. –

16

Un attore Akka non è equivalente a un thread. È più simile a Callable che viene eseguito su un threadpool.

Quando un messaggio viene inviato a un attore, quell'attore viene posizionato su un threadpool per elaborare il messaggio. Al termine, il thread in pool può essere utilizzato per eseguire altri attori.