Zombodb与ElasticSearch的Bulk通信
0.前言
Zombodb是一个PostgreSQL插件,使用rust编写,支持pg14以下版本。Zombodb可以允许PostgreSQL查询ElasticSearch中的内容。本篇为《Zombodb那些事》第一篇,后面将更新其他部分内容。
Zombodb会在pg数据库上创建Zombodb索引,当插入/删除/更新数据时在pg上执行的时候到底经历了什么过程呢?
例如:往foo表中插入一条记录,zombodb与es之间的通信是什么?
insert into foo (id) values (1);
再比如:更新foo表中的一条记录,zombodb与es之间的通信是什么?
update foo set id = id where id = 1;
同理,删除又做了什么呢?
当插入的数据比较大的时候,Zombodb是如何防止OOM?如何保证高性能的请求?又如何保证在用户取消执行SQL时,ES与数据库中的数据能够保持一致?
为了回答这些问题,便有了这篇文章。
1.Bulk实现概要
在Zombodb中,bulk.rs实现了往ES发送Bulk请求,并处理应答。
Bulk内核层面,有三个结构体、一个枚举。
BulkRequestCommand Bulk请求命令枚举类型
ElasticsearchBulkRequest ES Bulk请求结构体
Handler 处理器结构体
BulkReceiver Bulk请求命令序列化Buffer结构体
首先来看Bulk请求命令:
// 伪代码
pub enum BulkRequestCommand<'a> {
Insert {ctid: u64, ...}
Update {...}
...
}
ES Bulk请求实现机制为委托设计模式,通过使用内部的handler处理器实现,而ES Bulk结构体本身是对外提供接口,例如:插入/更新/删除等操作。
ES Bulk本身内容详细的来说:
处理器
是ES Bulk请求的处理器,在内部会创建发送端与接收端通道,
ES Bulk请求结构体
会把前面准备好的Bulk请求命令
通过发送端通道发出去,同时创建多个线程,每个线程会通过接收端通道
从通道中循环读取每一个Bulk请求命令<