Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Actor Systems In Rust: Techniques and Tradeoffs
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Andrew J. Stone
November 16, 2017
Programming
350
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Actor Systems In Rust: Techniques and Tradeoffs
Andrew J. Stone
November 16, 2017
More Decks by Andrew J. Stone
See All by Andrew J. Stone
Actor Systems in Rust (Boston Rust Meetup Version)
ajs
0
86
Implementation and Verification of a Consensus Protocol in Erlang
ajs
0
260
Other Decks in Programming
See All in Programming
初めてのKubernetes 本番運用でハマった話
oku053
0
120
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.8k
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
110
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.6k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.8k
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
130
共通化で考えるべきは、実装より公開する型だった
codeegg
0
170
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
480
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
720
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
500
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
RailsConf 2023
tenderlove
30
1.5k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Tell your own story through comics
letsgokoyo
1
990
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
180
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
Building AI with AI
inesmontani
PRO
1
1.1k
The browser strikes back
jonoalderson
0
1.4k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
450
Optimising Largest Contentful Paint
csswizardry
37
3.8k
Transcript
Actor Systems in Rust: Techniques and Tradeoffs Andrew J. Stone
Haret Distributed Coordinator and KV Store
Haret Multiple Independent Consensus Groups
Haret Protocol Viewstamped Replication Revisited for Consensus
Haret Backend • Versioned persistent trie per consensus group •
CAS on entire subtrees • Typed Leaves • Blob • Queue • Set
[email protected]
[email protected]
[email protected]
p1 p2 p3 Request (1) Prepare (2)
PrepareOk (3) Prepare (2) PrepareOk (3) Reply (4)
Actors Processes That Communicate Only via Asynchronous Msg Passing
Actors Straightforward Representation of Peers in a Consensus Group
Rabble Actor Abstractions for Implementing Distributed Algorithms
Rabble Dynamic Cluster Membership, Transport and Msg Routing
Rabble Designed for Testability
Rabble A Work in Progress
Rabble Provides a clean way to implement VRR in Haret
Naming pub struct Pid { pub group: Option<String>, pub name:
String, pub node: NodeId, }
Messages pub enum Msg<T> { User(T), ClusterStatus(ClusterStatus), ExecutorStatus(ExecutorStatus), StartTimer(usize), //
time in ms CancelTimer(Option<CorrelationId>), Timeout, Shutdown, GetMetrics, Metrics(Vec<(Name, Metric)>) } { Rabble built-ins User Defined
Envelopes pub struct Envelope<T> { pub to: Pid, pub from:
Pid, pub msg: Msg<T>, pub correlation_id: Option<CorrelationId> }
pub trait Process<T> : Send { /// Handle messages from
other actors fn handle(&mut self, msg: Msg<T>, from: Pid, correlation_id: Option<CorrelationId>, output: &mut Vec<Envelope<T>>); } Processes
Echo Server P1 (Client) Envelope { to: P2, from: P1,
msg: Msg::User<Hello>, correlation_id: Some(P1) } Envelope { to: P1, from: P2, msg: Msg::User<Hello>, correlation_id: Some(P1) } P2 (Server)
impl Process<T> for EchoServer<T> { fn handle(&mut self, msg: Msg<T>,
from: Pid, cid: Option<CorrelationId>, output: &mut Vec<Envelope<T>>) { match msg { Msg::User(Hello) => { let to = from; // P1 let from = self.pid.clone(); // P2 let msg = Msg::User(Hello); let reply = Envelope::new(to, from, msg, cid); output.push(reply); }, _ => () } }
Executor Locates and Runs Processes
P1 P2 P3 Hashmap<Pid, Process> Executor Channel To: P1 Thread
Handle
Property Based Testing 1. Construct a group of processes in
an initial state 2. Generate a schedule of test messages 3. Call the handle method of a process with a test message 4. Collect output messages of handle method 5. Schedule output messages
Test Scheduling Trigger Protocol State Transitions with Explicit Timeouts
Test Assertions •Pre/Post conditions •Global state invariants
Failing Tests Failing Schedules Run as a Regression Suite
Debugging Each Message Receipt is One Step in a Test
Schedule
Cluster Server Non-blocking Single Threaded Server with TCP Connections to
every node
Membership Dynamic Membership Maintained in an Observed-Remove Set
Services Actors that Run Blocking and CPU Intensive Operations
Takeaways
Takeaway Dynamic Messaging is Complex Expensive, and Unergonomic for Distributed
Actors in Rust
Takeaway Writing Good Schedulers is Hard
Takeaway Design your systems to make deterministic testing easier
Takeaway Compromise and Pragmatism allow a good enough solution that
works NOW
Links • https://github.com/andrewjstone/rabble • https://github.com/andrewjstone/orset • https://github.com/vmware/haret
Thanks! Tom Santero Justin Sheehy VMware