SlideShare une entreprise Scribd logo
1  sur  98
TAKING LARAVEL TO
THE EDGE WITH HTTP
CACHING & VARNISH
By Thijs Feryn
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 THE TECH
EVANGELIST
AT
9,000,000 WEBSITES


21% OF THE TOP 10K WEBSITES
I'M @THIJSFERYN
USER SERVER
REVERSE CACHING PROXY
USER PROXY SERVER
USER PROXY SERVER
THE EDGE
USER VARNISH SERVER
THE EDGE
BUILT FOR PERFORMANCE
THE POWER OF http://
Cache-Control: public, max-age=3600
Cache-Control: public, max-age=3600,
s-maxage=86400
Cache-Control: private, no-cache, no-store
Cache-Control: public, max-age=3600,
stale-while-revalidate=300
ORIGIN
VARNISH
GRACE
SERVE STALE
OBJECT
BACKGROUND
FETCH
Vary: Accept-Encoding, Accept-Language,
X-Forwarded-Proto
FOR YOUR EYES ONLY
NOT CACHED
VARNISH CONFIGURATION LANGUAGE
VCL CAPABILITIES
✓ REQUEST HANDLING


✓ REQUEST ROUTING


✓ RESPONSE MANIPULATION


✓ BACKEND SELECTION


✓ CONTROLLING THE CACHE


✓ DECISION-MAKING "ON THE EDGE"
vcl 4.1;


backend default {


.host = "127.0.0.1";


.port = "8080";


}


sub vcl_recv {


if(req.url ~ "^/admin(/.*|$)") {


return(pass);


}


unset req.http.Cookie;


}
I ANSWER TO #VARNISH


ON STACKOVERFLOW
THIJS@VARNISH-SOFTWARE.COM
Route::middleware('cache.headers:public;max_age=3600;etag')


->group(function () {


Route::get('/', function () {


return view('welcome');


});


});
HTTP/1.1 200 OK


Host: localhost:8000


Date: Mon, 25 Apr 2022 15:44:58 GMT


Connection: close


Content-Type: text/html; charset=UTF-8


Cache-Control: no-cache, private


Date: Mon, 25 Apr 2022 15:44:58 GMT


Set-Cookie: XSRF-
TOKEN=eyJpdiI6IjRvRndmL2pHcnFQamZBYnBxSFgyQWc9PSIsInZhbHVlIjoiM200RUU0N0h
Lc3YzN3Jaa21MQVdzaENDSEg4cEU4bG1TWk5pWlgwMjZyTko0cjVmUC9kYjhGVmtYem8xanBu
ZlFwT1ZJT3grR0RwWURoMGppTnh2K09kOGtHQmc4V3JYUmZrVyt2OERIdGNkZXloNHYzZWNDd
GJ3MGZRWk1oMkwiLCJtYWMiOiIxOTZlMTAwNTY2MTM5NmY2Zjg1OGIwNTQxNjUzZDlhZjQ2ZG
JlZDQzZjRjZTQ2MjBkNzQxYzc2MTc2NzJmY2QwIiwidGFnIjoiIn0%3D; expires=Mon,
25-Apr-2022 17:44:58 GMT; Max-Age=7200; path=/; samesite=lax


Set-Cookie:
laravel_session=eyJpdiI6Im1PcExWeWZkVkpDTFZpajR2TUtheWc9PSIsInZhbHVlIjoid
EpTRGpldjJYREFYOTBvaHI0RDlOeTI0NHM0bGh5cVE3QmlqMjBBZ3p1QWZRdC92ek9OUThaaU
tDQndjSi9adnBtQTRaWlpUVk9EQk80Z2drUjREQmJJdDBicGZ0bjNiTlNxckd4Mm5zNWpkM1B
mcTMzREtzMUsrMVBZeUdXd0kiLCJtYWMiOiIyNDY0NmU5ZTMzNTAxODM2Y2E4YzNhMDRhMWU4
NjBkMzRiYzg4MDc4MjQ1MDk3NDczZDI5ZjVlNzc3MzcxOWU3IiwidGFnIjoiIn0%3D;
expires=Mon, 25-Apr-2022 17:44:58 GMT; Max-Age=7200; path=/; httponly;
samesite=lax
Route::withoutMiddleware([StartSession::class,
ShareErrorsFromSession::class, VerifyCsrfToken::class])


->group(function () {


Route::middleware('cache.headers:public;max_age=3600;etag')


->group(function () {


Route::get('/', function () {


return view('welcome');


});


});


});
Route::withoutMiddleware([StartSession::class,
ShareErrorsFromSession::class, VerifyCsrfToken::class])


