Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Gatelogic - Somewhat functional reactive framew...
Search
majek04
November 27, 2017
Programming
5.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Gatelogic - Somewhat functional reactive framework in Python
majek04
November 27, 2017
More Decks by majek04
See All by majek04
Keeloq_AD_2025__1_.pdf
majek04
0
59
BPF programmable socket lookup
majek04
0
690
Linux at Cloudflare
majek04
3
9k
DDoS Landscape
majek04
0
450
Inside Cloudbleed
majek04
3
3.2k
Golang sucks
majek04
21
53k
How Cloudflare deals with largest DDoS attacks?
majek04
2
3.7k
Why we chose Service Worker API
majek04
0
3k
IP Spoofing - DEFCON
majek04
1
1.1k
Other Decks in Programming
See All in Programming
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
380
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.9k
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
390
The Rails Doctrine Decade
koic
2
520
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
120
Simple Storage Service(S3) is not simple
iwatsukayura
0
210
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
110
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
210
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
460
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
120
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
720
Featured
See All Featured
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Skip the Path - Find Your Career Trail
mkilby
1
240
Raft: Consensus for Rubyists
vanstee
142
7.7k
Statistics for Hackers
jakevdp
799
230k
Docker and Python
trallard
47
4.2k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
570
BBQ
matthewcrist
90
10k
Transcript
Gatelogic FRP framework Marek Majkowski @majek04 ...200 lines of Python
I still regret...
Who we are? 2
Reverse proxy 3 Eyeball Reverse proxy Origin server • Optimizations
• Caching • DDoS protection • Security
Attacked 4
Signal 5 pretty analytics signal Operator switch switch switch
6 Signal
7
8 iptables rules mitigation servers command line Operator Mitigation
9 Mitigation
10 pretty analytics command line iptables mitigation signal Operator servers
switch switch switch
Copy-pasta 11
"Business logic" 12 iptables rules mitigation signal servers switch switch
switch ?
12 months later... 13
14 --ip=1.2.3.4 example.com --ip=1.2.3.4 example.com --qps=100 Business logic
15 --ip=1.2.3.4 example.com --qps=500 example.com = FREE | PAID Business
logic --ip=1.2.3.4 example.com
16 --ip=1.2.3.4 example.com --except www,n1,ns2 --qps=500 Business logic example.com subdomains:
(www, ns1, ns2) --ip=1.2.3.4 example.com example.com = FREE | PAID
17 Input Steam extra stream extra stream Output Stream Reactive
Rule
18 Reactive rule def dns_mitigation(attack, plan, subdomains, toggles): domain =
attack['domain'] if toggles['all_mitigations_disabled']: return qps = 100 if plan[domain] == 'business': qps = 500 mitigation = attack['description'] + \ ' --qps=%s' % qps + \ ' --except=%s'.join(subdomains[domain]) return mitigation
Subscriptions 19 def dns_mitigation(attack, plan, subdomains, toggles): domain = attack['domain']
if toggles['all_mitigations_disabled']: return qps = 100 if plan[domain] == 'business': qps = 500 mitigation = attack['description'] + \ ' --qps=%s' % qps + \ ' --except=%s'.join(subdomains[domain]) return mitigation
Business logic • Hard problem! • Multiple DB lookups •
Wait for operator confirmation • Critical path 20
Functional reactive programming 21
22
23 models - Excel
models - Materialized data 24 input output function 00:01h 23:59h
x
models - Signals 25
Pure FRP is useless • Weird language - (ELM anyone?)
• Fixed signal flow • Strictly no side-effects 26
Dirty FRP is awesome 27 • Weird language • Python
• Fixed signal flow • Attacks come and go, but patterns fixed • Strictly no side-effects • Dynamic "subscriptions", but idempotent
Prior art - Trellis 28
29
Gatelogic! 30 https://github.com/cloudflare/gatelogic
Gatelogic • Input - ReadableHub • update(full_data) • Processing -
ComputableHub • maintain(key, function) • unmaintain • Subscriptions - QueryHub • update(full_data) 31
32 { '00001': {ip:'1.2.3.4', port: 80, domain: 'bar.com', '00002': {ip:'1.2.3.5',
port: 80, domain: 'foo.com', ... } Input data - a dict
33 ReadableHub update { 'attack1': 'example.com', ... } update()
34 ComputableHub def on_hook(_, kind, k, row): if kind ==
'add': mitigations.maintain(k, action, row) if kind == 'delete': mitigations.unmaintain(k) subscribe(readable, on_hook) def action(row): return None 34 ReadableHub
35 OutputHub ComputableHub ?
36 OutputHub ComputableHub ReadableHub QueryHub ? database
37 OutputHub ComputableHub ReadableHub QueryHub X X X X X
X Materialized
38 def action(row, plan_hub, subdomain_hub, toggle_hub): domain = row.value if
not domain: return None if toggle_hub.get('all_mitigations_disabled').value != 'True': return None qps = 100 if plan_hub.get(domain).value in ('business', 'b'): qps = 500 sd = (subdomain_hub.get(domain).value or '').split(' ') mitigation = \ domain + \ ' --qps=%s ' % qps + \ ' '.join('--except=%s' % s for s in sd) return mitigation
It works! • Solid foundation! • Composable! • Scalable •
Maintainable • But: • no event loop • lacks higher-order abstractions 39
40
204 loc 41 marek@ubuntu-saucy:~/cloudflare/gatelogic/gatelogic$ cloc *py 3 text files. 3
unique files. 0 files ignored. http://cloc.sourceforge.net v 1.60 T=0.01 s (240.8 files/s, 23197.8 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- Python 3 61 24 204 ------------------------------------------------------------------------------- SUM: 3 61 24 204 -------------------------------------------------------------------------------
Thanks! • FRP is grea • http://www.flapjax-lang.org/ • https://www.youtube.com/watch?v=mEvo6TVAf64 •
https://www.youtube.com/watch?v=Agu6jipKfYw 42 https://github.com/cloudflare/gatelogic marek@cloudflare.com @majek04