Slide 1

Slide 1 text

'T ONCACHEBARE CACHEN DOOR THIJS FERYN MET VARNISH

Slide 2

Slide 2 text

Trage websites SUCKN

Slide 3

Slide 3 text

DE MENSCHN EN GÈREN DAT RAPT GOAT EN DAT MAKT OOK DEEL UUT VAN DE USER EXPERIENCE

Slide 4

Slide 4 text

TRAGE EN PLAT IS VERRE 'T ZELFSTE

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

MET SERVERS SMIETEN

Slide 9

Slide 9 text

MO' MONEY MO' SERVERS MO' PROBLEMS WITJEWEL KÈREL

Slide 10

Slide 10 text

EFTJES KI KIEKEN NO DE TRAAGSTE DELEN

Slide 11

Slide 11 text

OPTIMALISEREN

Slide 12

Slide 12 text

ACHTER EEN ENDE KOM JE TENDN

Slide 13

Slide 13 text

CACHE

Slide 14

Slide 14 text

HEY, IK ZIEN THIJS

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

IK ZIEN EVANHELIST BIE

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

4,800,000 WEBSITES 19% VAN DE TOP 10K WEBSITES

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

IK ZIEN @THIJSFERYN

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

NORMAAL GEBRUKER SERVER

Slide 28

Slide 28 text

MET VARNISH GEBRUKER VARNISH SERVER

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

DE CACHE CONTROLEREN Expires: Sat, 09 Sep 2017 14:30:00 GMT Cache-control: public, max-age=3600, s-maxage=86400 Cache-control: private, no-cache, no-store Vary: Accept-Language

Slide 32

Slide 32 text

STATE

Slide 33

Slide 33 text

STATE ~ HEBRUKERSSPECIFIEKE DATA COOKIES AUTH HEADERS

Slide 34

Slide 34 text

'T IS JUSTE VOE JOEN EN NIEMAND ANDERS NIET GECACHED EJT VERSTOAN?

Slide 35

Slide 35 text

VARNISH CONFIGURATION LANGUAGE

Slide 36

Slide 36 text

vcl 4.1; sub vcl_recv { if (req.http.Cookie) { set req.http.Cookie = ";" + req.http.Cookie; set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";"); set req.http.Cookie = regsuball(req.http.Cookie, ";(SESS[a-z0-9]+|SSESS[a-z0-9]+|NO_CACHE)=", "; \1="); set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", ""); set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", ""); if (req.http.Cookie == "") { unset req.http.Cookie; } else { return (pass); } } } OLENE EEN PAAR COOKIES OEDEN

Slide 37

Slide 37 text

sub vcl_recv { if (req.http.Cookie) { set req.http.Cookie = ";" + req.http.Cookie; set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";"); set req.http.Cookie = regsuball(req.http.Cookie, ";(language)=", "; \1="); set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", ""); set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", ""); if (req.http.cookie ~ "^\s*$") { unset req.http.cookie; return(pass); } return(hash); } } sub vcl_hash { hash_data(regsub( req.http.Cookie, "^.*language=([^;]*);*.*$", "\1" )); } COOKIE CACHE VARIATIE

Slide 38

Slide 38 text

vcl 4.1; import cookieplus; sub vcl_recv { cookieplus.keep("language"); cookieplus.write(); } sub vcl_hash { hash_data(cookieplus.get("language")); } VMOD_COOKIE

Slide 39

Slide 39 text

BEVAT HEBRUKERSHEHEVENS

Slide 40

Slide 40 text

NIET CACHEN

Slide 41

Slide 41 text

PLACEHOLDERS

Slide 42

Slide 42 text

APARTE HTTP REQUEST

Slide 43

Slide 43 text

AJAX

Slide 44

Slide 44 text

✓CLIENT-SIDE ✓WE KEN' DA ✓PARALLEL VERWERKT ✓GRACEFUL DEGRADATION -DE BROWSER MOET ER Z'N PLAN MEE TREKN -EXTRA ROUNDTRIPS -BITJE TRAGER AJAX

Slide 45

Slide 45 text

EDGE-SIDE INCLUDES ESI

Slide 46

Slide 46 text

Slide 47

Slide 47 text

ESI ✓ PLACEHOLDER ✓ VERWERKT DEUR VARNISH ✓ OUTPUT IS EEN COMPOSITIE VAN BLOCKS ✓ STATE PER BLOCK ✓ TTL PER BLOCK

Slide 48

Slide 48 text

sub vcl_recv { set req.http.Surrogate-Capability = "key=ESI/1.0"; } sub vcl_backend_response { if (beresp.http.Surrogate-Control ~ "ESI/1.0") { unset beresp.http.Surrogate-Control; set beresp.do_esi = true; } }

Slide 49

Slide 49 text

✓SERVER-SIDE ✓GESTANDAARDISEERD ✓VERWERKT ON THE “EDGE”, NIET IN DE BROWSER ✓IN 'T ALHEMEEN RAPPER -SEQUENTIEEL* -EEN DERAN, OL DERAN -BEPERKTE IMPLEMENTATIE IN VARNISH -WE KENNEN DA NIE ZO GOED ESI PARALLEL IN ENTERPRISE

Slide 50

Slide 50 text

NIET-CACHEBARE ROUTES ZIEN NOG OSSAN EEN TERE PLEKKE

Slide 51

Slide 51 text

NIET ZOMAAR EEN CACHE NIET ZOMAAR "TE NEMEN OF TE LATEN"

Slide 52

Slide 52 text

EEN HTTP BLOKKENDOZE

