3 个版本 (破坏性更新)
0.4.1 | 2023 年 6 月 22 日 |
---|---|
0.3.0 | 2023 年 2 月 26 日 |
0.1.0 | 2023 年 1 月 5 日 |
在 并发 中排名第 1132
每月下载 42 次
在 4 crates 中使用
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