Skip to content
Chenghua edited this page Dec 22, 2022 · 11 revisions

banner

欢迎访问 共价键 的中文维基

Toc

Introduction

不怎么会写,但作为系统设计开发又不得不有的文档 😂

Getting Started

API reference

什么是 “共价键”?

“共价键” 是一个 我们设计的 数据中间件 的命名,这个数据中间件是 2022-2023 秋季的系统设计开发大作业,由七牛命题。

数据中台(数据中间件) 是一个连接着前端和后端之间的一个中间角色。其目的是为了进一步解耦前端和后端(虽然,但是,解耦两个物体实际上会造成第三方物体的耦合的,连接关系是不变的),进而更加方便两端的人员快速的开发和实现一些需求。

我们的数据中间件建设依赖于如下的限制:

  1. 只有关系型数据库可以接入。
  2. 我们最终的目标只提供 SQL型数据库接入,但是留出快速编写的接口给 MonGo 等数据库以便后期二次开发。

计算图和流是我们整个框架的基础,我们认为在处理多个远程连接的任务上,不论是在数据的获取和处理阶段,图都能做到如下的优点:

  1. 图数据结构可以很好的管理异步节点之间的关系,以期待获得更好的性能。
  2. 图可以很好的拆分操作符,我们只需要提供几个基础的元操作符,用户就可以使用这些操作符进行很多自由的组合来扩大表示范围。

为了加大程序的拓展性,并且利于开发人员手工编写适合于不同情况的数据合并场景,我们将 C++ 与 Lua 绑定,将 C++ 的运行时共享给 Lua。 得益于 LuaJIT 优异的性能表现,以及与 C++ 运行时近乎于零开销的互相调用,通过 Lua 构建的图和编写的算子有较高的性能。

如何快速的定义一个图任务

在一个 Lua 文件里我们会帮你定义好 ThisGraph 这个类,你只需要直接用就行了。在一个 Lua 文件里也就只能存在一个 ThisGraph 类的实体。 我们会帮你初始化 Lua 的运行堆栈,所以你不需要 require('libCB'),当然,多 require 一次也是无所谓的。我们的 Lua 文件在运行时会内嵌在 C++ 运行时中进行直接互相交互,这意味着两个运行时是同时存在的,所以图的执行并不是如 tf、torch 一类框架这样显示指定的,Lua 脚本只是一种与 C++ runtime 进行交互的手段。

下面的 Lua 代码创建了一张最简单的计算图:把 两个 MySQL 算子传递给一个 Combine 算子。

需要注意的是,如 ThisGraph:createVirtualDeviceNode(0);这个使用方式所示,在创建虚拟设备节点的时候,需要直接显示的给出连接的编号。连接的编号可以是相同的,但是建议使用不同的连接编号。在你创建一个设备的时候会给出连接编号,如果这个连接被占用了,那么其他需要使用这个连接的虚拟节点会被等待。所以,如果两个设备节点之间没有什么数据关联的话,建议使用两条不同的连接,以使虚拟节点之间能够异步,来获得更好的性能。

node_vd_1 = ThisGraph:createVirtualDeviceNode(0);
node_vd_2 = ThisGraph:createVirtualDeviceNode(1);
node_vd_1:addQuery("SELECT * FROM runoob_tbl;");
node_vd_2:addQuery("SELECT * FROM runoob_tbl_2;");

node_vd_combine = ThisGraph:createCombineNode({"PrimaryKey1", "PrimaryKey2"}, "NewTable");
node_vd_1:PointTo(cb.F.refNode(node_vd_combine));
node_vd_2:PointTo(cb.F.refNode(node_vd_combine));

function myCombineOp(baseOpPtr, primaryKeys)
    local inputs = baseOpPtr.io.I; -- vector.
    local output = baseOpPtr.io.O; -- virtual table.
    -- this program is a default behavior of combine operation.
    if #inputs ~= #primaryKeys then
        print("[ CB engine Error ] when execute Cb.Op.CombineOp. #inputs ~= #primaryKeys");
        return;
    end
    -- some logic to combine tables.
end

node_vd_combine.overrideFunc(myCombineOp);
ThisGraph:addCacheServer(ThisGraph:createRedisCachingNode(0));

开发环境

OS: Ubuntu20.04 LTS(core part) / Ubuntu20.04 LTS-WSL(core part) / Win10(For MySQL server only) OS: Arch=amd64

cpp Compiler: Clang v12+ / GNU 9.4+

CMake V3.24+

LuaJIT V2.1+

Python V3.9+ (used in django. For server only.)

第三方库依赖

  • workflow Sogou`s C++ server engine which can satisfy most C++ back-end development requirements.

  • sRPC An enterprise-level RPC system

  • gLog Google logging module

  • fmt A modern formatting library

  • protobuf Protocol Buffers - Google's data interchange format

  • redis in-memory database that persists on disk.

  • rapidJson A fast JSON parser/generator for C++ with both SAX/DOM style API

  • zeroMQ attention👀, this lib may not be used. workflow provide a message queue already.

  • Zlib

  • LuaJit Integrate in. For hot update.

  • lz4 Extremely fast compression

  • sol2 bind C++ and lua.

如何安装

预编译包

我们发布了 Release 版本,你可以在本仓库的 Release 页面看到发布的软件包。直接解压后就可以直接使用,你也可以对库和可执行文件建立软连接到系统 lib / bin 中。

从源码编译

请确保你已经正确安装了 第三方库依赖 章节所提及的库。在编译可执行文件之前,你需要首先编译 预编译头文件。所有的编译出来的文件都会存放在 covalentBond/bin/ 目录中。

git clone https://github.com/chenghuaWang/covalentBond.git
cd covalentBond
mkdir build
cd build
cmake ..
# build pre-compiled head and cb-server.
cmake --build . -j 4 --target cb-pch
cmake --build . -j 4 --target cb-server
# run the ctest
ctest
cd ..
rm -rf build

感谢所有的开发者

Made with contrib.rocks.