SlideShare uma empresa Scribd logo
1 de 82
Baixar para ler offline
CACHING THE UNCACHEABLE
BY THIJS FERYN
WITH VARNISH
Slow websites
SUCK
WEB PERFORMANCE IS AN
ESSENTIAL PART OF THE
USER EXPERIENCE
SLOW~DOWN
THROWING


SERVERS


ATTHEPROBLEM
MO' MONEY


MO' SERVERS


MO' PROBLEMS
IDENTIFY SLOWEST PARTS
OPTIMIZE
AFTER A WHILE YOU HIT THE LIMITS
CACHE
HI, I'M THIJS
I'M AN
EVANGELIST
AT
4,800,000 WEBSITES


19% OF THE TOP 10K WEBSITES
I'M @THIJSFERYN
Thijs Feryn
BY EXAMPLE
VARNISH 6
A practical guide to web acceleration and content
delivery with Varnish 6 technology
NORMALLY
USER SERVER
WITH REVERSE CACHING PROXY
USER VARNISH SERVER
CONTROLLING THE CACHE WITH HTTP
Expires: Sat, 09 Sep 2017 14:30:00 GMT


Cache-control: public, max-age=3600, s-maxage=86400


Cache-control: stale-while-revalidate=100


Cache-control: private, no-cache, no-store


Surrogate-Control: max-age=3600+600


Surrogate-Control: content="ESI/1.0"


Vary: Accept-Language
STATE
STATE


~


USER SPECIFIC DATA
COOKIES
AUTH
HEADERS
FOR YOUR EYES ONLY
NOT CACHED
VARNISH HAS AN EXTREMELY


CAUTIOUS STANDARD BEHAVIOR
EXTENDED THROUGH THE


VARNISH CONFIGURATION LANGUAGE
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 ~ "^s*$")
{

unset req.http.Cookie
;

}

}

}
Only
keep certain
cookies
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(hash)
;

}

}

sub vcl_hash
{

hash_data(regsub( req.http.Cookie, "^.*language=([^;]*);*.*$", "1" ))
;

}

Cookie
cache
variation
vcl 4.1
;

import cookie
;

sub vcl_recv
{

cookie.parse(req.http.cookie)
;

cookie.keep("language")
;

set req.http.cookie = cookie.get_string()
;

}

sub vcl_hash
{

hash_data(cookie.get("language"))
;

}
VMOD_COOKIE
CONTAINS
USER
INFORMATION
NO CACHE
PLACEHOLDERS
SEPARATE
HTTP REQUEST
AJAX
AJAX CALL
✓CLIENT-SIDE


✓COMMON KNOWLEDGE


✓PARALLEL PROCESSING


✓GRACEFUL
DEGRADATION


-PROCESSED BY THE
BROWSER


-EXTRA ROUNDTRIPS


-SOMEWHAT SLOWER
AJAX
EDGE-SIDE INCLUDES ESI
<esi:include src="/header" />
ESI
SUBREQUEST
ESI
✓ PLACEHOLDER


✓ PARSED BY VARNISH


✓ OUTPUT IS A COMPOSITION OF BLOCKS


✓ STATE PER BLOCK


✓ TTL PER BLOCK
sub vcl_backend_fetch
{

set bereq.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
;

}

}
✓SERVER-SIDE


✓STANDARDIZED


✓PROCESSED ON THE
“EDGE”, NOT IN THE
BROWSER


✓GENERALLY FASTER


-SEQUENTIAL*


-ONE FAILS, ALL FAIL


-LIMITED
IMPLEMENTATION IN
VARNISH


-NOT THAT COMMON
ESI PARALLEL IN
ENTERPRISE
CURRENT STATUS
✓ REMOVE UNWANTED COOKIES


✓ LEVERAGE COOKIES FOR CACHE VARIATIONS


✓ USE PLACEHOLDERS TO LOAD STATEFUL CONTENT
TO
INCREASE HIT
RATE
NON-CACHEABLE ROUTES WILL STILL BE A
TARGET FOR LOAD/LATENCY
NOT JUST A CACHE
NOT JUST "TAKE IT OR LEAVE IT"
AN HTTP


