2013-09-03 19 views
5

Ho visto benchmark sulla home page di Yesod, ma sono principalmente per file statici. E i benchmark sul sito Web di Snap sono obsoleti.Quale di Yesod's Warp e snap-server dovrei scegliere per un server delle applicazioni ad alte prestazioni?

Sto tentando di esporre un modulo Haskell come servizio. La logica del server è quella di ricevere il nome e gli argomenti della funzione in json, richiamare la funzione haskell e restituire l'output nuovamente come json. La trasparenza referenziale garantisce la sicurezza del thread e la possibilità di memorizzare e memorizzare le funzioni.

Se dovessi supportare connessioni simultanee nell'ordine di 2k - 5k, come dovrei implementarlo? Quanto può essere scalabile questo approccio?

risposta

7

Consiglio vivamente di effettuare la scelta tra Warp/Yesod e Snap in base al sistema che fornisce il miglior set di strumenti per la creazione dell'applicazione. Sia Warp che Snap utilizzano lo stesso gestore di I/O GHC sottostante ed entrambi sono altamente ottimizzati. Sarei sorpreso se un'applicazione ben scritta per ogni sistema, facendo qualcosa di non banale, mostrasse un gap di prestazioni significativo.

Il tuo ultimo paragrafo è un po 'vago, ma penso che la risposta di base per Warp o Snap sia semplicemente scrivere il tuo codice, e il gestore I/O scalerà nel miglior modo possibile. Se si trovano realmente connessioni concorrenti come collo di bottiglia, si potrebbe prendere in considerazione l'idea di provare la tecnica di prefork, utilizzando GHC 7.8 (non ancora rilasciato, ma con un gestore I/O molto migliorato) o utilizzando più server.

5

La maggior parte dei benchmark pubblicati per Warp e Snap si basano su un benchmark estremamente semplice e molto elaborato che restituisce una stringa statica di "pong". Questo è ottimo per confrontare l'efficienza con cui un server web analizza le richieste HTTP, costruendo risposte HTTP, ecc., Ma nella maggior parte delle applicazioni il tempo trascorso a fare quelle cose sarà trascurabile. In secondo luogo, suppongo che eventuali differenze di prestazioni tra Warp e Snap potrebbero diminuire in futuro, dal momento che entrambi i server continuano a migliorare e ad avvicinarsi al limite teorico. Inoltre, mi aspetto che entrambi i server beneficeranno in modo significativo anche dei miglioramenti delle prestazioni in GHC 7.8.

Haskell è una scelta eccellente per ottenere prestazioni elevate con un numero elevato di connessioni simultanee. Haskell ha fili verdi che sono estremamente economici rispetto ai fili nella maggior parte delle altre lingue. Ciò offre un enorme vantaggio ai framework web Haskell. Possiamo attivare un nuovo thread per ogni connessione e sfruttare l'enorme sforzo che è stato fatto per ottimizzare GHC per ottenere grandi prestazioni mantenendo comunque un buon modello di programmazione.

Per quanto riguarda Yesod vs Snap, esiste un motivo per cui i due esistono come progetti separati. Si stanno avvicinando al problema dello sviluppo web in Haskell da due direzioni completamente diverse. Entrambi traggono vantaggio dalle prestazioni ottenute da Haskell, quindi dovresti scegliere tra loro in base all'approccio che preferisci. Ecco alcune risorse per iniziare: