Domanda

Stiamo esaminando soluzioni di trasporto / protocollo e stavamo per fare vari test delle prestazioni, quindi ho pensato di verificare con la community se lo hanno già fatto:

Qualcuno ha eseguito test delle prestazioni del server per servizi echo semplici nonché serializzazione / deserializzazione per varie dimensioni di messaggi confrontando buffer EJB3, parsimonia e protocollo su Linux?

Principalmente le lingue saranno Java, C / C ++, Python e PHP.

Aggiornamento: sono ancora molto interessato a questo, se qualcuno ha fatto ulteriori benchmark per favore fatemelo sapere. Inoltre, un benchmark molto interessante che mostra JSON compresso con prestazioni simili / migliori dei buffer di parsimonia / protocollo , quindi I sto gettando JSON anche in questa domanda.

È stato utile?

Soluzione

Ultimo confronto disponibile qui nel thrift-protobuf-compare wiki del progetto. Include molte altre librerie di serializzazione.

Altri suggerimenti

Sto scrivendo del codice in un progetto open source chiamato thrift -protobuf-compare confronto tra protobuf e parsimonia. Per ora copre alcuni aspetti della serializzazione, ma ho intenzione di coprirne di più. I risultati (per Thrift e Protobuf ) sono discussi nel mio blog, ne aggiungerò altri quando arriverò. Puoi guardare il codice per confrontare API, linguaggio di descrizione e codice generato. Sarò felice di avere contributi per ottenere un confronto più arrotondato.

Potresti essere interessato a questa domanda: " Le maggiori differenze tra Thrift vs Protocol Buffers? & Quot;

Ho testato le prestazioni del PB con un numero di altri formati di dati (xml, json, serializzazione predefinita degli oggetti, hessian, uno proprietario) e librerie (jaxb, infoset veloce, scritti a mano) per l'attività di associazione dei dati (sia lettura che lettura scrittura), ma i formati dell'usato non sono stati inclusi. Le prestazioni per i formati con più convertitori (come xml) avevano una varianza molto elevata, da molto lenta a piuttosto dannatamente veloce. La correlazione tra affermazioni degli autori e performance percepita era piuttosto debole. Soprattutto per i pacchetti che hanno fatto affermazioni più sfrenate.

