Mover de JSON a Protobuf. ¿Vale la pena?

23

Tenemos servicios web REST que pueden servir XML o JSON (WCF). Estoy jugando con la idea de implementar Protobufs. ¿Por qué?

PROS

  1. Menos carga en los servidores.
  2. Tamaño de mensaje más pequeño: menos tráfico.
  3. Es más fácil cambiar ahora que más tarde.

CONTRAS

  1. Necesita ser implementado
  2. Va a ser más difícil solucionar problemas / detectar mensajes para la depuración.
  3. Puedo habilitar GZip en el servidor y JSON consumirá tanto tráfico

¿Cuál es su sugerencia y / o experiencia al respecto?

katit
fuente
1
Miré la página de Wikipedia, y en realidad tenía más caracteres por par clave-valor, entonces ¿por qué dosificarlo tiene mensajes más pequeños?
Ramzi Kahil
Debido a la serialización. Los datos binarios se presentan como binarios (matrices de bytes, por ejemplo). Además, no lleva nombres de propiedad en un mensaje. Van por ordinales de propiedad. developers.google.com/protocol-buffers/docs/encoding#structure
katit
10
Técnicamente respondiste a tu propia pregunta, comprime el JSON y listo. Lo más importante es que nunca mencionas un caso de negocios real para gastar dinero y tiempo en esta actividad.

Respuestas:

39

¿El valor comercial de implementarlos excede el costo?

Si implementa, necesita cambiar no solo su servidor, sino todos los clientes (aunque puede admitir ambos formatos y solo cambiar clientes según sea necesario). Eso llevará tiempo y pruebas, lo cual es un costo directo. Y no subestime el tiempo necesario para comprender realmente las memorias intermedias de protocolo (especialmente las razones para hacer que el campo sea obligatorio u opcional), y el tiempo necesario para integrar el compilador de protobuf en su proceso de compilación.

Entonces, ¿el valor excede eso? ¿Se enfrenta a una opción de "nuestros costos de ancho de banda son X% de nuestros ingresos y no podemos soportar eso"? ¿O incluso "necesitamos gastar $ 20,000 para agregar servidores que admitan JSON"?

A menos que tenga una necesidad comercial apremiante, sus "profesionales" no son realmente profesionales, solo una optimización prematura.

parsifal
fuente
23

Mantengo apis y alguien antes que yo agregó protobuf (porque era "más rápido"). Lo único más rápido es RTT debido a la menor carga útil, y eso se puede solucionar con JSON comprimido.

La parte que me desagrada es el trabajo relativo para mantener protobuf (en comparación con JSON). Yo uso Java, así que usamos el mapeo de objetos Jackson para JSON. Agregar a una respuesta significa agregar un campo a un POJO. Pero para protobuf tengo que modificar el archivo .proto, luego actualizar la lógica de serialización y deserialización que mueve los datos dentro / fuera de los buffers de protocolo y dentro de POJOs. Sucedió más de una vez que se produjo un lanzamiento en el que alguien agregó un campo y olvidó poner el código de serialización o deserialización para los buffers de protocolo.

Ahora que los clientes se han implementado contra los buffers de protocolo, es casi imposible escapar.

Probablemente puedas adivinar a partir de esto, mi consejo es que no lo hagas.

Kevin
fuente
55
Si está escribiendo un código de (des) serialización para mover datos dentro / fuera de POJO, lo está haciendo mal. Simplemente use las clases generadas por protobuf directamente.
Marcelo Cantos
Creo que en ese caso me estaba moviendo dentro / fuera de POJO porque la base de código admitía solicitudes / respuestas JSON, XML y Protobuf, y dado que no puedo agregar anotaciones Jackson y / o JAXB a las clases generadas por protobuf, y quiero para usar los mismos objetos de modelo en todo el código, no sé si tengo opciones para usar solo las clases generadas. Puedo ver cómo esto sería posible si estuviera escribiendo, por ejemplo, servicios GRPC que solo hablan protobuf.
Kevin