2009-09-15 18 views
34

Sto refactoring del sistema C++ legacy a SOA utilizzando gSoap. Abbiamo alcuni problemi di prestazioni (molto grandi XML), quindi il mio lead mi ha chiesto di dare un'occhiata ai buffer del protocollo. L'ho fatto e sembra molto interessante (abbiamo bisogno del supporto C++ e Java). Tuttavia i buffer di protocollo sono la soluzione solo per la serializzazione e ora ho bisogno di inviarlo al front-end Java. Cosa dovrei usare dal punto di vista C++ e Java per inviare quelle cose serializzate su HTTP (solo rete interna)?Protocollo Google Buffers e HTTP

PS. Un altro ragazzo cerca di velocizzare la nostra soluzione gSoap, sono interessato solo ai buffer di protocollo.

+0

FYI. la performance è stata discussa con il team gsoap (io partecipo a questo) e abbiamo raccomandato di usare il flag 'SOAP_XML_TREE' o di compilare' -DWITH_NOIDREF'. Senza questo flag le prestazioni possono essere molto più basse a causa della codifica SOAP con elementi multi-ref (id-ref) per serializzare i grafici (cioè rilevare oggetti co-referenziati, analizzare strutture di dati ciclici, ecc.). Il flag suggerito spegne questa funzione per serializzare XML come alberi. La velocità della messaggistica è notevolmente migliorata. L'unico collo di bottiglia alle prestazioni è la latenza di rete e la larghezza di banda. –

+0

@Alex SOAP si sta ancora aggiornando? Questo è davvero impressionante! Questa domanda ha 7 anni, quindi non agirò in questo :) – Nazgob

+0

Da quanto ho imparato, tutti gli altri hanno letto le FAQ (dal 2005) con questa raccomandazione. Cosa ti fa credere che questo sia uno sviluppo recente? –

risposta

53

È possibile inviare anche un carico utile binario con una richiesta HTTP o in una risposta HTTP. Basta scrivere i byte del buffer del protocollo direttamente nella richiesta/risposta, e assicurarsi di impostare il tipo di contenuto su "application/octet-stream". Il client e il server dovrebbero essere in grado di occuparsi facilmente degli altri. Non penso che tu abbia bisogno di qualcosa di più speciale di quello alle due estremità.

+30

Stiamo usando 'application/x-protobuf' come descritto nella diapositiva 21 qui: http://www.slideshare.net/mokeefe/javaone-2009-ts5276-restful-protocol-buffers –

+0

Ah, ancora meglio. Non sapevo che qualcuno avesse suggerito un tipo MIME per questo. –

+5

I tipi MIME che hanno un nome che inizia con "x-" non sono affatto vicini allo standard e solitamente sono trattati come application/octet-stream. – n0rd

2

A mia conoscenza il supporto per i buffer di protocollo è disponibile sia in C++ che in Java, dovresti essere in grado di scambiare i dati serializzati del buffer di protocollo tra entrambi i sistemi.

Detto questo, sembra la tua vera domanda è: "Come faccio a inviare roba su HTTP tra un backend C++ e Java client"

E suona come è necessario imparare a utilizzare gSOAP, leggere il docs.

In alternativa si potrebbe ospitare un server web RESTful dal C++ app: guarda a questo: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

Poi si avrebbe bisogno di accedere ai dati ospitati sul nuovo C++ Server RESTful: Guardate questo: Rest clients for Java?

+2

gSOAP sta massaggiando in modo massivo il problema. I protobuf funzionano bene su HTTP nel loro formato binario nativo. – Will

+0

Complicato? Certo, se vuoi trasferire contenuti binari usa solo Protobufs e REST. Ma per XML ha reso il nostro lavoro molto più semplice. Le parti complicate di WSDL, SOAP e XML sono tutte prese in considerazione. Inoltre, abbiamo ricevuto oltre 5.000 invocazioni di servizio al secondo con gsoap. L'overhead principale è con il TCP/IP, non con lo stack gsoap. –

5

È possibile serializzare/de-serializzare i dati codificati di protobuf su/da stringhe. Invia la stringa serializzata come corpo di un POST HTTP a Java e de-serializzalo. Questo è un approccio. Un altro modo è utilizzare l'interfaccia del servizio protobuf. Protobuf consente di definire un'interfaccia di servizio in un file .proto e il compilatore del buffer di protocollo genererà il codice dell'interfaccia di servizio e gli stub nella lingua scelta. È necessario solo implementare le classi protobuf :: RpcChannel e protobuf :: RpcController per ottenere un framework RPC completo. Probabilmente puoi scrivere un wrapper HTTP per queste classi. Vedere i seguenti link per ulteriori informazioni:

http://code.google.com/apis/protocolbuffers/docs/proto.html#services http://code.google.com/apis/protocolbuffers/docs/reference/cpp-generated.html#service http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.service.html

24

protobuf è un protocollo binario. Non si sposa bene con SOAP. Ti suggerisco di restare con gSOAP o convertire completamente in ProtoBuf.

Con protobuf, si definisce il protocollo in un formato speciale come questo,

message Product { 
    required string id = 1; 
    required string description = 2; 
    required int32 quantity = 3; 
    optional bool discontinued = 4; 
} 

Lo strumento protoc in grado di generare codice in C++/Java/Python in modo da poter serializzare su un'estremità e deserializzare su un altro.

Come si può vedere, ProtoBuf è progettato per serializzare singoli oggetti. Non fornisce tutte le funzionalità fornite da SOAP, come le intestazioni. Per ovviare a questo problema, utilizziamo ProtoBuf all'interno di ProtoBuf. Definiamo una busta come questo,

message Envelope { 
    enum Type { 
    SEARCH = 1; 
    SEARCH_RESPONSE = 2; 
    RETRIEVE = 3; 
    RETRIEVE_RESPONSE = 4; 
    } 
    required Type type = 1; 

    required bytes encodedMessage = 2; 

    message Header { 
    required string key = 1; 
    required bytes value = 2; 
    }  
    repeated Header headers = 3; 
} 

Il encodedMessage è un altro protobuf messaggio serializzato.Tutto il materiale presente nell'intestazione SOAP ora va a headers.

4

I frontend di Google preferiscono application/protobuf.

Il ProtocolBufferModel del client API di Google utilizza application/x-protobuf.

Problemi correlati