rust-distributed
3
总安装量
2
周安装量
#62218
全站排名
安装命令
npx skills add https://github.com/huiali/rust-skills --skill rust-distributed
Agent 安装分布
claude-code
2
trae
1
qoder
1
trae-cn
1
antigravity
1
Skill 文档
åå¸å¼ç³»ç»
æ ¸å¿é®é¢
å¦ä½å¨åå¸å¼ç¯å¢ä¸å®ç°æ°æ®ä¸è´æ§åé«å¯ç¨ï¼
åå¸å¼ç³»ç»éè¦å¨CAPç论ä¸ååºæè¡¡ã
Raft å ±è¯ç®æ³
Raft æ ¸å¿æ¦å¿µ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Raft é群 â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤
â â
â âââââââââââ âââââââââââ âââââââââââ â
â â Leader â ââââºâ Followerâ ââââºâ Followerâ â
â â èç¹ â â èç¹ â â èç¹ â â
â ââââââ¬âââââ âââââââââââ âââââââââââ â
â â â
â - å¤ç客æ·ç«¯è¯·æ± â
â - å¤å¶æ¥å¿å° Follower â
â - 管çå¿è·³åé举 â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ç¶ææº
// Raft èç¹ç¶æ
enum RaftState {
Follower,
Candidate,
Leader,
}
struct RaftNode {
state: RaftState,
current_term: u64,
voted_for: Option<u64>,
log: Vec<LogEntry>,
commit_index: usize,
last_applied: usize,
// é举ç¸å
³
election_timeout: Duration,
last_heartbeat: Instant,
// é群é
ç½®
node_id: u64,
peers: Vec<u64>,
}
æ¥å¿å¤å¶
struct LogEntry {
term: u64,
index: usize,
command: Vec<u8>,
}
impl RaftNode {
// Leader å¤å¶æ¥å¿å° Follower
fn replicate_log(&mut self, peer: u64) {
let prev_log_index = self.get_last_log_index_for(peer);
let prev_log_term = self.get_last_log_term_for(peer);
let entries: Vec<LogEntry> = self.log
[(prev_log_index + 1)..]
.to_vec();
let rpc = AppendEntriesRequest {
term: self.current_term,
leader_id: self.node_id,
prev_log_index,
prev_log_term,
entries,
leader_commit: self.commit_index,
};
self.send_append_entries(peer, rpc);
}
}
é举æºå¶
impl RaftNode {
fn start_election(&mut self) {
self.state = RaftState::Candidate;
self.current_term += 1;
self.voted_for = Some(self.node_id);
let mut votes = 1;
// åææèç¹è¯·æ±æç¥¨
for peer in &self.peers {
let request = RequestVoteRequest {
term: self.current_term,
candidate_id: self.node_id,
last_log_index: self.log.len(),
last_log_term: self.get_last_log_term(),
};
if let Some(response) = self.send_request_vote(peer, request) {
if response.vote_granted {
votes += 1;
if votes > self.peers.len() / 2 {
self.become_leader();
return;
}
}
}
}
// é举失败ï¼åå° Follower
self.state = RaftState::Follower;
}
}
䏤鶿®µæäº¤ (2PC)
åè°è
struct TwoPhaseCommitCoordinator {
transaction_id: u128,
participants: Vec<Participant>,
state: TwoPCState,
}
enum TwoPCState {
Init,
WaitingPrepare,
WaitingCommit,
Committed,
Aborted,
}
impl TwoPhaseCommitCoordinator {
pub fn start_transaction(&mut self) {
self.state = TwoPCState::WaitingPrepare;
// 第ä¸é¶æ®µï¼åé prepare
for participant in &self.participants {
participant.send(PrepareMessage {
transaction_id: self.transaction_id,
});
}
}
pub fn handle_prepare_response(&mut self, response: PrepareResponse) {
if response.vote == Vote::Abort {
self.abort();
} else if self.all_prepared() {
self.state = TwoPCState::WaitingCommit;
// 第äºé¶æ®µï¼åé commit
for participant in &self.participants {
participant.send(CommitMessage {
transaction_id: self.transaction_id,
});
}
}
}
}
åä¸è
struct Participant {
transaction_manager: TransactionManager,
state: ParticipantState,
}
enum ParticipantState {
Init,
Prepared,
Committed,
Aborted,
}
impl Participant {
pub fn handle_prepare(&mut self, msg: PrepareMessage) {
// æ§è¡æ¬å°äºå¡æä½
let result = self.transaction_manager.execute();
match result {
Ok(_) => {
self.state = ParticipantState::Prepared;
self.send(PrepareResponse {
vote: Vote::Commit,
..msg
});
}
Err(_) => {
self.send(PrepareResponse {
vote: Vote::Abort,
..msg
});
}
}
}
}
2PC é®é¢ä¸è§£å³æ¹æ¡
| é®é¢ | åå | è§£å³æ¹æ¡ |
|---|---|---|
| é»å¡ | åè°è æ é | è¶ æ¶æºå¶ãå¤ä»½åè°è |
| åç¹æ é | ä¾èµåè°è | åå¸å¼åè°è (etcd/ZooKeeper) |
| æ§è½ | 夿¬¡ç½ç»å¾è¿ | æ¹éæäº¤ãä¼åè¶ æ¶ |
åå¸å¼ä¸è´æ§æ¨¡å
// æç»ä¸è´æ§
trait EventuallyConsistent {
fn put(&self, key: &str, value: &str);
fn get(&self, key: &str) -> Option<String>;
}
// 强ä¸è´æ§ï¼çº¿æ§åï¼
trait Linearizable {
fn put(&self, key: &str, value: &str) -> Result<()>;
fn get(&self, key: &str) -> Result<String>;
}
// 顺åºä¸è´æ§
trait SequentialConsistent {
fn put(&self, key: &str, value: &str);
fn get(&self, key: &str) -> Vec<String>; // è¿ååå²çæ¬
}
åå¸å¼ ID çæ
// Snowflake ç®æ³
struct SnowflakeGenerator {
worker_id: u64,
datacenter_id: u64,
sequence: u64,
last_timestamp: u64,
}
impl SnowflakeGenerator {
pub fn generate(&mut self) -> u64 {
let timestamp = current_timestamp();
if timestamp == self.last_timestamp {
self.sequence = (self.sequence + 1) & 0xFFF; // 12ä½
if self.sequence == 0 {
// çå¾
ä¸ä¸æ¯«ç§
while current_timestamp() == timestamp {}
}
} else {
self.sequence = 0;
}
self.last_timestamp = timestamp;
(timestamp << 22) // 41使¶é´æ³
| (self.datacenter_id << 17) // 5使°æ®ä¸å¿
| (self.worker_id << 12) // 5ä½å·¥ä½èç¹
| self.sequence // 12ä½åºåå·
}
}
åå¸å¼é
use std::sync::{Arc, atomic::{AtomicU64, Ordering}};
use std::time::Duration;
struct DistributedLock {
key: String,
ttl: Duration,
owner: u64,
}
impl DistributedLock {
// åºäº etcd çåå¸å¼é
pub async fn try_lock(&self, owner: u64, ttl: Duration) -> Result<bool, LockError> {
let response = etcd_client.put(
format!("/lock/{}", self.key),
owner.to_string(),
Some(PutOptions::new().with_ttl(ttl))
).await?;
// 妿æ¯ç¬¬ä¸ä¸ªè®¾ç½®è
ï¼è·å¾é
Ok(response.prev_key().is_none())
}
pub async fn unlock(&self, owner: u64) -> Result<(), LockError> {
// åªè½ç±éçææè
éæ¾
let response = etcd_client.get(format!("/lock/{}", self.key)).await?;
if response.value() == owner.to_string() {
etcd_client.delete(format!("/lock/{}", self.key)).await?;
}
Ok(())
}
}
åå¸å¼äºä»¶æº¯æº
// äºä»¶æº¯æºæ¨¡å¼
trait EventSourced {
type Event;
fn apply(&mut self, event: Self::Event);
fn snapshot(&self) -> Self;
}
struct Aggregate {
version: u64,
events: Vec<Event>,
state: AggregateState,
}
impl Aggregate {
pub fn new() -> Self {
Self {
version: 0,
events: Vec::new(),
state: AggregateState::Init,
}
}
pub fn apply_event(&mut self, event: Event) {
self.state.transition(&event);
self.events.push(event);
self.version += 1;
}
pub fn snapshot(&self) -> EventSourcedSnapshot {
EventSourcedSnapshot {
version: self.version,
state: self.state.clone(),
}
}
}
常è§é®é¢
| é®é¢ | åå | è§£å³ |
|---|---|---|
| èè£ | ç½ç»ååº | æ³å®äººæ°ãä»»ææºå¶ |
| æ´»é | éä¸¾è¶ æ¶å²çª | éæºåè¶ æ¶ |
| æ°æ®ä¸ä¸è´ | å¹¶ååå ¥ | å²çªè§£å³çç¥ |
| æ§è½ç¶é¢ | åç¹åå ¥ | åçãå¤å¶ |
ä¸å ¶ä»æè½å ³è
rust-distributed
â
ââ⺠rust-concurrency â å¹¶åæ§å¶
ââ⺠rust-performance â æ§è½ä¼å
ââ⺠rust-async â 弿¥éä¿¡