json和xml的传输速度
您的系统具有多个组件,它们必须进行通信。 他们通过内部Web服务或使用消息队列来做到这一点。 通常,您希望将对象从一个组件发送(数据传输)到另一个组件。 三个典型的例子:
- 用户已注册,并且您将消息发送到消息队列,并且每当使用该消息时,都会向该用户发送电子邮件。 该消息至少需要用户使用该用户的电子邮件和姓名。
- 如果您的层由于某种原因(而不是驻留在一个JVM中)通过Web服务进行通信,则在注册时,Web层需要调用后端服务并传递User对象。
- 您可以将对象存储在某个(分布式)内存缓存中,以减少对数据库的冗余调用(假设您以某种方式将数据库结果映射到对象,无论是ORM还是某些映射器,但这在大多数情况下都是如此)。 因此,当一个请求到达要求用户配置文件时,您要检查它是否存在于高速缓存中,以及是否存在–从那里获取它,而不是访问数据库。
为了实现这些目的,您需要将对象序列化为某种格式,然后在另一端反序列化。 许多框架都包含XML和JSON序列化器,并且在许多在线示例中都使用了它们。 因此,人们倾向于将JSON或XML用于这些目的。 那不是一个好主意。 在内部使用这些格式没有好处-实际上,您不需要序列化的对象是人类可读的,并且,如果您需要读取消息的内容,则可以对它进行反序列化并将其打印到日志文件中。
但是存在主要缺点–速度和大小。 两种格式都是基于文本的(以便它们可以被人类阅读),这意味着它们不必要地冗长。 是的,JSON不像XML那样冗长,但是它仍然是不需要的文本格式。 相反,在大多数情况下,您最好使用二进制序列化。 几乎任何二进制序列化都更好。 我已经评估了几个,并且易用性+速度和大小上的优势使我选择了MessagePack 。 但是您也可以使用protobuf , bson , avro或任何适合您的项目的东西。
是的,我知道,我也说过“这可能是微观优化”。 然后,我对消息进行了一些基准测试,以查看节省的时间和大小。 我不记得确切的数字,但是MessagePack更快,消息大小更小,看到结果使我直接编写一个MessagePackConverter
来代替JSONConverter
。 对于它对整个系统的巨大影响而言,这是一个很小的变化。 考虑到我们的系统需要序列化和反序列化的大量消息,花一天的时间集成MessagePack是完全值得的-毕竟,使用相同的硬件,您可以处理或存储(说)两倍的消息(相比JSON)。
当然,需要考虑一些事项,例如对象的版本控制(如果添加字段,则旧消息的反序列化会中断吗?在messagePack中,如果字段是原始字段,它也会这样做,因此您需要一个自定义模板来处理),或者您处于多语言环境中-是所有语言都支持的反序列化库。 另外,通常必须事先让序列化程序知道对象的结构,因此这里有一些附加的代码/注释来填充序列化程序上下文。 但是所有这些都包含在上述我用于集成MessagePack的“一天”中。
最好提一下,如果您要向第三方公开API,则不能依赖这些序列化程序-您的API应该是JSON / XML,因为它必须是人类可读的,并且需要支持每种语言。
但是除非您完全不关心资源(可能是因为它使用的系统很少),否则请认真考虑内部消息传递,API,缓存等的二进制序列化机制。
参考: Bozho的技术博客博客中的JCG合作伙伴 Bozhidar Bozhanov 请勿使用JSON和XML作为内部传输格式 。
翻译自: https://www.javacodegeeks.com/2012/11/dont-use-json-and-xml-as-internal-transfer-formats-http.html
json和xml的传输速度