总览

有许多流行的基于文本的协议可用于通过网络交换数据。 这些包括XML,FIX和JSON。 编年史引擎使用YAML具有一些优点和缺点。

文字不是比二进制慢吗?

文本协议比二进制协议慢。 编码数字甚至是unicode字符串的成本都会增加CPU的开销。

尽管文本速度较慢,但​​它比二进制文件具有一个主要优势,那就是人类可读性强。 这使得在不使用框架的情况下更容易描述协议并为接口实现解决方案。

尽管二进制文件比文本文件快,但您可能会发现文本足够快,在这种情况下,您希望使用的格式尽可能容易使用。

下面列出了序列化和反序列化具有6个不同类型字段的对象的延迟。 TextWire是YAML格式,BinaryWire是二进制格式,RawWire和SBE是其他二进制格式。

有关更多详细信息,请参阅编年史线/微基准

所有时间都以微秒为单位:

连线格式
字节数
99.9%瓷砖
99.99%瓷砖
99.999%瓷砖
YAML(TextWire)
91
2.81
4.94
8.62
YAML(TextWire)
91
2.59
4.70
8.58
JSONWire
100
3.11
5.56
10.62
BinaryWire文本字段
70
1.57
3.42
7.14
BinaryWire编号字段
44
0.67
2.44
5.93
BinaryWire场少
32
0.65
2.42
5.53
RawWire UTF-8
43
0.49
2.07
4.87
RawWire 8位
43
0.40
0.57
2.90
字节数可编组
39
0.17
0.21
2.13
字节可编组+停止位编码
28
0.21
0.25
2.40

通常在这些高百分位数中,常见的Java库通常由于GC暂停而显示出更高的结果。 即使在中等吞吐量下,此延迟抖动也开始变得很重要,例如,如果您每秒处理10,000条消息,则随后的抖动将延迟14-15条消息,而不仅仅是一条消息。

格式 大小(以字节为单位) 99.99%的延迟
杰克逊 100 8.3微秒
BSON + C字节 96 15.1微秒
蛇YAML 88 4,067微秒
Boon JSON 99 32.5微秒
可外部化 197 29.3微秒

“ + C字节”是指与历史字节一起使用以回收缓冲区。

杰克逊有99.99%的好结果,而99.999%是1,405μS。

这些格式是什么样的?

TextWire

此格式具有4字节大小的前缀,该前缀在第一行中解码:

--- !!data
price: 1234
flag: true
text: Hello World!
side: Sell
smallInt: 123
longInt: 1234567890

BinaryWire与文本字段

这是自动转换为文本时数据的外观。

--- !!data #binary
price: 1234
flag: true
text: Hello World!
side: Sell
smallInt: 123
longInt: 1234567890

BinaryWire与数字字段

这是自动转换为文本时数据的外观。

--- !!data #binary
3: 1234
4: true
5: Hello World!
6: Sell
1: 123
2: 1234567890

没有元数据的RawWire

