2013-11-03 14 views
20

Sto lavorando a un'applicazione RESTfull che richiede un'elevata scalabilità. Sto considerando i framework basati su Netty per le applicazioni RESTfull. Ho esaminato alcune delle opzioni disponibili e ho cercato di ottenere ciò che potevano offrire come un'implementazione non bloccante. Ecco i miei risultati:Framework REST non bloccante basato su n.

  1. rest.li -> Ancora in fase sperimentale per implementazioni NIO basate su Netty. Quindi, non pronto per la produzione.
  2. RESTEasy -> Progetto JBoss standard che supporta Netty 4.x. Ma, invece di un'implementazione completa NIO basata su Netty stack, RESTEasy è uno scambio di buffer tra Netty e RESTEasy. Non sta prendendo i vantaggi di Netty. Pertanto, la scalabilità non è elevata come previsto da un framework basato su Netty.
  3. Componente Netty-http -> Un'altra opzione è l'integrazione di Apache Camel mentre si utilizza il componente Netty-http come endpoint per instradare le richieste ai servizi esposti dai bean. Penso che sia come RESTEasy, solo il componente Netty-http usa le funzionalità NIO basate su Netty e il resto del sistema userebbe il vecchio IO. Non credo che sarei di grande aiuto per ottenere scalabilità.
  4. RESTExpress -> Sostiene di essere un framework basato su Netty per l'applicazione RESTFull. Ma, né ha una comunità decente né può essere attendibile (perché è molto nuovo) per l'applicazione aziendale che richiede un alto grado di sicurezza.

Prima di ottenere i risultati di cui sopra, volevo utilizzare alcuni framework pronti all'uso e portare a termine il lavoro più rapidamente.

So che è una domanda basata sull'opinione. Tuttavia, ho ancora seriamente bisogno di aiuto per scegliere il framework giusto per la mia applicazione. Se nel caso, non esiste un framework REST basato su Netty: sarebbe saggio optare per il codice NIO di basso livello basato su Nether per l'impianto idraulico nella mia applicazione? Qualsiasi aiuto apprezzato. Grazie in anticipo.

+0

Potreste essere sorpresi che BIO spesso si comporta meglio di NIO particolare per il caso di richieste brevi (cioè senza tenere in vita o websocket). La maggior parte dei client REST e anche REST in generale sono brevi richieste. –

+2

L'utilizzo di un framework NIO REST non renderà magicamente scalabile l'applicazione. Rendere l'applicazione stateless e utilizzare correttamente le intestazioni della cache è un buon inizio. – eiden

+0

@eiden Sto già giocando con Akka-Actors con funzionalità remote per renderlo un'applicazione altamente scalabile e distribuita. Volevo solo sbarazzarmi della natura di blocco dell'API Servlet. Ho iniziato a giocare con Spray + Akka Actors. –

risposta

11

Se si desidera realmente il blocco non è necessario eseguire il blocco da zero e disporre di proper REST clients. In caso contrario, come indicato in my comment, la differenza di prestazioni sarà trascurabile e in molti casi peggiore per NIO (Netty con condivisione thread).

Solo due librerie che conosco non bloccano da zero Vert.x e un po 'di Finagle (mancano altre cose come l'accesso ai dati non bloccanti).

È inoltre necessario conoscere Tomcat e vari altri contenitori servlet che possono funzionare con il supporto JAX-RS NIO.Il problema è che anche se NIO è supportato, sarà comunque un singolo thread per richiesta. Solo Play, Finagle, Vert.x e pure Netty (indipendentemente da NIO) supportano un modello di threading condiviso diverso e quindi hanno meccanismi diversi per fare concorrenza.

+0

Non ho ottenuto esattamente ciò che si desidera dire da "client REST corretto". Puoi per favore mettere più luce su di esso. Grazie per la tua risposta. –

+1

Ho modificato la risposta con un collegamento. Quello che intendo è supportare le connessioni persistenti o utilizzare un protocollo diverso del tutto. Un grande impulso per Node.js e l'intero ciclo di eventi non bloccanti/single thread è dovuto al fatto che le connessioni persistenti stanno diventando un luogo più comune (Websockets, Comet, ecc.). Quasi tutti i tradizionali servizi REST di Java avranno problemi per un'API REST in streaming di circa 10.000 richieste di lunga durata indipendentemente da NIO a causa del thread/richiesta. Detto questo, la maggior parte dei client REST eseguirà GET/POST/DELETE/PUT come richiesta, quindi chiuderà immediatamente la connessione. –

3

Hai dato un'occhiata a Play?

Sembra che tu sia propenso a utilizzare Netty ma se sei disposto a dare un'occhiata a una semplice installazione di Grizzly + Jersey probabilmente si comporterà abbastanza bene. Diamine, una semplice applicazione JAX-RS Glassfish 4.0 potrebbe funzionare bene.

0

È possibile dare un'occhiata a AsyncRestTemplate in Spring Framework 4.2.5.RELEASE. Può essere usato su Netty.

Nota: per impostazione predefinita, AsyncRestTemplate fa affidamento su strutture JDK standard per stabilire connessioni HTTP. È possibile passare a utilizzare una libreria HTTP diversa come Apache HttpComponents, Netty e OkHttp utilizzando un costruttore che accetta un AsyncClientHttpRequestFactory.

0

C'è un quadro di riferimento più che utilizza Netty e RxJava, si chiama datamill

Se siete interessati a costruire applicazioni web utilizzando uno stile funzionale, reattiva, allora dovrebbe prendere in considerazione.

0

Spring 5 viene fornito con un framework Web reattivo denominato WebFlux. Puoi scegliere tra più server come Netty o Undertow. A Spring è stato aggiunto anche un WebClient reattivo e non bloccante che ha anche il supporto per reattivi Mongo, Redis e Cassandra (credo che arriverà presto).

Spring Boot, la "vista supponente di Spring", avrà anche una nuova versione (2.0) basata su Spring 5. Al momento della stesura è expected che verrà rilasciato a febbraio.

Maggiori informazioni sul pila reattiva della Primavera: https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html

Problemi correlati