->group(function () {


Route::middleware('cache.headers:public;max_age=3600;etag')


->group(function () {


Route::get('/', function () {


return view('welcome');


});


});


});
HTTP/1.1 200 OK


Host: 127.0.0.1:8000


Date: Mon, 25 Apr 2022 15:34:44 GMT


Connection: close


Content-Type: text/html; charset=UTF-8


Cache-Control: max-age=3600, public


Date: Mon, 25 Apr 2022 15:34:44 GMT


ETag: "13b73edae8443990be1aa8f1a483bc27"
ONLY FETCH PAYLOAD THAT HAS CHANGED
HTTP/1.1 200 OK
OTHERWISE:


HTTP/1.1 304 Not Modified
VARNISH SUPPORTS


CONDITIONAL REQUESTS


FOR CLIENTS & BACKENDS
GET / HTTP/1.1


Host: 127.0.0.1:8000


If-None-Match: "13b73edae8443990be1aa8f1a483bc27"
HTTP/1.1 304 Not Modified


Host: 127.0.0.1:8000


Date: Mon, 25 Apr 2022 15:34:44 GMT


Connection: close


Content-Type: text/html; charset=UTF-8


Cache-Control: max-age=3600, public


Date: Mon, 25 Apr 2022 15:34:44 GMT


ETag: "13b73edae8443990be1aa8f1a483bc27"
QUICKLY
EARLY
<?php




namespace AppHttpMiddleware;


use IlluminateHttpRequest;


use IlluminateSupportFacadesCache;


use Closure;


use SymfonyComponentHttpFoundationResponse;


class NotModified


{


public function handle(Request $request, Closure $next)


{


if (!$request->isMethodCacheable()) {


return $next($request);


}


$etag = Cache::get('etag:'.md5($request->getUri()));


$cacheControl = Cache::get('etag-cache-control:'.md5(


$request->getUri()));


$response = new Response('',304,


['ETag' => $etag, 'Cache-Control' => $cacheControl]);


if($response->isNotModified(($request))) {


return $response;


}
$response = $next($request);


Cache::put('etag:'.md5($request->getUri()),


$response->headers->get('ETag'),10);


Cache::put('etag-cache-control:'.md5($request->getUri()),


$response->headers->get('Cache-Control'),10);


return $response;


}


}
NO CACHE
PLACEHOLDERS
SEPARATE
HTTP REQUEST
AJAX
EDGE-SIDE INCLUDES ESI
<esi:include src="/header" />
ESI
✓ PLACEHOLDER


✓ PARSED BY VARNISH


✓ OUTPUT IS A COMPOSITION OF BLOCKS


✓ STATE PER BLOCK


✓ TTL PER BLOCK
VARNISH Surrogate-Capability: key="ESI/1.0"
Surrogate-Control: content="ESI/1.0"
<esi:include src="/header" />
LARAVEL
Parse ESI placeholders
VARNISH
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;


}


}
COMPOSITION AT THE VIEW LAYER
Route::middleware('cache.headers:public;max_age=3600;etag')->group(function
() {


Route::get('/', function () {


return view('welcome');


});


});


Route::middleware('cache.headers:private')->group(function () {


Route::get('/header', function () {


return view("header");


});


});
Route::middleware('cache.headers:public;max_age=3600;etag')->group(function
() {


Route::get('/', function () {


return view('welcome');


});


});


Route::middleware('cache.headers:private')->group(function () {


Route::get('/header', function () {


return view("header");


});


});
<!DOCTYPE html>


<html>


<body>


@esi(/header)


<p>Welcome</p>


</body>


</html>
<!DOCTYPE html>


<html>


<body>


<esi:include src="/header" />


<p>Welcome</p>


</body>


</html>
<!DOCTYPE html>


<html>


<body>


<p>The current time is 21:07:53.</p>


<p>Welcome</p>


</body>


</html>
composer require myerscode/laravel-sub-request
<?php


namespace AppProviders;


use IlluminateSupportServiceProvider;


use IlluminateSupportFacadesBlade;


class EsiServiceProvider extends ServiceProvider


{


public function boot(): void


{


Blade::directive('esi', function (string $url) {


if(str_contains($this->app->request->headers->get('Surrogate-Capability'),
'ESI/1.0')) {


return "<?php echo '<esi:include src="$url" />'; ?>";


} else {


return "<?php echo subrequest('GET','$url')->getContent(); ?>";


}


});


}


}
@esi(/header)
@esi(/header)
@esi(/nav)
<p>Main content</p>
@esi(/footer)
<?php