Slide 53

Slide 53 text

BESLISSINGEN PAKKEN "ON THE EDGE"

Slide 54

Slide 54 text

vcl 4.1; import cookieplus; import redis; import synthbackend; sub vcl_init { new db = redis.db( location="redis:6379", type=master, connection_timeout=500, shared_connections=false, max_connections=1); } sub vcl_recv { set req.http.X-Login = "false"; set req.http.x-session = cookieplus.get("PHPSESSID","guest"); if(req.http.x-session != "guest") { db.command("EXISTS"); db.push("sf_s"+cookieplus.get("PHPSESSID")); db.execute(); if(db.get_integer_reply() == 1) { set req.http.X-Login = "true"; } } } SYNTHETIC HTTP

Slide 55

Slide 55 text

sub vcl_backend_fetch { if(bereq.url == "/session") { if(bereq.http.X-Login != "true") { set bereq.backend = synthbackend.from_string("{}"); return(fetch); } db.command("EVAL"); db.push({" local session = redis.call('GET', KEYS[1]) if session == nil then return '{}' end local result = string.gsub(session, '[%c]', '') local username = string.gsub(result,'.+Userusername\";s:[0-9]+:\"([^\"]+)\";.+','%1') if username == nil then return '{}' end return '{"username":"'.. username ..'"}' "}); db.push(1); db.push("sf_s"+cookieplus.get("PHPSESSID")); db.execute(); set bereq.backend = synthbackend.from_string(db.get_string_reply()); } } sub vcl_backend_response { if(bereq.url == "/session") { set beresp.http.Content-Type = "application/json; charset=utf-8"; set beresp.ttl = 3600s; set beresp.http.vary = "x-session"; } } REDIS LUA CODE

Slide 56

Slide 56 text

GEBRUKER GET /session Cookie: PHPSESSID=7er3hjKal8u235c87u6ih0vz8Y HTTP/1.1 200 OK Content-Length: 31 Content-Type: application/json; charset=utf-8 X-Varnish: 163854 196622 Age: 27 {"username":"thijs"} VARNISH

Slide 57

Slide 57 text

JE ZIET ER VET MEE ✓ AJAX CALL ✓ LADEN VIA ESI EN VERWERKEN VIA LOKALE JAVASCRIPT ✓ EDGESTASH

Slide 58

Slide 58 text

{{ EDGESTASH }} VARNISH MODULE DIE MUSTACHE SYNTAX VERWERKT "ON THE EDGE"

Slide 59

Slide 59 text

vcl 4.1; import edgestash; backend default { .host = "1.1.1.1"; .port = "80"; } sub vcl_backend_response { if (bereq.url == "/session") { edgestash.index_json(); } else if (bereq.url == "/") { edgestash.parse_response(); } } sub vcl_deliver { if (req.url == "/" && edgestash.is_edgestash()) { edgestash.add_json_url("/session"); edgestash.execute(); } } EDGESTASH

Slide 60

Slide 60 text

EDGESTASH {"username":"Thijs"}
{{ username }}
Thijs

Slide 61

Slide 61 text

BITJE MEER FLEXIBILITEIT

Slide 62

Slide 62 text

Surrogate-Control: edgestash="EDGESTASH/2.1" Link: ; rel=edgestash

Slide 63

Slide 63 text

vcl 4.1; import edgestash; import std; backend default { .host = "1.1.1.1"; } sub vcl_recv { set req.http.Surrogate-Capability={"edgestash="EDGESTASH/2.1""}; } sub vcl_backend_response { if(beresp.http.Link) { std.collect(beresp.http.Link,","); } if(beresp.http.Link ~ "<([^>]+)>; rel=edgestash") { set beresp.http.x-edgestash-json-urls = regsuball(beresp.http.Link,"(?(?=<[^>]+>; rel=edgestash)<([^>]+)>; rel=edgestash|<([^>]+)>; rel=[a-z]+, )","\1"); } if(beresp.http.Surrogate-Control) { std.collect(beresp.http.Surrogate-Control); } if(beresp.http.Surrogate-Control ~ {".*="EDGESTASH/2\.[0-9]+".*"}) { edgestash.parse_response(); } } EDGESTASH

Slide 64

Slide 64 text

sub vcl_deliver { if(edgestash.is_edgestash() && resp.http.x-edgestash-json-urls) { edgestash.add_json_url_csv(resp.http.x-edgestash-json-urls); edgestash.execute(); } unset resp.http.Link; unset resp.http.x-edgestash-json-urls; unset resp.http.surrogate-control; } EDGESTASH

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

COMPOSER REQUIRE THIJSFERYN/EDGESTASH-TWIG-BUNDLE

Slide 67

Slide 67 text

{{ edgestash('username','/session') }}
{{ username | edgestash('username','/session') }}

Slide 68

Slide 68 text

{% if isEdgestash() %} //Edgestash-supported logic {% else %} //Regular Twig logic {% endif %}

Slide 69

Slide 69 text

{{ edgestash('#username', '/session') }} Welcome {{ edgestash('username') }} {{ edgestash('/username') }} {{ edgestash('^username') }} Welcome guest {{ edgestash('/username') }

Slide 70

Slide 70 text

    {{ edgestash('#.', '/users') }}
  • {{ edgestash('username') }}
  • {{ edgestash('/.') }}

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

VANAF $0.20/TER EURE + 14 DAGEN VOE NIET

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

HTTPS://FERYN.EU HTTPS://TWITTER.COM/THIJSFERYN HTTPS://INSTAGRAM.COM/THIJSFERYN