当我们早些时候在[bulk]章节了解批量请求时,您可能会问自己,
"为什么 bulk
API 需要有换行符的有趣格式,而不是发送包装在 JSON 数组中的请求,例如 mget
API?" 。
为了回答这一点,我们需要解释一点背景:在批量请求中引用的每个文档可能属于不同的主分片,
每个文档可能被分配给集群中的任何节点。这意味着批量请求 bulk
中的每个 操作 都需要被转发到正确节点上的正确分片。
如果单个请求被包装在 JSON 数组中,那就意味着我们需要执行以下操作:
-
将 JSON 解析为数组(包括文档数据,可以非常大)
-
查看每个请求以确定应该去哪个分片
-
为每个分片创建一个请求数组
-
将这些数组序列化为内部传输格式
-
将请求发送到每个分片
这是可行的,但需要大量的 RAM 来存储原本相同的数据的副本,并将创建更多的数据结构,Java虚拟机(JVM)将不得不花费时间进行垃圾回收。
相反,Elasticsearch可以直接读取被网络缓冲区接收的原始数据。 它使用换行符字符来识别和解析小的 action/metadata 行来决定哪个分片应该处理每个请求。
这些原始请求会被直接转发到正确的分片。没有冗余的数据复制,没有浪费的数据结构。整个请求尽可能在最小的内存中处理。