LOGIC BOX
DECISION MAKING ON THE EDGE
sub vcl_recv {


return(synth(200,"Synthetic output"));


}


SYNTHETIC HTTP
<!DOCTYPE html>


<html>


<head>


<title>200 Synthetic output</title>


</head>


<body>


<h1>Error 200 Synthetic output</h1>


<p>Synthetic output</p>


<h3>Guru Meditation:</h3>


<p>XID: 32770</p>


<hr>


<p>Varnish cache server</p>


</body>


</html>
SYNTHETIC HTTP
<!DOCTYPE html>


<html>


<head>


<title>Error 503 Backend fetch failed</title>


</head>


<body>


<h1>Error 503 Backend fetch failed</h1>


<p>Backend fetch failed</p>


<h3>Guru Meditation:</h3>


<p>XID: 32804</p>


<hr>


<p>Varnish cache server</p>


</body>


</html>
SYNTHETIC HTTP
WHEN
ERRORS
OCCUR
USER
GET /api/session


Cookie: sessionId=7er3hjKal8u235c87u6ih0vz8Y


HTTP/1.1 200 OK


Content-Length: 31


Content-Type: application/json


X-Varnish: 163854 196622


Age: 27


{"username":"thijs"}
VARNISH
OUTPUT
GENERATED BY
VARNISH
vcl 4.1;


import redis;


import synthbackend;


import ykey;


import format;


backend default {


.host = "backend.example.com";


}


sub vcl_init {


new redis_client = redis.db(


location="redis:6379",


shared_connections=false,


max_connections=1);


}


