Buffers de Protocolo ZeroMQ +


ZeroMQ FAQ página sugiere el uso de Google protobuf 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 que puedo vivir sin y tomar la ventaja de la tubería más delgada.

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

También, parece que otra gran herramienta para lanzar a la patio de recreo sería libev, cualquier los comentarios son bienvenidos:)

Author: errordeveloper, 2011-09-12

4 answers

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 del otro (por ejemplo, porque siempre se distribuyen juntos y todos fueron compilados con las mismas opciones de compilador de todos modos) No veo ningún beneficio en la sobrecarga que se agrega por serialización.

Tan pronto como la condición anterior no se puede cumplir (como programas asociados que se ejecutan en diferentes tipos de host, programas escritos en diferentes idiomas o incluso los programas asociados que pueden evolucionar independientemente en el tiempo, lo que puede causar incompatibilidades en sus estructuras binarias sin procesar) la serialización se convierte muy probablemente en una necesidad.

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 (!!) diferente serialización sistema. No te saltes 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 las opciones que desea estudiar en detalle.

 20
Author: fvu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-12 16:14:31

Aquí hay un ejemplo 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);

Des-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());
 14
Author: Chand Priyankara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-19 15:27:32

No estoy seguro de que PUB/SUB en 0mq funcione con protobuf, porque 0mq espera un tema de cadena a la cabeza del msg.. pero protobuf pone un descriptor de campo primero.

En realidad aquí hay un enlace con una solución.

Http://www.dotkam.com/2011/09/09/zeromq-and-google-protocol-buffers /

Salud

 4
Author: jaybny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-02 00:00:41

Siempre necesita serializar cuando se comunica. Las estructuras son de acceso aleatorio. Las capas de comunicación, como ZeroMQ, son en serie.

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

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

Siempre y cuando limítese a estructuras que no tienen punteros y están usando el mismo compilador y lenguaje en ambos extremos de la tubería... no dude en evitar una biblioteca que haga serialización adicional sobre el diseño predeterminado proporcionado.

 1
Author: Erik Aronesty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-09 13:29:47