65.9K
CodeProject 正在变化。 阅读更多。
Home

B-树,集群的原住民

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2024年1月31日

MIT

2分钟阅读

viewsIcon

3041

可扩展的对象持久化,一个微服务伴侣数据库引擎,即一个代码库

背景

几十年以前,当我们实现一个需要持久化的应用程序时,我们嵌入了B-树库。然后关系数据库(RDBMS)被发明了。现在,我们编写SQL脚本来完成数据管理,并通过RDBMS提交和运行。

然后对象关系映射器(ORM)被发明了。现在,我们能够使用SQL和ORM API/中间件来完成数据持久化。

在嵌入式B-树中,你有一个可以管理文件数据的应用程序。在RDBMS中,你有一个服务器端点和一个客户端API,如ODBC来管理数据。这是一个客户端/服务器设置。在ORM中,你有一种“对象”技术。你用对象对数据进行编码/建模,然后ORM中间件将其映射到提交到后端RDBMS/DBMS/NoSql执行的SQL。

但是RDBMS/DBMS/NoSql仍然是一个端点。也就是说,你有一个单一的单体数据库服务器应用程序来服务你的数据管理。

在可扩展的对象持久化(SOP)中,我们将应用程序或微服务集群变成数据库服务器本身。我们将单体分解为“微服务”友好的形式,一个将你的应用程序或微服务变成数据库服务器本身的代码库。无热点,水平可扩展的集群。

图示

现在所有这些都说完了,我想向你展示一个示例代码,以展示在SOP中管理数据是多么容易。

t1, _ := in_red_ck.NewTransaction(true, -1)
t1.Begin()
b3, _ := in_red_ck.NewBtree[int, string](ctx, "twophase", 8, false, true, true, "", t1)

// *** Add a single item then commit so we persist "root node".
b3.Add(ctx, 500, "I am the value with 500 key.")
t1.Commit(ctx)
// ***

eg, ctx2 := errgroup.WithContext(ctx)

f1 := func() error {
	t1, _ := in_red_ck.NewTransaction(true, -1)
	t1.Begin()
	b3, _ := in_red_ck.OpenBtree[int, string](ctx2, "twophase", t1)
	b3.Add(ctx2, 5000, "I am the value with 5000 key.")
	b3.Add(ctx2, 5001, "I am the value with 5001 key.")
	b3.Add(ctx2, 5002, "I am the value with 5002 key.")
	return t1.Commit(ctx2)
}

f2 := func() error {
	t2, _ := in_red_ck.NewTransaction(true, -1)
	t2.Begin()
	b32, _ := in_red_ck.OpenBtree[int, string](ctx2, "twophase", t2)
	b32.Add(ctx2, 5500, "I am the value with 5500 key.")
	b32.Add(ctx2, 5501, "I am the value with 5501 key.")
	b32.Add(ctx2, 5502, "I am the value with 5502 key.")
	return t2.Commit(ctx2)
}

eg.Go(f1)
eg.Go(f2)

if err := eg.Wait(); err != nil {
	t.Error(err)
	return
}

上面的代码启动了两个goroutine,每个goroutine都在一个事务中管理数据。代码没有资源锁定,'只是简单地使用SOP库的API来创建一个B-树存储并向其中添加项目,然后提交以完成和提交更改'。

简单,就像你以前见过的大多数API一样。没什么花哨的,但等一下!这段代码启动了两个goroutine,以在两个不同的事务会话中添加项目,并且它们添加的项目由SOP自动调解和合并。

结果是跨不同事务添加的记录的组合。想象一下,没有资源锁定,只是简单的事务、管理操作然后提交。

想象一下,你有很多这样的代码在Kubernetes或Amazon EC2中的主机上运行。

想象一下,你只需要定义你的对象结构(键和值)并使用SOP的简单基本API。仅此而已。并且这些BTree“存储”中的每一个都是一个索引。也就是说,你可以进行高速搜索和“排序”范围查询/更新。并且你可以在不降低Cassandra和Redis集群速度的情况下拥有“很多”这样的索引。

简单明了。:)

它就在这里,现在。SOP V2支持这种“基于对象的易于编码”,但产生高度可扩展和ACID“处理”数据流,请按照此链接了解更多详细信息:https://github.com/SharedCode/sop

历史

  • 2024年1月31日:初始版本
© . All rights reserved.