[Zombodb那些事]Zombodb与ElasticSearch的Bulk通信

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与数据库中的数据能够保持一致?

为了回答这些问题,便有了这篇文章。

15cdda097a8ae4c8f9ce935875a47d86.png

bdf1598d366303fedd96abbd78ea84e4.png

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 {...}
   ...
}

15d45a0402d221960f620324a1c2c680.png

ES Bulk请求实现机制为委托设计模式,通过使用内部的handler处理器实现,而ES Bulk结构体本身是对外提供接口,例如:插入/更新/删除等操作。

308e6766f508f80342f503f2b91fc338.png

b8751f5f3a17009a86afbcd20824b8e5.png

ES Bulk本身内容详细的来说:

  • 处理器

    • 是ES Bulk请求的处理器,在内部会创建发送端与接收端通道,ES Bulk请求结构体会把前面准备好的Bulk请求命令通过发送端通道发出去,同时创建多个线程,每个线程会通过接收端通道从通道中循环读取每一个Bulk请求命令<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值