Per quello che vale, ho scoperto che le prestazioni di PB erano un po 'troppo esaltate (di solito non dai suoi autori, ma da altri che sanno solo chi l'ha scritto). Con le impostazioni predefinite non ha battuto l'alternativa XML testuale più veloce. Con la modalità ottimizzata (perché questo non è predefinito?), Era un po 'più veloce, paragonabile al pacchetto JSON più veloce. Assia era piuttosto veloce, anche json testuale. Il formato binario properietario (nessun nome qui, era interno all'azienda) era il più lento. La serializzazione degli oggetti Java è stata rapida per i messaggi più grandi, meno per i piccoli oggetti (vale a dire noverhead fisso per operazione elevato elevato). Con la dimensione del messaggio PB era compatta, ma dati tutti i compromessi che devi fare (i dati non sono auto-descrittivi: se perdi lo schema, perdi i dati; ci sono ovviamente indici e tipi di valore, ma da quello che hai retroingegnerizzazione dei nomi dei campi se lo si desidera), personalmente lo sceglierei solo per casi d'uso specifici - sistema sensibile alle dimensioni, strettamente accoppiato in cui l'interfaccia / formato non cambia mai (o molto raramente).

La mia opinione in questo senso è che (a) l'implementazione spesso conta più delle specifiche (del formato dei dati), (b) end-to-end, le differenze tra le migliori (per formati diversi) di solito non sono abbastanza grandi per dettare la scelta. Cioè, potresti stare meglio scegliendo il formato + API / lib / framework che ti piace usare di più (o ha il miglior supporto per gli strumenti), trovare la migliore implementazione e vedere se funziona abbastanza velocemente. Se (e solo se!) No, considera la prossima migliore alternativa.

ps. Non sono sicuro di cosa sarebbe EJB3 qui. Forse semplicemente una serializzazione Java?

Una delle cose vicino alla parte superiore del mio " to-do " L'elenco per i PB è il porting del benchmark delle prestazioni del buffer di protocollo interno di Google: si tratta principalmente di prendere formati di messaggi confidenziali e trasformarli in insignificanti, quindi fare lo stesso per i dati.

Al termine, immagino che potresti creare gli stessi messaggi in Thrift e quindi confrontare le prestazioni.

In altre parole, non ho ancora i dati per te, ma spero nelle prossime due settimane ...

Se il target è rappresentato da prestazioni nette non elaborate, nulla è meglio di IIOP (consultare RMI / IIOP). Ingombro minimo possibile: solo dati binari, nessun markup. Anche la serializzazione / deserializzazione è molto veloce.

Dato che è IIOP (ovvero CORBA), quasi tutte le lingue hanno associazioni.

Ma presumo che la prestazione non sia il unico requisito, giusto?

Per sostenere il punto di Vladimir sullo IIOP, ecco un interessante test delle prestazioni, che dovrebbe fornire alcune informazioni aggiuntive sui benchmark di Google, dal momento che confronta Thrift e CORBA. (Performance_TIDorb_vs_Thrift_morfeo.pdf // link non più valido) Per citare dallo studio:

  
      
  • La parsimonia è molto efficiente con i piccoli   dati (tipi di base come operazione   argomenti)
  •   
  • I trasporti di Thrifts non sono così efficienti come CORBA con medium e   dati di grandi dimensioni (struct e > complex   tipi > 1 kilobyte).
  •   

Un'altra strana limitazione, che non ha a che fare con le prestazioni, è che Thrift si limita a restituire solo diversi valori come struttura - anche se questo, come le prestazioni, può sicuramente essere migliorato.

È interessante che l'IDL dell'usato corrisponda strettamente all'IDL del CORBA, bello. Non ho usato Thrift, sembra interessante soprattutto per i messaggi più piccoli, e uno degli obiettivi di progettazione era per un'installazione meno ingombrante, quindi questi sono altri vantaggi di Thrift. Detto questo, CORBA ha un brutto rap, ci sono molte eccellenti implementazioni come omniORB , ad esempio, che ha associazioni per Python, che sono facili da installare e utilizzare.

Modificato: il link Thrift e CORBA non è più valido, ma ho trovato un altro documento utile del CERN. Hanno valutato le sostituzioni per il loro sistema CORBA e, mentre valutato Thrift , alla fine sono andati con ZeroMQ. Sebbene Thrift abbia eseguito il più veloce nei test delle prestazioni, a 9000 msg / sec rispetto a 8000 (ZeroMQ) e 7000+ RDA (basato su CORBA), hanno scelto di non testare ulteriormente Thrift a causa di altri problemi, in particolare:

  

È ancora un prodotto immaturo con un'implementazione errata

Ho fatto uno studio per l'integrazione di Spring-Boot, mapper (manuale, Dozer e MapStruct), Thrift, REST, SOAP e Protocol Buffers per il mio lavoro.

Il lato server: https://github.com/vlachenal/webservices-bench

Il lato client: https://github.com/vlachenal/webservices-bench-client

Non è finito ed è stato eseguito sui miei personal computer (devo richiedere i server per completare i test) ... ma i risultati possono essere consultati su:

Come conclusione:

  • Il risparmio offre le migliori prestazioni ed è facile da usare
  • Il servizio web RESTful con tipo di contenuto JSON è abbastanza vicino alle prestazioni dell'usato, è "browser pronto per l'uso" ed è piuttosto elegante (dal mio punto di vista)
  • SOAP ha prestazioni molto scarse ma offre il miglior controllo dei dati
  • I buffer di protocollo hanno buone prestazioni ... fino a 3 chiamate simultanee ... e non so perché. È molto difficile da usare: mi arrendo (per ora) per farlo funzionare con MapStruct e non provo con Dozer.

I progetti possono essere completati tramite richieste pull (per correzioni o altri risultati).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top