namespace AppHttpMiddleware;


use IlluminateHttpRequest;


use Closure;


class Surrogate


{


public function handle(Request $request, Closure $next)


{


$response = $next($request);


if(str_contains($request->headers->get('Surrogate-Capability'), 'ESI/1.0')) {


$response->headers->set('Surrogate-Control', 'content="ESI/1.0"');


}


return $response;


}


}
HOW DO YOU IDENTIFY AN
OBJECT IN CACHE?
sub vcl_hash {


hash_data(req.url);


if (req.http.host) {


hash_data(req.http.host);


} else {


hash_data(server.ip);


}


return (lookup);


}
sub vcl_hash {


hash_data(req.url);


if (req.http.host) {


hash_data(req.http.host);


} else {


hash_data(server.ip);


}


return (lookup);


}
<p>{{ __('Welcome') }}</p>
<?php


return [


'locale' => 'en',


'fallback_locale' => 'en'


];
composer require orkhanahmadov/laravel-accept-language-middleware
HTTP/1.1 200 OK


Host: localhost


Content-Language: en
GET / HTTP/1.1


Host: localhost


Accept-Language: en
HTTP/1.1 200 OK


Host: localhost


Content-Language: en
GET / HTTP/1.1


Host: localhost


Accept-Language: nl
Vary: Accept-Language
HTTP/1.1 200 OK


Host: localhost


Content-Language: en
GET / HTTP/1.1


Host: localhost


Accept-Language: en
HTTP/1.1 200 OK


Host: localhost


Content-Language: nl
GET / HTTP/1.1


Host: localhost


Accept-Language: nl
<?php




namespace AppHttpMiddleware;


use IlluminateHttpRequest;


use Closure;


class Vary


{


public function handle(Request $request, Closure $next)


{


$response = $next($request);


$response->headers->set('Vary','Accept-Language');


return $response;


}


}
YOU CAN DO ALL OF THIS IN VCL TOO
sub vcl_recv {


set req.http.Surrogate-Capability = "key=ESI/1.0";


}


sub vcl_backend_response {


set beresp.ttl = 1h;


set beresp.grace = 2h;


set beresp.http.Vary = "Accept-Language,


Accept-Encoding, X-Forwarded-Proto";


if (beresp.http.Surrogate-Control ~ "ESI/1.0") {


unset beresp.http.Surrogate-Control;


set beresp.do_esi = true;


}


}
THIS IS JUST THE TIP OF THE ICEBERG
HTTPS://VARNISH-SOFTWARE.COM/DEVELOPERS
HTTPS://WWW.VARNISH-SOFTWARE.COM/
PRODUCTS/VARNISH-CLOUD/
Taking Laravel to the edge with HTTP caching and Varnish
Taking Laravel to the edge with HTTP caching and Varnish

Contenu connexe

Tendances

Cross platform mobile application architecture for enterprise
Cross platform mobile application architecture for enterpriseCross platform mobile application architecture for enterprise
Cross platform mobile application architecture for enterprise
Venkat Alagarsamy
 
Report file on Web technology(html5 and css3)
Report file on Web technology(html5 and css3)Report file on Web technology(html5 and css3)
Report file on Web technology(html5 and css3)
PCG Solution
 

Tendances (18)

Load Testing and JMeter Presentation
Load Testing and JMeter PresentationLoad Testing and JMeter Presentation
Load Testing and JMeter Presentation
 
Final Year Project Proposal | 2017
Final Year Project Proposal | 2017Final Year Project Proposal | 2017
Final Year Project Proposal | 2017
 
Performance testing with JMeter
Performance testing with JMeterPerformance testing with JMeter
Performance testing with JMeter
 
Lab report cover page
Lab report cover page Lab report cover page
Lab report cover page
 
Performance Testing using LoadRunner
Performance Testing using LoadRunnerPerformance Testing using LoadRunner
Performance Testing using LoadRunner
 
Loadrunner vs Jmeter
Loadrunner vs JmeterLoadrunner vs Jmeter
Loadrunner vs Jmeter
 
Java Servlets Tutorial | Introduction to Servlets | Java Certification Traini...
Java Servlets Tutorial | Introduction to Servlets | Java Certification Traini...Java Servlets Tutorial | Introduction to Servlets | Java Certification Traini...
Java Servlets Tutorial | Introduction to Servlets | Java Certification Traini...
 
Performance Testing With Jmeter
Performance Testing With JmeterPerformance Testing With Jmeter
Performance Testing With Jmeter
 
