zmq socket protocols network-protocols zeromq

protocols - socket - ZeroMQ+Protocol Buffers



zmq rep (4)

Aquí hay una muestra que envía y recibe mensajes a través de java y en C ++:

Serialización en java:

Person person = Person.newBuilder().setName("chand") .setEmail("[email protected]").setId(55555).build(); socket.send(person.toByteArray(), 0);

De-serializar en java:

byte[] reply = socket.recv(0); Person person2 = Person.parseFrom(reply);

Serialización en C ++:

Person p = Person(); std::string str; p.SerializeToString(&str); int sz = str.length(); zmq::message_t *query = new message_t(sz); memcpy(query->data (), str.c_str(), sz); socket->send (*query);

De-serializign en C ++

zmq::message_t resultset(100); socket->recv (&resultset); Person p = Person(); p.ParseFromArray(resultset.data(), resultset.size()); printf("/n Server : %s", p.name().c_str());

La página de preguntas frecuentes de ZeroMQ sugiere el uso de protobuf de Google como una forma de serializar el contenido del mensaje.

¿Alguien ha visto un buen ejemplo de uso?

También necesito obtener la respuesta a "¿Cuál es la mayor ventaja de serializar mensajes?" - si puede ser algo sin lo que pueda vivir y aprovechar la ventaja de una tubería más delgada.

Me gusta bastante la idea de los archivos .proto y el compilador protoc .

Además, parece que otra gran herramienta para lanzar en el patio de recreo sería libev , cualquier comentario es bienvenido :)



Si está 100% seguro de que los programas que se van a comunicar a través de ZMQ en todo momento serán capaces de entender el formato binario de cada uno (por ejemplo, porque siempre se distribuyen juntos y todos se compilaron con las mismas opciones de compilador). Beneficio de la sobrecarga que se agrega por serialización.

Tan pronto como no se pueda satisfacer la condición anterior (como los programas asociados que se ejecutan en diferentes tipos de host, programas escritos en diferentes idiomas o incluso programas asociados que pueden evolucionar independientemente en el tiempo, lo que puede causar incompatibilidades en sus estructuras binarias en bruto) debe.

Parece que hoy en día todo el mundo y su hermano están creando soluciones de serialización, lo que puede ser una indicación de que no hay una solución única para todos. Esta página contiene una evaluación comparativa bastante completa del tiempo de serialización, tiempo de deserialización y tamaños para 27 (!!) diferentes sistemas de serialización. No omita el primer párrafo de esa página, dice "Advertencia, los puntos de referencia pueden ser engañosos". Su aplicación, sus datos son lo que cuenta para usted, pero los datos presentados allí pueden ayudarlo a reducir en detalle las opciones que desea estudiar.


Siempre hay que serializar cuando se comunica. Las estructuras son de acceso aleatorio. Las capas de comunicación, como ZeroMQ son seriales.

Puede utilizar la "serialización predeterminada" que viene con su idioma.

Por ejemplo, en C ++, una estructura sin punteros tendrá un diseño binario determinado que se puede convertir directamente en una matriz de bytes. Este diseño binario es, indirectamente, su capa de serialización, y es específico del compilador y del lenguaje.

Siempre que se limite a estructuras que no tengan punteros y que utilicen el mismo compilador e idioma en ambos extremos de la tubería ... siéntase libre de evitar una biblioteca que realice una serialización adicional sobre el diseño predeterminado proporcionado.