#分布式系统 #分布式 #CRDT #tokio #异步 #数据中心 #数据库

datacake-node

基于 Quickwit 的 chitchat 构建的核集群成员系统

3 个版本 (破坏性更新)

0.4.1 2023 年 6 月 22 日
0.3.0 2023 年 2 月 26 日
0.1.0 2023 年 1 月 5 日

并发 中排名第 1132

每月下载 42
4 crates 中使用

MIT 许可证

205KB
4K SLoC

数据蛋糕节点

Datacake 使用的核心成员系统。

此系统允许您在核心功能之上构建集群扩展,从而访问实时成员监视器、节点选择器、集群时钟等...

这是此类的一个好例子,即 datacake-eventual-consistency crate,它简单地实现了 ClusterExtension crate,这使得它可以在运行时无问题地添加。

特性

  • 零拷贝 RPC 框架,允许在运行时添加和删除服务。
  • 可更改的节点选择器,用于从活动成员中选择节点来处理任务。
  • 预先构建的具有数据中心意识的节点选择器,用于优先处理其他可用区域中的节点。
  • 用于保持有效墙上时钟的分布式时钟,该时钟尊重因果关系。

入门指南

要开始,我们将创建我们的集群

use std::net::SocketAddr;

use datacake_node::{ConnectionConfig, DCAwareSelector, DatacakeNodeBuilder};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let bind_addr = "127.0.0.1:8000".parse::<SocketAddr>().unwrap();
    
    // We setup our connection config for the node passing in the bind address, public address and seed nodes.
    // Here we're just using the bind address as our public address with no seed, but in the real world
    // this will be a different value when deployed across several servers with seeds to contact.
    let connection_cfg = ConnectionConfig::new(bind_addr, bind_addr, Vec::<String>::new());
    
    // Our builder lets us configure the node. 
    // 
    // We can configure the node selector, data center of the node, cluster ID, etc...
    let my_node = DatacakeNodeBuilder::<DCAwareSelector>::new(1, connection_cfg).connect().await?;
        
    // Now we're connected we can add any extensions at runtime, our RPC server will already be
    // running and setup.
    //
    // Check out the `datacake-eventual-consistency` implementation for a demo.
    
    Ok(())
}

创建扩展

创建集群扩展非常简单,它是一个特质,可以做几乎所有事情

use datacake_node::{ClusterExtension, DatacakeNode};
use async_trait::async_trait;

pub struct MyExtension;

#[async_trait]
impl ClusterExtension for MyExtension {
    type Output = ();
    type Error = MyError;

    async fn init_extension(
        self,
        node: &DatacakeNode,
    ) -> Result<Self::Output, Self::Error> {
        // In here we can setup our system using the live node.
        // This gives us things like the cluster clock and RPC server:
        
        println!("Creating my extension!");
        
        let timestamp = node.clock().get_time().await;
        println!("My timestamp: {timestamp}");
        
        Ok(())
    }  
}

pub struct MyError;

依赖关系

~7–17MB
~218K SLoC