Skip to content

Latest commit

 

History

History
24 lines (17 loc) · 1.54 KB

35_Bulk_format.asciidoc

File metadata and controls

24 lines (17 loc) · 1.54 KB

为什么是有趣的格式?

当我们早些时候在[bulk]章节了解批量请求时,您可能会问自己, "为什么 bulk API 需要有换行符的有趣格式,而不是发送包装在 JSON 数组中的请求,例如 mget API?" 。

为了回答这一点,我们需要解释一点背景:在批量请求中引用的每个文档可能属于不同的主分片, 每个文档可能被分配给集群中的任何节点。这意味着批量请求 bulk 中的每个 操作 都需要被转发到正确节点上的正确分片。

如果单个请求被包装在 JSON 数组中,那就意味着我们需要执行以下操作:

  • 将 JSON 解析为数组(包括文档数据,可以非常大)

  • 查看每个请求以确定应该去哪个分片

  • 为每个分片创建一个请求数组

  • 将这些数组序列化为内部传输格式

  • 将请求发送到每个分片

这是可行的,但需要大量的 RAM 来存储原本相同的数据的副本,并将创建更多的数据结构,Java虚拟机(JVM)将不得不花费时间进行垃圾回收。

相反,Elasticsearch可以直接读取被网络缓冲区接收的原始数据。 它使用换行符字符来识别和解析小的 action/metadata 行来决定哪个分片应该处理每个请求。

这些原始请求会被直接转发到正确的分片。没有冗余的数据复制,没有浪费的数据结构。整个请求尽可能在最小的内存中处理。