sub vcl_recv {


if(req.url == "/api/session") {


set req.http.sessionId = regsub(req.http.Cookie,"^.*;?s*sessionIds*=s*([0-9a-zA-z]+)
s*;?.*","1");


return(hash);


}


}
SYNTHETIC HTTP
sub vcl_hash {


hash_data(req.http.sessionId);


}


sub vcl_backend_fetch {


if(bereq.url == "/api/session") {


redis_client.command("HGET");


redis_client.push(bereq.http.sessionId);


redis_client.push("username");


redis_client.execute();


if(redis_client.reply_is_nil() || redis_client.reply_is_error()) {


set bereq.backend = synthbackend.from_string("{}");


} else {


set bereq.backend = synthbackend.from_string(


format.quick({"{ "username":"%s" }"}, redis_client.get_string_reply())


);


}


} else {


set bereq.backend = default;


}


}


sub vcl_backend_response {


if(bereq.url == "/api/session") {


set beresp.http.Content-Type = "application/json";


set beresp.ttl = 3h;


}


}
USER
GET /api/session


Cookie: sessionId=7er3hjKal8u235c87u6ih0vz8Y


HTTP/1.1 200 OK


Content-Length: 31


Content-Type: application/json


X-Varnish: 163854 196622


Age: 27


{"username":"thijs"}
VARNISH
WHAT DO YOU DO WITH IT?
✓ AJAX CALL


✓ LOAD VIA ESI AND PROCESS VIA LOCAL JAVASCRIPT


✓ EDGESTASH
{{ EDGESTASH }}
VARNISH
MODULE FOR MUSTACHE
PROCESSING ON THE
EDGE
EDGESTASH
{"username":"Thijs"}
<div>{{ username }}</div>
<div>Thijs</div>
vcl 4.1;


import edgestash;


backend default


{


.host = "backend.example.com";


}


sub vcl_backend_response {


if (bereq.url == "/api/session") {


edgestash.index_json();


} else if (bereq.url == "/") {


edgestash.parse_response();


}


}


sub vcl_deliver {


if (req.url == "/" && edgestash.is_edgestash()) {


edgestash.add_json_url("/api/session");


edgestash.execute();


}


}


EDGESTASH
EDGESTASH
PLACEHOLDER
SYNTHETIC
JSON
MORE FLEXIBILITY
Surrogate-Control: edgestash="EDGESTASH/2.1"


Link: </api/session>; rel=edgestash
vcl 4.1;


import edgestash;


import std;


backend default


{


.host = "backend.example.com";


}


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
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
I DON'T WANT TO TOUCH THE CODE
vcl 4.1;


import xbody;


import edgestash;


sub vcl_backend_response {


if(bereq.url == "/") {


xbody.regsub({"(<div id="username" [^>]+>)(w*)(</div>)"},


{"1{{username}}3"});


edgestash.parse_response();


}


}
XBODY
<div id="username">{{username}}</div>
<div id="username">Thijs</div>
OFFICIAL VARNISH ENTEPRISE IMAGES


ON CLOUD MARKETPLACES
FREE TRIAL + DEVELOPER EDITION
OFFICIAL VARNISH CACHE IMAGES


ON CLOUD MARKETPLACES
FREE OF CHARGE
VARNISH IS CONTENT
DELIVERY SOFTWARE
MORE EDGE DECISION MAKING
import deviceatlas;


sub vcl_recv {


	
set req.http.MobilePhone = "no";


	
if (deviceatlas.lookup_int(req.http.User-Agent, "isMobilePhone")) {


	
	
set req.http.MobilePhone = "yes";


	
}


}


Device
detection
vcl 4.0;


import mmdb;


backend default { .host = "192.0.2.11"; .port = "8080"; }


# create a database object


sub vcl_init {


	
new geodb = mmdb.init("/path/to/db");


}


sub vcl_recv {


	
# retrieve the name of the request's origin


	
set req.http.Country-Name = geodb.country_name(client.ip);


	
# if the country doesn't come from Germany or Belgium, deny access


	
if (req.http.Country-Name != "Germany" ||


	
	
req.http.Country-Name != "Belgium") {


	
	
return (synth(403, "Sorry, only available in Germany and Belgium"));


	
}


}


Geo
blocking
vcl 4.0;


import http;


backend default {


.host = "origin";


.port = "80";


}


sub vcl_recv {


set req.http.X-prefetch = http.varnish_url("/");


}


sub vcl_backend_response {


if (beresp.http.Link ~ "<.+>.*(prefetch|next)") {


set bereq.http.X-link = regsub(beresp.http.Link, "^.*<([^>]*)>.*$", "1");


set bereq.http.X-prefetch = regsub(bereq.http.X-prefetch, "/$", bereq.http.X-link);




http.init(0);


http.req_copy_headers(0);


http.req_set_url(0, bereq.http.X-prefetch);


http.req_send_and_finish(0);


}


}
Pre-fetching
HTTPS://FERYN.EU


HTTPS://TWITTER.COM/THIJSFERYN


HTTPS://INSTAGRAM.COM/THIJSFERYN

Mais conteúdo relacionado

Mais procurados

Site Performance - From Pinto to Ferrari
Site Performance - From Pinto to FerrariSite Performance - From Pinto to Ferrari
Site Performance - From Pinto to Ferrari
Joseph Scott
 

Mais procurados (19)

(WEB304) Running and Scaling Magento on AWS | AWS re:Invent 2014
(WEB304) Running and Scaling Magento on AWS | AWS re:Invent 2014(WEB304) Running and Scaling Magento on AWS | AWS re:Invent 2014
(WEB304) Running and Scaling Magento on AWS | AWS re:Invent 2014
 
cache concepts and varnish-cache
cache concepts and varnish-cachecache concepts and varnish-cache
cache concepts and varnish-cache
 
ReplacingSquidWithATS
ReplacingSquidWithATSReplacingSquidWithATS
ReplacingSquidWithATS
 
HTTP caching with Varnish
HTTP caching with VarnishHTTP caching with Varnish
HTTP caching with Varnish
 
Care and feeding notes
Care and feeding notesCare and feeding notes
Care and feeding notes
 
Advanced Web Hosting
Advanced Web HostingAdvanced Web Hosting
Advanced Web Hosting
 
Less and faster – Cache tips for WordPress developers
Less and faster – Cache tips for WordPress developersLess and faster – Cache tips for WordPress developers
Less and faster – Cache tips for WordPress developers
 
PHP conference Berlin 2015: running PHP on Nginx
PHP conference Berlin 2015: running PHP on NginxPHP conference Berlin 2015: running PHP on Nginx
PHP conference Berlin 2015: running PHP on Nginx
 
2015 ZendCon - Do you queue
2015 ZendCon - Do you queue2015 ZendCon - Do you queue
2015 ZendCon - Do you queue
 
HTTP cache @ PUG Rome 03-29-2011
HTTP cache @ PUG Rome 03-29-2011HTTP cache @ PUG Rome 03-29-2011
HTTP cache @ PUG Rome 03-29-2011
 
Advanced HTTP Caching
Advanced HTTP CachingAdvanced HTTP Caching
Advanced HTTP Caching
 
Running php on nginx
Running php on nginxRunning php on nginx
Running php on nginx
 
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
Handling 10k requests per second with Symfony and Varnish - SymfonyCon Berlin...
 
Site Performance - From Pinto to Ferrari
Site Performance - From Pinto to FerrariSite Performance - From Pinto to Ferrari
Site Performance - From Pinto to Ferrari
 
Altitude SF 2017: Debugging Fastly VCL 101
Altitude SF 2017: Debugging Fastly VCL 101Altitude SF 2017: Debugging Fastly VCL 101
Altitude SF 2017: Debugging Fastly VCL 101
 
HTTP Acceleration with Varnish
HTTP Acceleration with VarnishHTTP Acceleration with Varnish
HTTP Acceleration with Varnish
 
Performance Tuning - MuraCon 2012
Performance Tuning - MuraCon 2012Performance Tuning - MuraCon 2012
Performance Tuning - MuraCon 2012
 
Oscon 2011 - ATS
Oscon 2011 - ATSOscon 2011 - ATS
Oscon 2011 - ATS
 
Scalable talk notes
Scalable talk notesScalable talk notes
Scalable talk notes
 

Semelhante a Caching the uncacheable with Varnish - DevDays 2021

June8 presentation
June8 presentationJune8 presentation
June8 presentation
nicobn
 
Html5 : stockage local & synchronisation
Html5 : stockage local & synchronisationHtml5 : stockage local & synchronisation
Html5 : stockage local & synchronisation
goldoraf
 
HTML5: huh, what is it good for?
HTML5: huh, what is it good for?HTML5: huh, what is it good for?
HTML5: huh, what is it good for?
Remy Sharp
 

Semelhante a Caching the uncacheable with Varnish - DevDays 2021 (20)

Developing cacheable backend applications - Appdevcon 2019
Developing cacheable backend applications - Appdevcon 2019Developing cacheable backend applications - Appdevcon 2019
Developing cacheable backend applications - Appdevcon 2019
 
Taking Laravel to the edge with HTTP caching and Varnish
Taking Laravel to the edge with HTTP caching and VarnishTaking Laravel to the edge with HTTP caching and Varnish
Taking Laravel to the edge with HTTP caching and Varnish
 
Going crazy with Varnish and Symfony
Going crazy with Varnish and SymfonyGoing crazy with Varnish and Symfony
Going crazy with Varnish and Symfony
 
Lightning fast with Varnish
Lightning fast with VarnishLightning fast with Varnish
Lightning fast with Varnish
 
June8 presentation
June8 presentationJune8 presentation
June8 presentation
 
Nginx + PHP
Nginx + PHPNginx + PHP
Nginx + PHP
 
NGINX Can Do That? Test Drive Your Config File!
NGINX Can Do That? Test Drive Your Config File!NGINX Can Do That? Test Drive Your Config File!
NGINX Can Do That? Test Drive Your Config File!
 
Velocity EU 2014 — Offline-first web apps
Velocity EU 2014 — Offline-first web appsVelocity EU 2014 — Offline-first web apps
Velocity EU 2014 — Offline-first web apps
 
Introduction to Chef
Introduction to ChefIntroduction to Chef
Introduction to Chef
 
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술
 
Thijs Feryn - Leverage HTTP to deliver cacheable websites - Codemotion Berlin...
Thijs Feryn - Leverage HTTP to deliver cacheable websites - Codemotion Berlin...Thijs Feryn - Leverage HTTP to deliver cacheable websites - Codemotion Berlin...
Thijs Feryn - Leverage HTTP to deliver cacheable websites - Codemotion Berlin...
 
Thijs Feryn - Leverage HTTP to deliver cacheable websites - Codemotion Berlin...
Thijs Feryn - Leverage HTTP to deliver cacheable websites - Codemotion Berlin...Thijs Feryn - Leverage HTTP to deliver cacheable websites - Codemotion Berlin...
Thijs Feryn - Leverage HTTP to deliver cacheable websites - Codemotion Berlin...
 
Serverless Ballerina
Serverless BallerinaServerless Ballerina
Serverless Ballerina
 
Java clients for elasticsearch
Java clients for elasticsearchJava clients for elasticsearch
Java clients for elasticsearch
 
HTML5 tutorial: canvas, offfline & sockets
HTML5 tutorial: canvas, offfline & socketsHTML5 tutorial: canvas, offfline & sockets
HTML5 tutorial: canvas, offfline & sockets
 
Core web vitals meten om je site sneller te maken - Combell Partner Day 2023
Core web vitals meten om je site sneller te maken - Combell Partner Day 2023Core web vitals meten om je site sneller te maken - Combell Partner Day 2023
Core web vitals meten om je site sneller te maken - Combell Partner Day 2023
 
Ajax basics
Ajax basicsAjax basics
Ajax basics
 
Html5 : stockage local & synchronisation
Html5 : stockage local & synchronisationHtml5 : stockage local & synchronisation
Html5 : stockage local & synchronisation
 
PostgreSQL High-Availability and Geographic Locality using consul
PostgreSQL High-Availability and Geographic Locality using consulPostgreSQL High-Availability and Geographic Locality using consul
PostgreSQL High-Availability and Geographic Locality using consul
 
HTML5: huh, what is it good for?
HTML5: huh, what is it good for?HTML5: huh, what is it good for?
HTML5: huh, what is it good for?
 

Mais de Thijs Feryn

Mais de Thijs Feryn (13)

10 things that helped me advance my career - PHP UK Conference 2024
10 things that helped me advance my career - PHP UK Conference 202410 things that helped me advance my career - PHP UK Conference 2024
10 things that helped me advance my career - PHP UK Conference 2024
 
Distributed load testing with K6 - NDC London 2024
Distributed load testing with K6 - NDC London 2024Distributed load testing with K6 - NDC London 2024
Distributed load testing with K6 - NDC London 2024
 
HTTP headers that make your website go faster - devs.gent November 2023
HTTP headers that make your website go faster - devs.gent November 2023HTTP headers that make your website go faster - devs.gent November 2023
HTTP headers that make your website go faster - devs.gent November 2023
 
Living on the edge - EBU Horizons 2023
Living on the edge - EBU Horizons 2023Living on the edge - EBU Horizons 2023
Living on the edge - EBU Horizons 2023
 
Distributed Load Testing with k6 - DevOps Barcelona
Distributed Load Testing with k6 - DevOps BarcelonaDistributed Load Testing with k6 - DevOps Barcelona
Distributed Load Testing with k6 - DevOps Barcelona
 
HTTP headers that make your website go faster
HTTP headers that make your website go fasterHTTP headers that make your website go faster
HTTP headers that make your website go faster
 
HTTP headers that will make your website go faster
HTTP headers that will make your website go fasterHTTP headers that will make your website go faster
HTTP headers that will make your website go faster
 
Distributed load testing with k6
Distributed load testing with k6Distributed load testing with k6
Distributed load testing with k6
 
HTTP logging met Varnishlog - PHPWVL 2022
HTTP logging met Varnishlog - PHPWVL 2022HTTP logging met Varnishlog - PHPWVL 2022
HTTP logging met Varnishlog - PHPWVL 2022
 
How Cloud addresses the needs of todays internet - Korazon 2018
How Cloud addresses the needs of todays internet - Korazon 2018How Cloud addresses the needs of todays internet - Korazon 2018
How Cloud addresses the needs of todays internet - Korazon 2018
 
Developing cacheable PHP applications - PHPLimburgBE 2018
Developing cacheable PHP applications - PHPLimburgBE 2018Developing cacheable PHP applications - PHPLimburgBE 2018
Developing cacheable PHP applications - PHPLimburgBE 2018
 
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
 
Developing cacheable PHP applications - Confoo 2018
Developing cacheable PHP applications - Confoo 2018Developing cacheable PHP applications - Confoo 2018
Developing cacheable PHP applications - Confoo 2018
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Último (20)

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 

Caching the uncacheable with Varnish - DevDays 2021