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
55
BPF programmable socket lookup
majek04
0
690
Linux at Cloudflare
majek04
3
8.9k
DDoS Landscape
majek04
0
450
Inside Cloudbleed
majek04
3
3.1k
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
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
280
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
180
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
300
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
320
Building an Out-of-Order CPU
latte72
1
790
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
720
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
490
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
7.3k
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
120
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
1
150
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.5k
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1k
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
400
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
600
Rails Girls Zürich Keynote
gr2m
96
14k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
410
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
700
Believing is Seeing
oripsolob
1
220
Making the Leap to Tech Lead
cromwellryan
135
10k
The Spectacular Lies of Maps
axbom
PRO
1
1k
The agentic SEO stack - context over prompts
schlessera
0
940
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