2009-09-15 7 views
34

Przebudowuję starszą wersję systemu C++ do architektury SOA przy użyciu gSoap. Mamy pewne problemy z wydajnością (bardzo duże XML-y), więc mój potencjalny klient poprosił mnie o sprawdzenie buforów protokołu. Zrobiłem to i wygląda bardzo fajnie (potrzebujemy wsparcia w językach C++ i Java). Jednak bufory protokołów są rozwiązaniem tylko do serializacji i teraz muszę wysłać je do front-end Java. Czego powinienem używać z perspektywy C++ i Java, aby wysyłać te serializowane rzeczy przez HTTP (tylko sieć wewnętrzna)?Bufory protokołów Google i HTTP

PS. Inny facet próbuje przyspieszyć nasze rozwiązanie gSoap, interesują mnie tylko bufory protokołów.

+0

FYI. wydajność została omówiona z zespołem gsoap (uczestniczę w tym) i zalecamy użycie flagi 'SOAP_XML_TREE' lub skompilowanie z' -DWITH_NOIDREF'. Bez tej flagi wydajność może być znacznie niższa ze względu na kodowanie SOAP z elementami wielokrotnego ref (id-ref) w celu serializowania wykresów (tj. Wykrywanie obiektów współzależnych, analizowanie cyklicznych struktur danych itp.). Proponowana flaga wyłącza tę funkcję, aby serializować XML jako drzewa. Szybkość przesyłania wiadomości znacznie się poprawiła. Jedynym wąskim gardłem wydajności jest opóźnienie sieci i przepustowość. –

+0

@Alex SOAP jest ciągle aktualizowany? To naprawdę imponujące! To pytanie ma 7 lat, więc nie będziesz tego robić :) – Nazgob

+0

Z tego, czego się dowiedziałem, wszyscy przeczytali FAQ (od 2005) z tą rekomendacją. Co sprawia, że ​​wierzysz, że to najnowszy rozwój? –

Odpowiedz

53

Możesz wysyłać nawet ładunek binarny za pomocą żądania HTTP lub w odpowiedzi HTTP. Wystarczy napisać bajty bufora protokołu bezpośrednio do żądania/odpowiedzi i upewnić się, że typ zawartości ustawiony jest na "application/octet-stream". Klient i serwer powinni łatwo załatwić resztę. Nie sądzę, że potrzebujesz czegoś bardziej wyjątkowego niż na każdym końcu.

+30

Używamy 'application/x-protobuf' jak opisano na slajdzie 21 tutaj: http://www.slideshare.net/mokeefe/javaone-2009-ts5276-restful-protocol-buffers –

+0

Ah jeszcze lepiej. Nie wiedziałem, że ktoś sugerował dla niego typ MIME. –

+5

Typy MIME o nazwie rozpoczynającej się od "x-" nie są nawet w pobliżu standardu i zwykle traktowane są jako strumień aplikacji/oktetu. – n0rd

2

Według mojej wiedzy obsługa buforów protokołów jest dostępna zarówno w językach C++, jak i Java, powinieneś być w stanie wymieniać serializowane dane protokołowane między obydwoma systemami.

Mimo to, wydaje się, twoje prawdziwe pytanie brzmi: „Jak mogę wysyłać rzeczy przez HTTP pomiędzy C++ backend i klienta Java”

To brzmi jak trzeba nauczyć się korzystać gSOAP przeczytać docs.

Ewentualnie można zorganizować relaksującego serwer z C app ++: Spójrz na to: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

Następnie trzeba by uzyskać dostęp do danych przechowywanych na serwerze relaksującego Twojego nowego Forda C++: Spójrz na to: Rest clients for Java?

+2

gSOAP znacznie komplikuje problem. Protobuf działa dobrze przez HTTP w ich natywnym formacie binarnym. – Will

+0

Zbyt skomplikowane? Oczywiście, jeśli chcesz przenieść zawartość binarną, po prostu użyj Protobufs i REST. Ale dla XML znacznie ułatwiło nam to zadanie. Skomplikowane części WSDL, SOAP i XML są zajęte. Ponadto otrzymaliśmy ponad 5000 wywołań usług na sekundę z gsoap. Głównym obciążeniem jest TCP/IP, a nie stos gsoap. –

5

Można serializować/dekompilować dane zakodowane protobuf do/od ciągów. Wysyła serializowany ciąg znaków jako treść instrukcji POST protokołu HTTP do języka Java i rozszyfrowuje go. To jest jedno podejście. Innym sposobem jest skorzystanie z interfejsu usługi Protobuf. Protobuf umożliwia zdefiniowanie interfejsu usługi w pliku .proto, a kompilator bufora protokołu wygeneruje kod interfejsu usługi i kody pośredniczące w wybranym języku. Aby uzyskać pełną strukturę RPC, wystarczy zaimplementować klasy protobuf :: RpcChannel i protobuf :: RpcController. Prawdopodobnie możesz napisać opakowanie HTTP dla tych klas. Zobacz poniższe linki, aby uzyskać więcej informacji:

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 jest protokół binarny. Nie miesza się dobrze z SOAP. Sugeruję, abyś trzymał się z gSOAP lub całkowicie przekształcił protoBuf.

Z Protobuf definiuje swój protokół w specjalnym formacie jak ta,

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

Narzędzie protoc można wygenerować kod w C++/Java/Python, dzięki czemu można szeregować je na jednym końcu i deserializowania na innym.

Jak widać, ProtoBuf został zaprojektowany do serializacji pojedynczego obiektu. Nie zapewnia wszystkich udogodnień dostarczanych przez SOAP, takich jak nagłówki. Aby obejść ten problem, używamy ProtoBuf wewnątrz ProtoBuf. Definiujemy koperty tak,

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; 
} 

The encodedMessage jest kolejnym odcinkach Protobuf wiadomość.Wszystkie rzeczy w nagłówku SOAP trafiają teraz do headers.

4

Google frontends woli application/protobuf.

Użytkownik klienta Google API ProtocolBufferModel używa application/x-protobuf.