Pairwise testing - Strategic test case design
Pairwise testing - Strategic test case designPairwise testing - Strategic test case design
Pairwise testing - Strategic test case design
 
JMeter
JMeterJMeter
JMeter
 
Introduction to Performance Testing & Loadrunner
Introduction to Performance Testing & LoadrunnerIntroduction to Performance Testing & Loadrunner
Introduction to Performance Testing & Loadrunner
 
Test automation principles, terminologies and implementations
Test automation principles, terminologies and implementationsTest automation principles, terminologies and implementations
Test automation principles, terminologies and implementations
 
Cross platform mobile application architecture for enterprise
Cross platform mobile application architecture for enterpriseCross platform mobile application architecture for enterprise
Cross platform mobile application architecture for enterprise
 
JMeter vs LoadRunner | Edureka
JMeter vs LoadRunner | EdurekaJMeter vs LoadRunner | Edureka
JMeter vs LoadRunner | Edureka
 
Static analysis sol101
Static analysis sol101Static analysis sol101
Static analysis sol101
 
J Meter Intro
J Meter IntroJ Meter Intro
J Meter Intro
 
Report file on Web technology(html5 and css3)
Report file on Web technology(html5 and css3)Report file on Web technology(html5 and css3)
Report file on Web technology(html5 and css3)
 
QA. Load Testing
QA. Load TestingQA. Load Testing
QA. Load Testing
 

Similaire à Taking Laravel to the edge with HTTP caching and Varnish

Zendcon 2007 Api Design
Zendcon 2007 Api DesignZendcon 2007 Api Design
Zendcon 2007 Api Design
unodelostrece
 

Similaire à Taking Laravel to the edge with HTTP caching and Varnish (20)

Developing cacheable backend applications - Appdevcon 2019
Developing cacheable backend applications - Appdevcon 2019Developing cacheable backend applications - Appdevcon 2019
Developing cacheable backend applications - Appdevcon 2019
 
Caching the uncacheable with Varnish - DevDays 2021
Caching the uncacheable with Varnish - DevDays 2021Caching the uncacheable with Varnish - DevDays 2021
Caching the uncacheable with Varnish - DevDays 2021
 
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...
 
Ajax basics
Ajax basicsAjax basics
Ajax basics
 
Caching & validating
Caching & validatingCaching & validating
Caching & validating
 
8 Minutes On Rack
8 Minutes On Rack8 Minutes On Rack
8 Minutes On Rack
 
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
 
Caching Strategies
Caching StrategiesCaching Strategies
Caching Strategies
 
Zendcon 2007 Api Design
Zendcon 2007 Api DesignZendcon 2007 Api Design
Zendcon 2007 Api Design
 
HTTP Caching and PHP
HTTP Caching and PHPHTTP Caching and PHP
HTTP Caching and PHP
 
Top 10 F5 iRules to migrate to a modern load balancing platform
Top 10 F5 iRules to migrate to a modern load balancing platformTop 10 F5 iRules to migrate to a modern load balancing platform
Top 10 F5 iRules to migrate to a modern load balancing platform
 
Caching and invalidating with managed store
Caching and invalidating with managed storeCaching and invalidating with managed store
Caching and invalidating with managed store
 
Caching and invalidating with managed store
Caching and invalidating with managed storeCaching and invalidating with managed store
Caching and invalidating with managed store
 
Caching and invalidating with managed store
Caching and invalidating with managed storeCaching and invalidating with managed store
Caching and invalidating with managed store
 
Caching and invalidating with managed store
Caching and invalidating with managed storeCaching and invalidating with managed store
Caching and invalidating with managed store
 
Caching and invalidating with managed store
Caching and invalidating with managed storeCaching and invalidating with managed store
Caching and invalidating with managed store
 
Caching invalidating with managed store
Caching invalidating with managed storeCaching invalidating with managed store
Caching invalidating with managed store
 
Caching and invalidating with managed store
Caching and invalidating with managed storeCaching and invalidating with managed store
Caching and invalidating with managed store
 
Caching and invalidating with managed store
Caching and invalidating with managed storeCaching and invalidating with managed store
Caching and invalidating with managed store
 

Plus de Thijs Feryn

Plus de Thijs Feryn (14)

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
 
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
 
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
 
Build your own CDN with Varnish - Confoo 2022
Build your own CDN with Varnish - Confoo 2022Build your own CDN with Varnish - Confoo 2022
Build your own CDN with Varnish - Confoo 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
 

Dernier

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

Dernier (20)

Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
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...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
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
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
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
 
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
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 

Taking Laravel to the edge with HTTP caching and Varnish