Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Knee-Deep Into P2P: A Tale of Fail (PWL Porto)
Fernando Mendes
May 23, 2018
Programming
0
39
Knee-Deep Into P2P: A Tale of Fail (PWL Porto)
Fernando Mendes
May 23, 2018
Tweet
Share
More Decks by Fernando Mendes
See All by Fernando Mendes
you. and the morals of technology
fribmendes
1
90
Knee-Deep Into P2P: A Tale of Fail (ElixirConf EU 2018 version)
fribmendes
0
58
Knee-Deep Into P2P: A Tale of Fail (non-Elixir)
fribmendes
0
120
A Look Into Bloom Filters
fribmendes
0
140
Bloom Filters: A Look Into Ruby
fribmendes
0
85
Programming WTF: HTML & CSS
fribmendes
4
130
Ruby: A (pointless) Workshop
fribmendes
1
130
Elixir: A Talk For College Students
fribmendes
0
110
Riding Rails
fribmendes
0
85
Other Decks in Programming
See All in Programming
OSS Forward Workshop
giginet
2
460
A technique to implement DSL in Ruby
okuramasafumi
0
830
既存画面の Jetpack Composeでの書き換え: FAANSでの事例紹介 / Case study of rewriting existing screens with Jetpack Compose
horie1024
0
360
マイクロインタラクション入門〜ディテイルにこだわるエンジニアリング〜
swimmyxox
0
120
よりUXに近いSLI・SLOの運用による可用性の再設計
kazumanagano
3
1k
【Qiita Night】新卒エンジニアによるSwift6与太予想
eiji127
0
190
SRE NEXT 2022: Sensible Incident Management for Software Startups
takanabe
2
780
Let's build components, not layers
thombergs
1
230
アプリのログをチーム外で活用してもらうためにやったこと
shotakashihara
0
200
Cloud-Conference-Day-Spring Cloud + Spring Webflux: como desenvolver seu primeiro microsserviço reativo em Java?
kamilahsantos
1
170
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
4
660
モバイルファーストデザインの爆速実装を考える
tanabee8
0
170
Featured
See All Featured
Unsuck your backbone
ammeep
659
55k
Creatively Recalculating Your Daily Design Routine
revolveconf
207
10k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
12
900
4 Signs Your Business is Dying
shpigford
169
20k
How to train your dragon (web standard)
notwaldorf
57
3.8k
StorybookのUI Testing Handbookを読んだ
zakiyama
4
2k
Raft: Consensus for Rubyists
vanstee
126
5.4k
How GitHub Uses GitHub to Build GitHub
holman
465
280k
Testing 201, or: Great Expectations
jmmastey
21
5.4k
The Language of Interfaces
destraynor
148
20k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_i
21
15k
Learning to Love Humans: Emotional Interface Design
aarron
261
37k
Transcript
Knee-Deep Into P2P A Tale of Fail @fribmendes
Knee-Deep Into P2P A Tale of Fail @fribmendes
None
None
None
None
None
I don’t know how to smart office
I don’t know how to smart office … what now?
@fribmendes me failing at photoshop
None
I don’t know how to smart office … what now?
None
None
None
None
Step 1: receive new connections
Step 1: receive new connections Step 2: accept and send
messages
Step 1: receive new connections Step 2: accept and send
messages Step 3: do a bunch of Steps 1 and 2
Step 1: receive new connections
None
defp accept_loop(pid, server_socket) do {:ok, client} = :gen_tcp.accept(server_socket) :inet.setopts(client, [active:
true]) :gen_tcp.controlling_process(client, pid) Gossip.accept(pid, client) accept_loop(pid, server_socket) end
defp accept_loop(pid, server_socket) do {:ok, client} = :gen_tcp.accept(server_socket) :inet.setopts(client, [active:
true]) :gen_tcp.controlling_process(client, pid) Gossip.accept(pid, client) accept_loop(pid, server_socket) end
Step 1: receive new connections Step 2: accept and send
messages
None
def recv_loop(pid, socket) do receive do {:tcp, _port, msg} ->
# process an incoming message {:tcp_closed, port} -> # close the sockets {:send, msg} -> # send an outgoing message end end end
Step 1: receive new connections Step 2: accept and send
messages Step 3: do a bunch of Steps 1 and 2
Raspberry Pi #1 Raspberry Pi #2
None
None
None
“Does it scale?”
None
None
g
Gnutella
Gnutella
Gnutella
Gnutella
Gnutella
g
g (gnutella2)
Gnutella
G2/Gnutella2
G2/Gnutella2
G2/Gnutella2
G2/Gnutella2
None
None
None
None
None
HyParView
None
None
None
None
None
None
None
None
Plumtrees
Optimal number of messages
But you can’t afford to lose nodes
None
None
None
None
None
None
None
None
None
None
None
“Aha! It works on my computer!”
“Aha! It works on my computer!”
“Great but we need something to show”
“Great but we need something to show” (aka Raspberry Pi
time)
“Guys… Is this a bomb? Are we going to die?”
— @naps62
“Hey, I can borrow™ someone else’s code”
None
None
None
you shall not pass!
Stick everything on Raspberry Pi’s
Things running on one Raspberry Pi
Things running on one Raspberry Pi ✓BEAM
Things running on one Raspberry Pi ✓BEAM ✓thebox (sensors)
Things running on one Raspberry Pi ✓BEAM ✓thebox (sensors) ✓Phoenix
app
Things running on one Raspberry Pi ✓BEAM (x2) ✓thebox (sensors)
✓Phoenix app
Things running on one Raspberry Pi ✓BEAM (x2) ✓thebox (sensors)
✓Phoenix app ✓Postgres
Things running on one Raspberry Pi ✓BEAM (x2) ✓thebox (sensors)
✓Phoenix app ✓Postgres ✓Cassandra
Things running on one Raspberry Pi ✓BEAM (x2) ✓thebox (sensors)
✓Phoenix app ✓Postgres ✓Cassandra it works!
None
None
None
“Looking good! Everything’s working!”
lol, nope
State of each node:
State of each node: • Last sensor readings
State of each node: • Last sensor readings • Network
map (MAC-IP)
State of each node: • Last sensor readings • Network
map (MAC-IP) • Target values
State of each node: • Last sensor readings • Network
map (MAC-IP) • Target values
None
How do we handle concurrency?
None
None
No database locks. No transactions. You’re on your own, kiddo.
Vector Clocks
None
None
None
None
None
None
None
None
Vector = (1, 0) Vector = (0, 1)
CAP Theorem
CAP Theorem “you’re a programmer. you can’t have nice things.”
consistency availability partitioning
consistency availability partitioning
None
Eventual Consistency
CRDTs
None
Operation-Based CRDT
Operation-Based CRDT commutative but not idempotent update exactly once
no CRDTs
no CRDTs
no CRDTs
no CRDTs
Op-based CRDTs
Op-based CRDTs
Op-based CRDTs
Op-based CRDTs
State-Based CRDT
State-Based CRDT commutative and idempotent heavier on the network
State-based CRDTs
State-based CRDTs
State-based CRDTs
State-based CRDTs
None
None
None
None
None
None
None
None
Wrapping up
System resources matter
System resources matter your algorithms should account for them
There are models. Use them.
Distributed System Checklist
Distributed System Checklist •Is the number of processes known or
finite?
Distributed System Checklist •Is the number of processes known or
finite? •Is there a global notion of time?
Distributed System Checklist •Is the number of processes known or
finite? •Is there a global notion of time? •Is the network reliable?
Distributed System Checklist •Is the number of processes known or
finite? •Is there a global notion of time? •Is the network reliable? •Is there full connectivity?
Distributed System Checklist •Is the number of processes known or
finite? •Is there a global notion of time? •Is the network reliable? •Is there full connectivity? •What happens when a process crashes?
It really doesn’t change that much
CRDTs aren’t a golden hammer
Reinventing the wheel is stupid
None
Knee-Deep Into P2P A Tale of Fail @fribmendes