00000000 27 00 00 00 00 00 00 00  00 48 93 40 B1 0C 48 65 '······· ·H·@··He
00000010 6C 6C 6F 20 57 6F 72 6C  64 21 04 53 65 6C 6C 7B llo Worl d!·Sell{
00000020 00 00 00 D2 02 96 49 00  00 00 00                ······I· ···

可通过停止位编码进行编组

00000000 18 00 00 00 A0 A4 69 D2  85 D8 CC 04 7B 59 00 0C ······i· ····{Y··
00000010 48 65 6C 6C 6F 20 57 6F  72 6C 64 21             Hello Wo rld!

简单的二进制编码

00000000 29 00 7B 00 00 00 D2 02  96 49 00 00 00 00 00 00 )·{····· ·I······
00000010 00 00 00 48 93 40 01 0C  48 65 6C 6C 6F 20 57 6F ···H·@·· Hello Wo
00000020 72 6C 64 21 00 00 00 00  01 00 00                rld!···· ···
  • 为获得完整的结果和不同的导线格式

可读

XML和JSON是派生的文本格式。 它们是SGML和Javascript的简化形式。 这意味着它可以被人类阅读,但并非为此目的而设计。 就像我们将看到的那样,不专门为人类可读性而设计具有一些优点。

YAML:一种用于人类可读的格式。

正如我们所看到的,YAML的优点是它是专门为人类可读性而设计的。 这意味着它不那么冗长,并且具有更多的构造。

主要缺点是它是为人类可读性(而不是机器可读性)而设计的。尽管编写程序来以一种有品味的方式排列数据要困难得多,但它丰富的构造集意味着您可以按喜好排列数据。

一个相关的缺点是,由于存在更多的支持选项,其中一些选项留待解释,因此不同的实现可能彼此不兼容。 例如, 如果需要 ,应将符号放在引号中并且不同的库对于是否需要使用此类符号有不同的想法。 在规范中,有一些示例,其中带引号的字符串未用双引号引起来。 也有两个引号,单引号和双引号。

那么为什么要使用YAML?

YAML的优势在于,它至少是为人类阅读而设计的。 它不是最快的格式,尽管它可以足够快,并且是一种易于阅读的格式。 如果将其与XML,JSON或FIX进行比较,则它们不是为提高速度而设计的,也不是特别可读。

协议文件

使用YAML可以轻松记录需要通过网络发送的内容。 我们具有针对不同功能的单元测试,在其中记录以文本形式发送和接收的内容。 我们围绕这些消息添加一些元数据,并具有可以直接包含在我们的文档中的输出。 这意味着我们有信心这是正确的。

作为文本,我们可以包括何时期望消息看起来像,并检测何时即使是很小的更改也很容易改变了消息内容。 这就像检查字符串匹配一样简单。 然后,IDE可以为您显示多行比较,以便您可以看到已更改的确切字段。

对于YAML缓慢,我们该怎么办?

我们使用高级API 编年史电线 ,您可以根据自己的喜好选择确切的电线格式。 这意味着一旦我们检查了文本协议是否有效,便可以切换到使用二进制协议。 我们使用YAML的二进制翻译,但是我们也可以使用RAW数据格式,该格式会剥离所有元数据以实现最大速度。

我们还提供了将“二进制YAML”自动转换为YAML的工具,以进行日志记录和调试。

结论

能够使用YAML进行测试和开发是开发新解决方案的有效方法,并且可以选择切换到Binary形式以提高速度是将可读性和速度结合在一起的好方法。

翻译自: https://www.javacodegeeks.com/2015/08/using-yaml-over-the-network.html

通过网络使用YAML相关推荐

  1. [深度学习]如何替换YoloV5的主干网络:Flexible-Yolov5

    Flexible-Yolov5:可自定义主干网络的YoloV5工程实践 本文目录: 概述 理论学习与环境配置 准备自己的数据集 修改或调整自定义的主干网络 部署训练 一.概述 YoloV5的主干网络是 ...

  2. 【云原生-K8s】kubeadm搭建安装k8s集群v1.25版本完整教程【docker、网络插件calico、中间层cri-docker】

    前言 基础描述 从 k8s 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker却不支持kubernetes主推的CRI(容器运行时接口)标准,所以docker不能 ...

  3. Kubernetes(k8s)集群部署七、k8s网络通信+service扩展ingress(TLS,认证,地址重写)calico网络插件(允许指定pod访问服务,禁止其他namespace访问服务)

    k8s网络通信 k8s网络通信 1.容器间通信 2.pod之间的通信 2.1同一节点的pod 2.2不同节点的pod之间的通信 flannel网络原理 flannel支持多种后端: 3.pod和ser ...

  4. Cannot start service test1: b'endpoint with name test1 already exists in network ... docker 网络被占用

    docker网络基本知识 默认网络 # 查看网络 docker network ls bridge.none.host这 3 个网络包含在 Docker 实现中.运行一个容器时,可以使用 the –n ...

  5. 网络策略控制集群内部通信-networkpolicy

    networkpolicy应用场景 默认情况下,Kubernetes集群网络没任何网络限制,Pod可以与任何其他pod通信,在某些场景下就需要进行网络控制,减少网络攻击面,提高安全性,这就会用到网络策 ...

  6. trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

    一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...

  7. k8s kubeadm 安装

    kubernetes 是什么 kubernetes 是 google 在2014 年开源的一个容器集群管理系统 kuberetes 简述 k8s k8s 用于容器化应用程序的部署 扩展和管理 k8s ...

  8. 部署k8s集群(k8s集群搭建详细实践版)

    1.部署k8s的两种方式: 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部 ...

  9. k8s二进制部署 1.17.3

    K8s简介 Kubernetes(简称k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容 ...

  10. k8s 1.17.3 二进制部署

    K8s简介 Kubernetes(简称k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容 ...

最新文章

  1. 小程序点击图片自动播放视频,停止上一个视频播放
  2. tenflow数据集_计算机视常用的数据集 Data sets
  3. java抓新闻_【图片】【抓取】Java获取各大网站新闻【java吧】_百度贴吧
  4. Visual Tracking:运行ECO模型
  5. 8.2.2继承 第8章 面向对象编程简介
  6. 跟着官方文档能学懂React Hooks就怪了
  7. 【学校作业】学生数据打印
  8. matlab cuda的.cu文件应该放在那里_无人机基于Matlab/Simulink的模型开发(连载一)
  9. Docker : Docker安装Kibana
  10. dotween路径移动_使用DOTween Pro插件设置物体移动的位置、移动的方式、以及动画结束时执行方法...
  11. 处理 Archlinux 报错
  12. 博弈论基础知识--非合作博弈,零和博弈,负和博弈,主从博弈,Nash均衡
  13. bug解决 2021-09-25 Unity人物动画无法正常播放的问题
  14. v$active_session_history的wait_time和time_waited 列
  15. 码农翻身全年文章精华
  16. 智能照明控制系统 在医院中的设计和应用
  17. 《蜘蛛侠3》5月2日中国提前上映
  18. python递归算法解决兔子繁殖问题_经典生兔子问题——递归方法
  19. linux删除账号及主目录及邮箱,Linux 用户管理
  20. 2017-滴滴出行-安全岗笔试

热门文章

  1. vue3如何去掉控制台的warn信息
  2. 内存卡格式化的原因有哪些 内存卡格式化怎么恢复
  3. 一分钟先生:怎样给员工发奖金
  4. 抖音自拍特效如何java实现_抖音特效在 Web 端的实现
  5. 强哥日常高效工作流骨灰级玩家培训课程
  6. 编程实现误差逆传播算法(BP算法)
  7. Windows server 2008 R2 企业版、标准版、数据中心版哪个适合
  8. 因子分析法之因子旋转
  9. idea 商业版 社区版_idea社区版和商业版的区别
  10. 华为外包测试2年,不甘被替换,168天的学习转岗成正式员工