SlideShare a Scribd company logo
Solving anything in VCL
Andrew Betts, Financial Times
Who is this guy?
1. Helped build the original HTML5 web
app for the FT
2. Created our Origami component
system
3. Ran FT Labs for 3 years
4. Now working with Nikkei to rebuild
nikkei.com
5. Also W3C Technical Architecture
Group
6. Live in Tokyo, Japan
2
Pic of me.
Nikkei
1. Largest business
newspaper in Japan
2. Globally better known for
the Nikkei 225 stock
index
3. Around 3 million readers
4

Recommended for you

JSONB introduction and comparison with other frameworks
JSONB introduction and comparison with other frameworksJSONB introduction and comparison with other frameworks
JSONB introduction and comparison with other frameworks

This document discusses JSON Binding (JSON-B), including what it is, the JSR specification, default mappings, and comparisons to other frameworks. JSON-B is a standard for converting Java objects to and from JSON documents. It has a default mapping that handles basic types, dates, classes and collections, but also allows for customized mappings. The specification is hosted on Java.net and has a reference implementation.

javajacksongson
Hacking Android OS
Hacking Android OSHacking Android OS
Hacking Android OS

Lecture note for Chiang Mai University (Thailand) Student by Click Connect Team about how to compile AOSP and create custom ROM for Android devices.

nexusandroidcustom rom
Mobile application development React Native - Tidepool Labs
Mobile application development React Native - Tidepool LabsMobile application development React Native - Tidepool Labs
Mobile application development React Native - Tidepool Labs

The document discusses mobile application development and React Native. It provides an overview of the mobile app development process, from initiation to support. It then focuses on React Native, describing it as a JavaScript framework for building native mobile apps for iOS and Android using similar code bases. Key benefits highlighted are building cross-platform mobile apps using a known technology while still providing native experiences.

react nativeexportmobile application development
5
6
7
8

Recommended for you

Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications
Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud ApplicationsJakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications
Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications

**Jakarta EE 10** is packed with new features for simple development of modern, lightweight enterprise Java applications for the Cloud. The new Jakarta EE Core Profile enables developers to develop microservices with Jakarta EE technologies with runtimes smaller than ever. Jakarta EE Core Profile even makes it possible to compile Jakarta EE applications to native images to reduce the footprint even further. In this session, we will explore the new features of Jakarta EE 10 in an interactive way packed with live code demos. Among the features we will go through are the new reflection-free programming model introduced in *CDI 4.0 Lite* and the new Java SE Bootstrap API in *Jakarta RESTful Web Services 3.1*. But there will be more, so make sure you join this session to get it all! We will even take a peek into the looking glass to see what we can expect from **Jakarta EE 11**.

jakarta eecloud native javajava
SQLite in Flutter.pptx
SQLite in Flutter.pptxSQLite in Flutter.pptx
SQLite in Flutter.pptx

Basics of Sqlite with the procedure to create, read, update and delete. Also to open the database and close too.

mysqlsqlitenosql
La Duck Conf - Les fakes news du low-code
La Duck Conf - Les fakes news du low-code La Duck Conf - Les fakes news du low-code
La Duck Conf - Les fakes news du low-code

Talk de Alain Faure & Sylvain Fagnent L’offre low-code se répand accompagnée de son lot de fake news. Fake news positives, issues de promesses excessives du marketing auxquelles font écho des fake news négatives provenant de préjugés de développeurs ayant une méconnaissance des évolutions de ces outils. Rejoignez-nous pour distinguer l’ivraie du bon grain ! Retrouvez le compte-rendu écrit ici : Retrouvez la vidéo de la conférence ici : https://bit.ly/3uQuzM3

low codecodefake news
Coding on the edge
9
Benefits of edge code
10
1. Smarter routing
2. Faster authentication
3. Bandwidth management
4. Higher cache hit ratio
Edge side includes
11
<esi:include src="http://example.com/1.html"
alt="http://bak.example.com/2.html" onerror="continue"/>
index.html
my-news.html
Cache-control: max-age=86400
Cache-control: private
Server
The VCL way
1. Request and response bodies are opaque
2. Everything happens in metadata
3. Very restricted: No loops or variables
4. Extensible: some useful Fastly extensions include geo-ip and crypto
5. Incredibly powerful when used creatively
12

Recommended for you

Unity 3D game engine seminar
Unity 3D game engine  seminarUnity 3D game engine  seminar
Unity 3D game engine seminar

Unity is a cross-platform game engine developed by Unity Technologies,[4] first announced and released in June 2005 at Apple Inc.'s Worldwide Developers Conference as an OS X-exclusive game engine. As of 2018, the engine has been extended to support 27 platforms.[5] The engine can be used to create both three-dimensional and two-dimensional games as well as simulations for desktops and laptops, home consoles, smart TVs, and mobile devices. Several major versions of Unity have been released since its launch, with the latest stable version being Unity 2018.2.2, released on August 10, 2018.[6] Unity gives users the ability to create games in both 2D and 3D, and the engine offers a primary scripting API in C#, for both the Unity editor in the form of plugins, and games themselves, as well as drag and drop functionality. Prior to C# being the primary programming language used for the engine, it previously supported Boo, which was removed in the Unity 5[7] release, and a version of JavaScript called UnityScript, which was deprecated in August 2017 after the release of Unity 2017.1 in favor of C#.[8] The engine has support for the following graphics APIs: Direct3D on Windows and Xbox One; OpenGL on Linux, macOS, and Windows; OpenGL ES on Android and iOS; WebGL on the web; and proprietary APIs on the video game consoles. Additionally, Unity supports the low-level APIs Metal on iOS and macOS and Vulkan on Android, Linux, and Windows, as well as Direct3D 12 on Windows and Xbox One.

video gamesdesign thinking3dgames
CONTINUOUS INTEGRATION WITH JENKINS AND GIT
CONTINUOUS INTEGRATION WITH JENKINS AND GITCONTINUOUS INTEGRATION WITH JENKINS AND GIT
CONTINUOUS INTEGRATION WITH JENKINS AND GIT

The document discusses continuous integration using Jenkins and Git. Continuous integration involves integrating code changes frequently from developers on a project to avoid integration problems late in a project. Jenkins is a free and open source continuous integration server that can be used with version control systems like Git to automatically build code, run tests, and generate reports each time changes are committed to the repository. Setting up continuous integration involves installing Jenkins, configuring a Git repository, and configuring Jenkins to clone the repository, build the code, run tests, and generate reports on each change notification from Git.

cigitjenkins
Introduction to Generative Art with Processing
Introduction to Generative Art with ProcessingIntroduction to Generative Art with Processing
Introduction to Generative Art with Processing

This document provides an introduction to generative art using the Processing programming language. It discusses what Processing is, how to get started with it, and resources for learning Processing like books and websites. It then demonstrates how to create simple generative art by drawing shapes and using loops to manipulate the coordinate space in Processing code. The document shows the user how to set up their first Processing sketch and provides examples of generating simple patterns through nested for loops.

codingprocessinggenerative art
SOA Routing
Send requests to multiple
microservice backends
This is great if...
You have a microservice architecture
Many backends, one domain
You add/remove services regularly
1
SOA Routing in VCL
14
Front page
Article page
Timeline
Content API
Choose a backend
based on a path match
of the request URL
/article/123
SOA Routing in VCL
15
[
{
name,
paths,
host,
useSsl,
}, …
]
{{#each backends}}
backend {{name}} {
.port = "{{p}}";
.host = "{{h}}";
}
{{/each}}
let vclContent =
vclTemplate(data);
fs.writeFileSync(
vclFilePath,
vclContent,
'UTF-8'
);
services.json
Defines all the backends
and paths that they
control.
routing.vcl.handlebars
VCL template with
Handlebars placeholders
for backends & routing
build.js
Task script to merge
service data into VCL
template
SOA Routing: key tools and techniques
● Choose a backend:
set req.backend = {{backendName}};
● Match a route pattern:
if (req.url ~ "{{pattern}}")
● Remember to set a Host header:
set req.http.Host = "{{backendhost}}";
● Upload to Fastly using FT Fastly tools
○ https://github.com/Financial-Times/fastly-tools
16

Recommended for you

Pimp My Confluence Plugin - AtlasCamp 2011
Pimp My Confluence Plugin - AtlasCamp 2011Pimp My Confluence Plugin - AtlasCamp 2011
Pimp My Confluence Plugin - AtlasCamp 2011

How do you enable a richer experience for users of your plugin? With the impending release of Confluence 4.0 we will show you not only how to make your plugins Confluence 4.0 compatible but how to dress them up to take advantage of all the new plugin points Confluence 4.0 has to offer, allowing you to give your users a richer editing experience. Ryan Thomas, Confluence Developer

JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...

The document summarizes a presentation about when to use the RedisJSON data type. It discusses how Coupang uses Redis extensively for their ad platform. It then compares the performance and memory usage of storing JSON data as strings, hashes, or using the RedisJSON data type. Benchmark results show RedisJSON can provide better performance for retrieving and updating JSON fields compared to strings and hashes, though it uses more memory. The document recommends using RedisJSON for smaller JSON payloads after benchmarking and memory monitoring.

jsondocument storeredis
Introduction to Game Development
Introduction to Game DevelopmentIntroduction to Game Development
Introduction to Game Development

* Introduction * Define "video game" * Video Game Industry Overview * Aspects of Game Development * Game Development Community * Careers Available in Game Development * Testimonies * Options for Developing Required Skillset * Other Avenues for Career Development

game developmentvideo gamecomputer game
service-registry.json
17
[
{
"name": "front-page",
"paths": [
"/(?qs)",
"/.resources/front/(**)(?qs)"
],
"hosts": [ "my-backend.ap-northeast-1.elasticbeanstalk.com" ]
},
{
"name": "article-page",
...
}
]
Common regex patterns simplified
into shortcuts
routing.vcl.handlebars
18
{{#each backends}}
backend {{name}} {
.port = "{{port}}";
.host = "{{host}}";
.ssl = {{use_ssl}};
.probe = {
.request = "GET / HTTP/1.1" "Host: {{host}}"
"Connection: close";
}
}
{{/each}}
sub vcl_recv {
{{#each routes}}
if (req.url ~ "{{pattern}}") {
set req.backend = {{backend}};
{{#if target}}
set req.url = regsub(req.url,
"{{pattern}}", "{{target}}");
{{/if}}
{{!-- Fastly doesn't support the host_header
property in backend definitions --}}
set req.http.Host = "{{backendhost}}";
}
{{/each}}
return(lookup);
}
build.js
19
const vclTemplate = handlebars.compile(fs.readFileSync('routing.vcl.handlebars'),
'UTF-8'));
const services = require('services.json');
// ... transform `services` into `viewData`
let vclContent = vclTemplate(viewData);
fs.writeFileSync(vclFilePath, vclContent, 'UTF-8');
UA Targeting
Return user-agent specific
responses without destroying
your cache hit ratio
This is great if...
You have a response that is tailored
to different device types
There are a virtually infinite number of
User-Agent values
2

Recommended for you

How to fake a database/backend in Axure... and more
How to fake a database/backend in Axure... and moreHow to fake a database/backend in Axure... and more
How to fake a database/backend in Axure... and more

For more information on London Axure Meetup visit: http://AxureLondon.com The RP File for the repeater widget presentation can be found here: http://axurelondon.com/RP_Files/RepeaterWidget_AxureLondon.rp Meetup Description: Thank you all for voting on what our next topic should be. And the winner is (drum roll)... The Repeater Widget! The Repeater Widget is one of the exciting new feature introduced with Axure 7, and it was created with the purpose of display repeating patterns of text, images, and links or in other words, the ability to "fake" a backend. For Show-and-Tell, Scott from TalkTalk will walk us through the Axure prototype that helped shaped TalkTalk's current YouView TV app. He will demonstrate how to use Axure to prototype TV apps using a TV remote control to control the app…. I know what you all thinking… I had no idea that could even be done! If so, come along and check it out :D Last but not least, I have a very special guest, author of the book Axure for Mobile, Lennart Hennigs, who will be joining us via Skype. I will have a few questions prepared for him, and I will be opening the floor for Q&A, so have your own brilliant mobile prototyping questions ready for him as well. As always, there will be pizza and drinks sponsored by Axure, and I will have plenty this time, I pinky promise ;) Well that's it for now, I hope to see you all in three week! Cheers! Sandra

prototypingmobiletv prototyping
Introductory Session DSC
Introductory Session DSCIntroductory Session DSC
Introductory Session DSC

This document summarizes an introductory session for the Google Developer Student Club (GDSC) at IIITG. The session introduces GDSC as a community for students interested in Google technologies to learn and build projects. It outlines the types of sessions offered, including workshops and talks, and invites students to meet core team members. Benefits of joining include Google certificates, open source collaboration, and insights not taught in class. The timeline of upcoming campaigns is provided, and students are instructed on how to join the IIITG GDSC chapter.

Introduction to State Restoration in Flutter
Introduction to State Restoration in FlutterIntroduction to State Restoration in Flutter
Introduction to State Restoration in Flutter

State Restoration let your user keep the experience intact and land to his app at the same place even if the operating system kills the app in the background.

flutterandroidios
21
Polyfill screenshot
UA Targeting
22
/normalizeUA
/polyfill.js?ua=ie/11
/polyfill.js
Add the normalised User-
Agent to the URL and
restart the original request
Add a Vary: User-Agent
header to the response
before sending it back to
the browser
We call this a
preflight request
UA targeting: key tools and techniques
● Remember something using request headers:
set req.http.tmpOrigURL = req.url;
● Change the URL of the backend request:
set req.url = "/api/normalizeUA?ua=" req.http.User-Agent;
● Reconstruct original URL adding a backend response header:
set req.url = req.http.tmpOrigURL "?ua=" resp.http.NormUA;
● Restart to send the request back to vcl_recv:
restart;
23
ua-targeting.vcl
24
sub vcl_recv {
if (req.url ~ "^/v2/polyfill." && req.url
!~ "[?&]ua=") {
set req.http.X-Orig-URL = req.url;
set req.url = "/v2/normalizeUa?ua="
urlencode(req.http.User-Agent);
}
}
sub vcl_deliver {
if (req.url ~ "^/vd/normalizeUa" && resp.status == 200 &&
req.http.X-Orig-URL) {
set req.http.Fastly-force-Shield = "1";
if (req.http.X-Orig-URL ~ "?") {
set req.url = req.http.X-Orig-URL "&ua=" resp.http.UA;
} else {
set req.url = req.http.X-Orig-URL "?ua="
resp.http.UA;
}
restart;
} else if (req.url ~ "^/vd/polyfill..*[?&]ua=" &&
req.http.X-Orig-URL && req.http.X-Orig-URL !~ "[?&]ua=") {
add resp.http.Vary = "User-Agent";
}
return(deliver);
}

Recommended for you

Task modeling: Understanding what people want and how to design for them.
Task modeling: Understanding what people want and how to design for them.Task modeling: Understanding what people want and how to design for them.
Task modeling: Understanding what people want and how to design for them.

This document discusses task modeling and how it can be used to design interactions that fit with how people naturally work. It describes task modeling as understanding the steps users take and decisions they need to make to accomplish a goal. The document also discusses different types of research that can be done, such as observing users in their natural environments or listening to call center interactions, to understand user behaviors and needs. Finally, it provides examples of three common types of behaviors - direct connections, controlled evaluations, and complex evaluations - that should be supported in design based on task modeling research.

C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp
C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips LspC:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp
C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp

The document provides tips for facilitating LEGO Serious Play sessions. It recommends doing at least two skills-building activities and following a four step process of posing a question, building models to represent meanings, sharing stories about the models, and questioning and reflecting. Key tips include framing questions effectively, building models individually but sharing as a group, keeping building time short, and focusing on the stories told rather than the models themselves.

legolego serious playrapid results
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!

10のJava9で変わるJava8の嫌なとこ!

jdk9javaopenjdk
Authentication
Implement integration with your
federated identity system
entirely in VCL
This is great if...
You have a federated login system
using a protocol like OAuth
You want to annotate requests with a
simple verified authentication state
3
Magic circa 2001
26
<?php
echo $_SERVER['PHP_AUTH_USER'];
?>
http://intranet/my/example/app
New magic circa 2016
27
app.get('/', (req, res) => {
res.end(req.get('Nikkei-UserID'));
});
Authentication
28
/article/123
Nikkei-UserID: andrew.betts
Nikkei-UserRank: premium
Vary: Nikkei-UserRank
Article
Cookie: Auth=a139fm24...
Cache-control: private

Recommended for you

What’s New in Amazon Aurora
What’s New in Amazon AuroraWhat’s New in Amazon Aurora
What’s New in Amazon Aurora

by Joyjeet Banerjee, Enterprise Solutions Architect, AWS Amazon Aurora is a MySQL- and PostgreSQL-compatible database engine that combines the speed and availability of high-end commercial databases with the simplicity and cost-effectiveness of open source databases. In this deep dive session, we’ll discuss best practices and explore new features in areas like high availability, security, performance management and database cloning. Level 300

awsamazon web servicescloud
神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)

This document discusses different approaches to building an authentication middleware in Go web applications. It begins with using the standard library, then explores Goji and its request context. It settles on using the x/net/context package and kami router, which allow sharing database connections and authentication objects across requests and tests through the request context. Middleware is defined hierarchically in kami. This approach avoids global variables and simplifies testing.

gokamigolang
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan ViladrosarieraApache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera

Spark Streaming has supported Kafka since it’s inception, but a lot has changed since those times, both in Spark and Kafka sides, to make this integration more fault-tolerant and reliable.Apache Kafka 0.10 (actually since 0.9) introduced the new Consumer API, built on top of a new group coordination protocol provided by Kafka itself. So a new Spark Streaming integration comes to the playground, with a similar design to the 0.8 Direct DStream approach. However, there are notable differences in usage, and many exciting new features. In this talk, we will cover what are the main differences between this new integration and the previous one (for Kafka 0.8), and why Direct DStreams have replaced Receivers for good. We will also see how to achieve different semantics (at least one, at most one, exactly once) with code examples. Finally, we will briefly introduce the usage of this integration in Billy Mobile to ingest and process the continuous stream of events from our AdNetwork.

apache sparkspark summit
Authentication: key tools and techniques
● Get a cookie by name: req.http.Cookie:MySiteAuth
● Base64 normalisation:
digest.base64url_decode(), digest.base64_decode
● Extract the parts of a JSON Web Token (JWT):
regsub({{cookie}}, "(^[^.]+).[^.]+.[^.]+$", "1");
● Check JWT signature: digest.hmac_sha256_base64()
● Set trusted headers for backend use:
req.http.Nikkei-UserID = regsub({{jwt}}, {{pattern}}, "1");
29
authentication.vcl
30
if (req.http.Cookie:NikkeiAuth) {
set req.http.tmpHeader = regsub(req.http.Cookie:NikkeiAuth, "(^[^.]+).[^.]+.[^.]+$", "1");
set req.http.tmpPayload = regsub(req.http.Cookie:NikkeiAuth, "^[^.]+.([^.]+).[^.]+$", "1");
set req.http.tmpRequestSig = digest.base64url_decode(
regsub(req.http.Cookie:NikkeiAuth, "^[^.]+.[^.]+.([^.]+)$", "1")
);
set req.http.tmpCorrectSig = digest.base64_decode(
digest.hmac_sha256_base64("{{jwt_secret}}", req.http.tmpHeader "." req.http.tmpPayload)
);
if (req.http.tmpRequestSig != req.http.tmpCorrectSig) {
error 754 "/login; NikkeiAuth=deleted; expires=Thu, 01 Jan 1970 00:00:00 GMT";
}
... continues ...
authentication.vcl (cont)
31
set req.http.tmpPayload = digest.base64_decode(req.http.tmpPayload);
set req.http.Nikkei-UserID = regsub(req.http.tmpPayload, {"^.*?"sub"s*:s*"(w+)".*?$"}, "1");
set req.http.Nikkei-Rank = regsub(req.http.tmpPayload, {"^.*?"ds_rank"s*:s*"(w+)".*?$"}, "1");
unset req.http.base64_header;
unset req.http.base64_payload;
unset req.http.signature;
unset req.http.valid_signature;
unset req.http.payload;
} else {
set req.http.Nikkei-UserID = "anonymous";
set req.http.Nikkei-Rank = "anonymous";
}
Feature flags
Dark deployments and easy A/B
testing without reducing front
end perf or cache efficiency
This is great if...
You want to serve different versions
of your site to different users
Test new features internally on prod
before releasing them to the world
4

Recommended for you

An introduction and future of Ruby coverage library
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage library

Ruby's current test coverage feature, coverage.so, only measures line coverage. The speaker proposes expanding it to support function and branch coverage in Ruby 2.5. This would involve updating the coverage.so API to return additional coverage data types and structure the output data in a more extensible way. A preliminary demo applying the new coverage.so to Ruby code showed it can integrate with C code coverage from GCOV and display results in LCOV format. The speaker seeks feedback on the proposed API design to finalize it for Ruby 2.5.

rubyrubykaigi 2017coverage
SLOのすすめ
SLOのすすめSLOのすすめ
SLOのすすめ

SRE Meetup Tokyo にて発表 https://connpass.com/event/66219/

sreslo信頼性
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介

データベースシャーディングを実現するSpiderストレージエンジンの概要、アーキテクチャ、利用事例、高度な使い方などのご紹介

shardingspidermysql
33
34
Now you see it...
Feature flags parts
35
● A flags registry - a JSON file will be fine
○ Include all possible values of each flag and what percentage of the audience it applies to
○ Publish it statically - S3 is good for that
● A flag toggler tool
○ Reads the JSON, renders a table, writes an override cookie with chosen values
● An API
○ Reads the JSON, responds to requests by calculating a user's position number on a 0-100
line and matches them with appropriate flag values
Feature flags
36
Flags API
Article
Merge the flags response with the override cookie,
set as HTTP header, restart original request...
/article/123
Cookie: Flgs-
Override= Foo=10;
/api/flags?userid=6453
Flgs: highlights=true; Foo=42;
Flgs: highlights=true; Foo=42; Foo=10
Vary: Flgs

Recommended for you

ScalaからGoへ
ScalaからGoへScalaからGoへ
ScalaからGoへ

Scala開発者からGoに移動した経験の話です。関数型開発の経験はGoで役に立つですか?軽く考え方レベルとコードレベルの話です。

scalagojapan
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechcon

DeNA TechCon 2017の登壇資料です。

 
by DeNA
denatechcon
Blockchain on Go
Blockchain on GoBlockchain on Go
Blockchain on Go

The presentation at DevFest Tokyo 2017 / @__timakin__ An introduction of blockchain and why go is nice to implement blockchain. Additionally described about the blockchain projects that are based on Go.

blockchainengineeringprogramming
ExpressJS flags middleware
37
app.get('/', (req, res) => {
if (req.flags.has('highlights')) {
// Enable highlights feature
}
});
HTTP/1.1 200 OK
Vary: Nikkei-Flags
...
Dynamic backends
Override backend rules at
runtime without updating your
VCL
This is great if...
You have a bug you can't reproduce
without the request going through
the CDN
You want to test a local dev version of
a service with live integrations
5
Dynamic backends
39
Developer
laptopDynamic backend
proxy
(node-http-proxy)
Check forwarded IP is
whitelisted or auth
header is also present
GET /article/123
Backend-Override: article -> fc57848a.ngrok.io
ngrok
fc57848a
.ngrok.io
Dynamic backends: key tools and techniques
● Extract backend to override:
set req.http.tmpORBackend =
regsub(req.http.Backend-Override, "s*->.*$", "");
● Check whether current backend matches
if (req.http.tmpORBackend == req.http.tmpCurrentBackend) {
● Use node-http-proxy for the proxy app
○ Remember res.setHeader('Vary', 'Backend-Override');
○ I use {xfwd: false, changeOrigin: true, hostRewrite: true}
40

Recommended for you

AWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグAWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグ

2017.09.26 OpsJAWS #13

amazonawsx-ray
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis FirehoseStreaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose

by Joyjeet Banerjee, Enterprise Solutions Architect, AWS Evolving your analytics from batch processing to real-time processing can have a major business impact, but ingesting streaming data into your data warehouse requires building complex streaming data pipelines. Amazon Kinesis Firehose solves this problem by making it easy to transform and load streaming data into Amazon Redshift so that you can use existing analytics and business intelligence tools to extract information in near real-time and respond promptly. In this session, we will dive deep using Amazon Kinesis Firehose to load streaming data into Amazon Redshift reliably, scalably, and cost-effectively. Level: 200

awsamazon web servicescloud
MongoDBの可能性の話
MongoDBの可能性の話MongoDBの可能性の話
MongoDBの可能性の話

道玄坂LTで発表した資料です!!!

emrawsec2
Debug headers
Collect request lifecycle
information in a single HTTP
response header
This is great if...
You find it hard to understand what
path the request is taking through
your VCL
You have restarts in your VCL and
need to see all the individual
backend requests, not just the last
one
6
42
The VCL
flow
43
The VCL
flow
44
The VCL
flow

Recommended for you

golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)

issues we have experienced and lessons learned while building large scale microservices.

Operations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningOperations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from Happening

The document provides an overview of key areas to review for production readiness including architecture design, monitoring, logging, documentation, alerting, service level agreements, expected throughput, testing, and deployment strategy. It summarizes best practices and considerations for each area such as using circuit breakers in monitoring, consistent logging formats, storing documentation near code, automating level 1 operations, and strategies for testing, deployments, and managing error budgets.

awscloud computingstartups
Microservices at Mercari
Microservices at MercariMicroservices at Mercari
Microservices at Mercari

1) Mercari has transitioned some services to microservices architecture running on Kubernetes in the US region to improve development velocity. 2) Key challenges in operating microservices include deployment automation using Spinnaker, and observability of distributed systems through request tracing, logging, and metrics. 3) The architecture is still evolving with discussions on service mesh and chaos engineering to improve reliability in the face of failures. Microservices adoption is just beginning in the JP region.

google cloudgcpsre
Debug journey
45
vcl_recv {
set req.http.tmpLog = if (req.restarts == 0, "", req.http.tmpLog ";");
# ... routing ...
set req.http.tmpLog = req.http.tmpLog " {{backend}}:" req.url;
}
vcl_fetch { set req.http.tmpLog = req.http.tmpLog " fetch"; ... }
vcl_hit { set req.http.tmpLog = req.http.tmpLog " hit"; ... }
vcl_miss { set req.http.tmpLog = req.http.tmpLog " miss"; ... }
vcl_pass { set req.http.tmpLog = req.http.tmpLog " pass"; ... }
vcl_deliver {
set resp.http.CDN-Process-Log = req.http.tmpLog;
}
Debug journey
46
CDN-Process-Log:
apigw:/flags/v1/rnikkei/allocate?output=diff&segid=foo&rank=X
HIT (hits=2 ttl=1.204/5.000 age=4 swr=300.000 sie=604800.000);
rnikkei_front_0:/ MISS (hits=0 ttl=1.000/1.000 age=0 swr=300.000
sie=86400.000)
RUM++
Resource Timing API + data
Fastly exposes in VCL. And no
backend.
This is great if...
You want to track down hotspots of
slow response times
You'd like to understand how
successfully end users are being
matched to their nearest PoPs
7
Resource timing on front end
48
var rec = window.performance.getEntriesByType("resource")
.find(rec => rec.name.indexOf('[URL]') !== -1)
;
(new Image()).src = '/sendBeacon'+
'?dns='+(rec.domainLookupEnd-rec.domainLookupStart)+
'&connect='+(rec.connectEnd-rec.connectStart)+
'&req='+(rec.responseStart-rec.requestStart)+
'&resp='+(rec.responseEnd-rec.responseStart)
;

Recommended for you

Fast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPCFast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPC

The document discusses using gRPC and Protocol Buffers to build fast and reliable APIs, describing how gRPC uses Protocol Buffers to define service interfaces and handle serialization, and allows building clients and servers in various languages that can communicate over the network through language-independent services. It provides examples of using gRPC to define and call both unary and streaming RPC services from Swift clients and servers.

grpc swift apis
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話

API Meetup Tokyo #15 〜OpenAPI Specification (Swagger)特集〜 2016-07-22(金)19:00 - 21:00 API公開に向けたパイロットPJにて、設計、実装(単項目チェック)、ドキュメント、仕様公開にSwaggerを採用した際の経験談をお話します。

node.jsswaggeroai
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法

appengine ja night #35の発表資料です。 http://gcpja.connpass.com/event/44024/

golanggaegcp
Add CDN data in VCL & respond with synthetic
49
sub vcl_recv {
if (req.url ~ "^/sendBeacon") {
error 204 "No content";
}
}
RUM++
50
/sendBeacon?foo=42&...
204 No Content
51
Crunch the data
52

Recommended for you

So You Wanna Go Fast?
So You Wanna Go Fast?So You Wanna Go Fast?
So You Wanna Go Fast?

This document contains the transcript from a presentation titled "So You Wanna Go Fast?" by Tyler Treat. Some of the key topics discussed include measuring performance using tools like pprof, how different language features in Go like channels, interfaces, and memory management can impact performance, and techniques for writing concurrent and multi-core friendly code in Go like using read-write mutexes. The overall message is that performance depends greatly on the specific situation and trade-offs must be considered between concurrency, memory usage, and execution speed. Measuring first is emphasized to guide any optimizations.

golanggoperformance
Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS ApplicationReal World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS Application

This document provides lessons learned from real world experiences with Node.js applications. It discusses the importance of upgrading to newer Node.js versions for security and features. It also emphasizes the importance of error handling, using promises for async flow control, and scaling applications using Docker containers. Debugging and monitoring Node.js applications for performance is also covered.

confoo2017node.jsnodejs
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE

This document provides instructions for developing a first application using the FI-WARE platform. It discusses the FI-WARE architecture, including key components like the context broker and Wirecloud. It then describes how to create widgets using Wirecloud, connecting them to context broker and other FI-WARE services. The document also explains how to include IoT devices in a Z-Wave network and register them with the FI-WARE IoT backend.

entrepreneursfiwareprogramming
Beyond ASCII
Use these encoding tips to
embed non-ASCII content in
your VCL file.
This is great if...
Your users don't speak English, but
you can only write ASCII in VCL
files
8
Everyone does UTF-8 now, right?
54
synthetic {"Responsive Nikkeiアルファプログラムのメンバーの皆様、ア
ルファバージョンのサイトにアクセスできない場合、
rnfeedback@nex.nikkei.co.jp までその旨連絡ください。"};
55
Quick conversion
56
"string"
.split('')
.map(
char => char.codePointAt(0) < 128 ?
char :
"&#"+char.codePointAt(0)+";"
)
.join('')
;

Recommended for you

RESTful Web Applications with Apache Sling
RESTful Web Applications with Apache SlingRESTful Web Applications with Apache Sling
RESTful Web Applications with Apache Sling

Sling is a RESTful web framework for building applications on top of Apache Jackrabbit. It allows resources like content, configurations, code, and binaries to be accessed over REST URLs. Sling maps URLs to resources rather than commands, supports various scripting languages as servlets, and has a modular OSGi-based architecture powered by Apache Felix. Examples shown include building a blog and coffee ordering application on Sling to demonstrate how it supports RESTful content creation and management.

slingjcrapache
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications

This document provides an introduction and overview of a Node.js tutorial presented by Tom Hughes-Croucher. The tutorial covers topics such as building scalable server-side code with JavaScript using Node.js, debugging Node.js applications, using frameworks like Express.js, and best practices for deploying Node.js applications in production environments. The tutorial includes exercises for hands-on learning and demonstrates tools and techniques like Socket.io, clustering, error handling and using Redis with Node.js applications.

node.jsfluentconfjavascript
Load Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS ClusterLoad Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS Cluster

The document discusses load balancing applications with NGINX in a CoreOS cluster. It provides an overview of using CoreOS, etcd, and fleet to deploy and manage containers across a cluster. Etcd is used for service discovery to track dynamic IP addresses and endpoints, while fleet is used as an application scheduler to deploy units and rebalance loads. NGINX can then be used as a software load balancer to distribute traffic to the backend services. The document demonstrates setting up this environment with CoreOS, etcd, fleet and NGINX to provide load balancing in a clustered deployment.

internetcontainersdeployment
"Fixed"
57
synthetic {"Responsive
Nikkei&#12450;&#12523;&#12501;&#12449;&#12503;&#12525;&#12464;&#
12521;&#12512;&#12398;&#12513;&#12531;&#12496;&#12540;&#12398;&#
30342;&#27096;&#12289;&#12450;&#12523;&#12501;&#12449;&#12496;&#
12540;&#12472;&#12519;&#12531;&#12398;&#12469;&#12452;&#12488;&#
12395;&#12450;&#12463;&#12475;&#12473;&#12391;&#12365;&#12394;&#
12356;&#22580;&#21512;&#12289;rnfeedback@nex.nikkei.co.jp
&#12414;&#12391;&#12381;&#12398;&#26088;&#36899;&#32097;&#12367;
&#12384;&#12373;&#12356;&#12290;"};
"Fixed"
58
synthetic digest.base64decode(
{"IlJlc3BvbnNpdmUgTmlra2Vp44Ki44Or44OV44Kh44OX44Ot44Kw44Op44Og44
Gu44Oh44Oz44OQ44O844Gu55qG5qeY44CB44Ki44Or44OV44Kh44OQ44O844K444
On44Oz44Gu44K144Kk44OI44Gr44Ki44Kv44K744K544Gn44GN44Gq44GE5aC05Z
CI44CBcm5mZWVkYmFja0BuZXgubmlra2VpLmNvLmpwIOOBvuOBp+OBneOBruaXqO
mAo+e1oeOBj+OBoOOBleOBhOOAgiI="});
59
I have 68 backends
60

Recommended for you

Real World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js ApplicationsReal World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js Applications

The document discusses several pain points experienced with Node.js applications and solutions for resolving them. It covers creating a strong foundation by upgrading to Node.js v5, locking down NPM dependencies, handling errors properly with try/catch blocks and promises, deploying applications using Docker for scaling, addressing security issues, and using tools like debug and profilers to improve performance.

nodejsndc2016ndclondon2016
Angular 1 + es6
Angular 1 + es6Angular 1 + es6
Angular 1 + es6

This document provides a summary of Han Janghyun's background and experience. It includes: 1. Han Janghyun previously worked as a senior developer at Samsung SDS and has experience implementing TV platform JavaScript applications and retail solution servers and frontends. 2. He now works as a freelance developer and operates the blog han41858.tistory.com. He is also writing a translation of the book Angular 2. 3. Han Janghyun is also involved in operating GDG Korea Web Tech.

es6angular1
2016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES62016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES6

2016년 12월에 진행되었던 W3C HTML5 Conference 2016의 오후 트렉 (웹프레임워크)의 발표 자료입니다. GDG Korea Web Tech 운영진이신 한장현 님께서 ‘AngularJS와 ES6’에 대한 주제로 발표를 진행하였습니다. 이 발표를 통해서 Angular와ES6를 함께 사용하기 위해 필요한 구체적인 내용들을 공유하였습니다. Angular를 현재 사용하시는 분들께 많은 도움이 되는 시간이었던 것 같습니다.

es6앵귤러angular
Varnishlog to the rescue
A way to submit a varnish
transaction ID to the API,
and get all varnishlog
events relating to that
transaction, including
related (backend)
transactions
61
> fastly log 1467852934
17 SessionOpen c 66.249.72.22 47013 :80
17 ReqStart c 66.249.72.22 47013
1467852934
17 RxRequest c GET
17 RxURL c /articles/123
17 RxProtocol c HTTP/1.1
17 RxHeader c Host: www.example.com
...
Thanks for listening
62
Andrew Betts
andrew.betts@ft.com
@triblondon
Get the slides
bit.ly/ft-fastly-altitude-2016

More Related Content

What's hot

Using Entity Command Buffers – Unite Copenhagen 2019
Using Entity Command Buffers – Unite Copenhagen 2019Using Entity Command Buffers – Unite Copenhagen 2019
Using Entity Command Buffers – Unite Copenhagen 2019
Unity Technologies
 
UIフレームワークのAAとUIAってそもそもなんやろか
UIフレームワークのAAとUIAってそもそもなんやろかUIフレームワークのAAとUIAってそもそもなんやろか
UIフレームワークのAAとUIAってそもそもなんやろか
Chuki ちゅき
 
Quarkus tips, tricks, and techniques
Quarkus tips, tricks, and techniquesQuarkus tips, tricks, and techniques
Quarkus tips, tricks, and techniques
Red Hat Developers
 
JSONB introduction and comparison with other frameworks
JSONB introduction and comparison with other frameworksJSONB introduction and comparison with other frameworks
JSONB introduction and comparison with other frameworks
Dmitry Kornilov
 
Hacking Android OS
Hacking Android OSHacking Android OS
Hacking Android OS
Jimmy Software
 
Mobile application development React Native - Tidepool Labs
Mobile application development React Native - Tidepool LabsMobile application development React Native - Tidepool Labs
Mobile application development React Native - Tidepool Labs
Harutyun Abgaryan
 
Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications
Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud ApplicationsJakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications
Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications
Ivar Grimstad
 
SQLite in Flutter.pptx
SQLite in Flutter.pptxSQLite in Flutter.pptx
SQLite in Flutter.pptx
Nabin Dhakal
 
La Duck Conf - Les fakes news du low-code
La Duck Conf - Les fakes news du low-code La Duck Conf - Les fakes news du low-code
La Duck Conf - Les fakes news du low-code
OCTO Technology
 
Unity 3D game engine seminar
Unity 3D game engine  seminarUnity 3D game engine  seminar
Unity 3D game engine seminar
NikhilThorat15
 
CONTINUOUS INTEGRATION WITH JENKINS AND GIT
CONTINUOUS INTEGRATION WITH JENKINS AND GITCONTINUOUS INTEGRATION WITH JENKINS AND GIT
CONTINUOUS INTEGRATION WITH JENKINS AND GIT
Benjamin Lutaaya
 
Introduction to Generative Art with Processing
Introduction to Generative Art with ProcessingIntroduction to Generative Art with Processing
Introduction to Generative Art with Processing
stefk00
 
Pimp My Confluence Plugin - AtlasCamp 2011
Pimp My Confluence Plugin - AtlasCamp 2011Pimp My Confluence Plugin - AtlasCamp 2011
Pimp My Confluence Plugin - AtlasCamp 2011
Atlassian
 
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
Redis Labs
 
Introduction to Game Development
Introduction to Game DevelopmentIntroduction to Game Development
Introduction to Game Development
Reggie Niccolo Santos
 
How to fake a database/backend in Axure... and more
How to fake a database/backend in Axure... and moreHow to fake a database/backend in Axure... and more
How to fake a database/backend in Axure... and more
Sandra González
 
Introductory Session DSC
Introductory Session DSCIntroductory Session DSC
Introductory Session DSC
SangajaPatel1
 
Introduction to State Restoration in Flutter
Introduction to State Restoration in FlutterIntroduction to State Restoration in Flutter
Introduction to State Restoration in Flutter
Dave Chao
 
Task modeling: Understanding what people want and how to design for them.
Task modeling: Understanding what people want and how to design for them.Task modeling: Understanding what people want and how to design for them.
Task modeling: Understanding what people want and how to design for them.
cxpartners
 
C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp
C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips LspC:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp
C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp
LearningPlanet
 

What's hot (20)

Using Entity Command Buffers – Unite Copenhagen 2019
Using Entity Command Buffers – Unite Copenhagen 2019Using Entity Command Buffers – Unite Copenhagen 2019
Using Entity Command Buffers – Unite Copenhagen 2019
 
UIフレームワークのAAとUIAってそもそもなんやろか
UIフレームワークのAAとUIAってそもそもなんやろかUIフレームワークのAAとUIAってそもそもなんやろか
UIフレームワークのAAとUIAってそもそもなんやろか
 
Quarkus tips, tricks, and techniques
Quarkus tips, tricks, and techniquesQuarkus tips, tricks, and techniques
Quarkus tips, tricks, and techniques
 
JSONB introduction and comparison with other frameworks
JSONB introduction and comparison with other frameworksJSONB introduction and comparison with other frameworks
JSONB introduction and comparison with other frameworks
 
Hacking Android OS
Hacking Android OSHacking Android OS
Hacking Android OS
 
Mobile application development React Native - Tidepool Labs
Mobile application development React Native - Tidepool LabsMobile application development React Native - Tidepool Labs
Mobile application development React Native - Tidepool Labs
 
Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications
Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud ApplicationsJakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications
Jakarta EE 10 - Simplicity for Modern and Lighweight Cloud Applications
 
SQLite in Flutter.pptx
SQLite in Flutter.pptxSQLite in Flutter.pptx
SQLite in Flutter.pptx
 
La Duck Conf - Les fakes news du low-code
La Duck Conf - Les fakes news du low-code La Duck Conf - Les fakes news du low-code
La Duck Conf - Les fakes news du low-code
 
Unity 3D game engine seminar
Unity 3D game engine  seminarUnity 3D game engine  seminar
Unity 3D game engine seminar
 
CONTINUOUS INTEGRATION WITH JENKINS AND GIT
CONTINUOUS INTEGRATION WITH JENKINS AND GITCONTINUOUS INTEGRATION WITH JENKINS AND GIT
CONTINUOUS INTEGRATION WITH JENKINS AND GIT
 
Introduction to Generative Art with Processing
Introduction to Generative Art with ProcessingIntroduction to Generative Art with Processing
Introduction to Generative Art with Processing
 
Pimp My Confluence Plugin - AtlasCamp 2011
Pimp My Confluence Plugin - AtlasCamp 2011Pimp My Confluence Plugin - AtlasCamp 2011
Pimp My Confluence Plugin - AtlasCamp 2011
 
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
JSON in Redis - When to use RedisJSON by Jay Won of Coupang - Redis Day Seatt...
 
Introduction to Game Development
Introduction to Game DevelopmentIntroduction to Game Development
Introduction to Game Development
 
How to fake a database/backend in Axure... and more
How to fake a database/backend in Axure... and moreHow to fake a database/backend in Axure... and more
How to fake a database/backend in Axure... and more
 
Introductory Session DSC
Introductory Session DSCIntroductory Session DSC
Introductory Session DSC
 
Introduction to State Restoration in Flutter
Introduction to State Restoration in FlutterIntroduction to State Restoration in Flutter
Introduction to State Restoration in Flutter
 
Task modeling: Understanding what people want and how to design for them.
Task modeling: Understanding what people want and how to design for them.Task modeling: Understanding what people want and how to design for them.
Task modeling: Understanding what people want and how to design for them.
 
C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp
C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips LspC:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp
C:\Shared\Rapid Results\Training Programmes\Lego Serious Play\15 Top Tips Lsp
 

Viewers also liked

10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
 
What’s New in Amazon Aurora
What’s New in Amazon AuroraWhat’s New in Amazon Aurora
What’s New in Amazon Aurora
Amazon Web Services
 
神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)
guregu
 
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan ViladrosarieraApache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Spark Summit
 
An introduction and future of Ruby coverage library
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage library
mametter
 
SLOのすすめ
SLOのすすめSLOのすすめ
SLOのすすめ
Takeo Sawada
 
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Kentoku
 
ScalaからGoへ
ScalaからGoへScalaからGoへ
ScalaからGoへ
James Neve
 
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechcon
DeNA
 
Blockchain on Go
Blockchain on GoBlockchain on Go
Blockchain on Go
Seiji Takahashi
 
AWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグAWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグ
Amazon Web Services Japan
 
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis FirehoseStreaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose
Amazon Web Services
 
MongoDBの可能性の話
MongoDBの可能性の話MongoDBの可能性の話
MongoDBの可能性の話
Akihiro Kuwano
 
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)
Yuichi Murata
 
Operations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningOperations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from Happening
Amazon Web Services
 
Microservices at Mercari
Microservices at MercariMicroservices at Mercari
Microservices at Mercari
Google Cloud Platform - Japan
 
Fast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPCFast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPC
Tim Burks
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
KEISUKE KONISHI
 
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
Takuya Ueda
 
So You Wanna Go Fast?
So You Wanna Go Fast?So You Wanna Go Fast?
So You Wanna Go Fast?
Tyler Treat
 

Viewers also liked (20)

10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
What’s New in Amazon Aurora
What’s New in Amazon AuroraWhat’s New in Amazon Aurora
What’s New in Amazon Aurora
 
神に近づ���x/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)
 
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan ViladrosarieraApache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
Apache Spark Streaming + Kafka 0.10 with Joan Viladrosariera
 
An introduction and future of Ruby coverage library
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage library
 
SLOのすすめ
SLOのすすめSLOのすすめ
SLOのすすめ
 
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
Spiderストレージエンジンの使い方と利用事例 他ストレージエンジンの紹介
 
ScalaからGoへ
ScalaからGoへScalaからGoへ
ScalaからGoへ
 
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechcon
 
Blockchain on Go
Blockchain on GoBlockchain on Go
Blockchain on Go
 
AWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグAWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグ
 
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis FirehoseStreaming Data Analytics with Amazon Redshift and Kinesis Firehose
Streaming Data Analytics with Amazon Redshift and Kinesis Firehose
 
MongoDBの可能性の話
MongoDBの可能性の話MongoDBの可能性の話
MongoDBの可能性の話
 
golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)golang.tokyo #6 (in Japanese)
golang.tokyo #6 (in Japanese)
 
Operations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningOperations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from Happening
 
Microservices at Mercari
Microservices at MercariMicroservices at Mercari
Microservices at Mercari
 
Fast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPCFast and Reliable Swift APIs with gRPC
Fast and Reliable Swift APIs with gRPC
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
 
So You Wanna Go Fast?
So You Wanna Go Fast?So You Wanna Go Fast?
So You Wanna Go Fast?
 

Similar to Solving anything in VCL

Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS ApplicationReal World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS Application
Ben Hall
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
FIWARE
 
RESTful Web Applications with Apache Sling
RESTful Web Applications with Apache SlingRESTful Web Applications with Apache Sling
RESTful Web Applications with Apache Sling
Bertrand Delacretaz
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
Tom Croucher
 
Load Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS ClusterLoad Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS Cluster
Kevin Jones
 
Real World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js ApplicationsReal World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js Applications
Ben Hall
 
Angular 1 + es6
Angular 1 + es6Angular 1 + es6
Angular 1 + es6
장현 한
 
2016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES62016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES6
양재동 코드랩
 
[W3C HTML5 2016] Angular + ES6
[W3C HTML5 2016] Angular + ES6[W3C HTML5 2016] Angular + ES6
[W3C HTML5 2016] Angular + ES6
양재동 코드랩
 
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 202010 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
Matt Raible
 
Sanjeev ghai 12
Sanjeev ghai 12Sanjeev ghai 12
Sanjeev ghai 12
Praveen kumar
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
Antônio Roberto Silva
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NET
Gianluca Carucci
 
Play Framework
Play FrameworkPlay Framework
Play Framework
Harinath Krishnamoorthy
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js Applications
Ohad Kravchick
 
6 tips for improving ruby performance
6 tips for improving ruby performance6 tips for improving ruby performance
6 tips for improving ruby performance
Engine Yard
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and Scala
Yevgeniy Brikman
 
Mobile webapplication development
Mobile webapplication developmentMobile webapplication development
Mobile webapplication development
Ganesh Gembali
 
Meetup 2022 - APIs with Quarkus.pdf
Meetup 2022 - APIs with Quarkus.pdfMeetup 2022 - APIs with Quarkus.pdf
Meetup 2022 - APIs with Quarkus.pdf
Red Hat
 
Future of Web Apps: Google Gears
Future of Web Apps: Google GearsFuture of Web Apps: Google Gears
Future of Web Apps: Google Gears
dion
 

Similar to Solving anything in VCL (20)

Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS ApplicationReal World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS Application
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
 
RESTful Web Applications with Apache Sling
RESTful Web Applications with Apache SlingRESTful Web Applications with Apache Sling
RESTful Web Applications with Apache Sling
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
Load Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS ClusterLoad Balancing Applications with NGINX in a CoreOS Cluster
Load Balancing Applications with NGINX in a CoreOS Cluster
 
Real World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js ApplicationsReal World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js Applications
 
Angular 1 + es6
Angular 1 + es6Angular 1 + es6
Angular 1 + es6
 
2016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES62016 W3C Conference #4 : ANGULAR + ES6
2016 W3C Conference #4 : ANGULAR + ES6
 
[W3C HTML5 2016] Angular + ES6
[W3C HTML5 2016] Angular + ES6[W3C HTML5 2016] Angular + ES6
[W3C HTML5 2016] Angular + ES6
 
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 202010 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
 
Sanjeev ghai 12
Sanjeev ghai 12Sanjeev ghai 12
Sanjeev ghai 12
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NET
 
Play Framework
Play FrameworkPlay Framework
Play Framework
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js Applications
 
6 tips for improving ruby performance
6 tips for improving ruby performance6 tips for improving ruby performance
6 tips for improving ruby performance
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and Scala
 
Mobile webapplication development
Mobile webapplication developmentMobile webapplication development
Mobile webapplication development
 
Meetup 2022 - APIs with Quarkus.pdf
Meetup 2022 - APIs with Quarkus.pdfMeetup 2022 - APIs with Quarkus.pdf
Meetup 2022 - APIs with Quarkus.pdf
 
Future of Web Apps: Google Gears
Future of Web Apps: Google GearsFuture of Web Apps: Google Gears
Future of Web Apps: Google Gears
 

More from Fastly

Revisiting HTTP/2
Revisiting HTTP/2Revisiting HTTP/2
Revisiting HTTP/2
Fastly
 
Altitude San Francisco 2018: Preparing for Video Streaming Events at Scale
Altitude San Francisco 2018: Preparing for Video Streaming Events at ScaleAltitude San Francisco 2018: Preparing for Video Streaming Events at Scale
Altitude San Francisco 2018: Preparing for Video Streaming Events at Scale
Fastly
 
Altitude San Francisco 2018: Building the Souther Hemisphere of the Internet
Altitude San Francisco 2018: Building the Souther Hemisphere of the InternetAltitude San Francisco 2018: Building the Souther Hemisphere of the Internet
Altitude San Francisco 2018: Building the Souther Hemisphere of the Internet
Fastly
 
Altitude San Francisco 2018: The World Cup Stream
Altitude San Francisco 2018: The World Cup StreamAltitude San Francisco 2018: The World Cup Stream
Altitude San Francisco 2018: The World Cup Stream
Fastly
 
Altitude San Francisco 2018: We Own Our Destiny
Altitude San Francisco 2018: We Own Our DestinyAltitude San Francisco 2018: We Own Our Destiny
Altitude San Francisco 2018: We Own Our Destiny
Fastly
 
Altitude San Francisco 2018: Scale and Stability at the Edge with 1.4 Billion...
Altitude San Francisco 2018: Scale and Stability at the Edge with 1.4 Billion...Altitude San Francisco 2018: Scale and Stability at the Edge with 1.4 Billion...
Altitude San Francisco 2018: Scale and Stability at the Edge with 1.4 Billion...
Fastly
 
Altitude San Francisco 2018: Moving Off the Monolith: A Seamless Migration
Altitude San Francisco 2018: Moving Off the Monolith: A Seamless MigrationAltitude San Francisco 2018: Moving Off the Monolith: A Seamless Migration
Altitude San Francisco 2018: Moving Off the Monolith: A Seamless Migration
Fastly
 
Altitude San Francisco 2018: Bringing TLS to GitHub Pages
Altitude San Francisco 2018: Bringing TLS to GitHub PagesAltitude San Francisco 2018: Bringing TLS to GitHub Pages
Altitude San Francisco 2018: Bringing TLS to GitHub Pages
Fastly
 
Altitude San Francisco 2018: HTTP Invalidation Workshop
Altitude San Francisco 2018: HTTP Invalidation WorkshopAltitude San Francisco 2018: HTTP Invalidation Workshop
Altitude San Francisco 2018: HTTP Invalidation Workshop
Fastly
 
Altitude San Francisco 2018: HTTP/2 Tales: Discovery and Woe
Altitude San Francisco 2018: HTTP/2 Tales: Discovery and WoeAltitude San Francisco 2018: HTTP/2 Tales: Discovery and Woe
Altitude San Francisco 2018: HTTP/2 Tales: Discovery and Woe
Fastly
 
Altitude San Francisco 2018: How Magento moved to the cloud while maintaining...
Altitude San Francisco 2018: How Magento moved to the cloud while maintaining...Altitude San Francisco 2018: How Magento moved to the cloud while maintaining...
Altitude San Francisco 2018: How Magento moved to the cloud while maintaining...
Fastly
 
Altitude San Francisco 2018: Scaling Ethereum to 10B requests per day
Altitude San Francisco 2018: Scaling Ethereum to 10B requests per dayAltitude San Francisco 2018: Scaling Ethereum to 10B requests per day
Altitude San Francisco 2018: Scaling Ethereum to 10B requests per day
Fastly
 
Altitude San Francisco 2018: Authentication at the Edge
Altitude San Francisco 2018: Authentication at the EdgeAltitude San Francisco 2018: Authentication at the Edge
Altitude San Francisco 2018: Authentication at the Edge
Fastly
 
Altitude San Francisco 2018: WebAssembly Tools & Applications
Altitude San Francisco 2018: WebAssembly Tools & ApplicationsAltitude San Francisco 2018: WebAssembly Tools & Applications
Altitude San Francisco 2018: WebAssembly Tools & Applications
Fastly
 
Altitude San Francisco 2018: Testing with Fastly Workshop
Altitude San Francisco 2018: Testing with Fastly WorkshopAltitude San Francisco 2018: Testing with Fastly Workshop
Altitude San Francisco 2018: Testing with Fastly Workshop
Fastly
 
Altitude San Francisco 2018: Fastly Purge Control at the USA TODAY NETWORK
Altitude San Francisco 2018: Fastly Purge Control at the USA TODAY NETWORKAltitude San Francisco 2018: Fastly Purge Control at the USA TODAY NETWORK
Altitude San Francisco 2018: Fastly Purge Control at the USA TODAY NETWORK
Fastly
 
Altitude San Francisco 2018: WAF Workshop
Altitude San Francisco 2018: WAF WorkshopAltitude San Francisco 2018: WAF Workshop
Altitude San Francisco 2018: WAF Workshop
Fastly
 
Altitude San Francisco 2018: Logging at the Edge
Altitude San Francisco 2018: Logging at the Edge Altitude San Francisco 2018: Logging at the Edge
Altitude San Francisco 2018: Logging at the Edge
Fastly
 
Altitude San Francisco 2018: Video Workshop Docs
Altitude San Francisco 2018: Video Workshop DocsAltitude San Francisco 2018: Video Workshop Docs
Altitude San Francisco 2018: Video Workshop Docs
Fastly
 
Altitude San Francisco 2018: Programming the Edge
Altitude San Francisco 2018: Programming the EdgeAltitude San Francisco 2018: Programming the Edge
Altitude San Francisco 2018: Programming the Edge
Fastly
 

More from Fastly (20)

Revisiting HTTP/2
Revisiting HTTP/2Revisiting HTTP/2
Revisiting HTTP/2
 
Altitude San Francisco 2018: Preparing for Video Streaming Events at Scale
Altitude San Francisco 2018: Preparing for Video Streaming Events at ScaleAltitude San Francisco 2018: Preparing for Video Streaming Events at Scale
Altitude San Francisco 2018: Preparing for Video Streaming Events at Scale
 
Altitude San Francisco 2018: Building the Souther Hemisphere of the Internet
Altitude San Francisco 2018: Building the Souther Hemisphere of the InternetAltitude San Francisco 2018: Building the Souther Hemisphere of the Internet
Altitude San Francisco 2018: Building the Souther Hemisphere of the Internet
 
Altitude San Francisco 2018: The World Cup Stream
Altitude San Francisco 2018: The World Cup StreamAltitude San Francisco 2018: The World Cup Stream
Altitude San Francisco 2018: The World Cup Stream
 
Altitude San Francisco 2018: We Own Our Destiny
Altitude San Francisco 2018: We Own Our DestinyAltitude San Francisco 2018: We Own Our Destiny
Altitude San Francisco 2018: We Own Our Destiny
 
Altitude San Francisco 2018: Scale and Stability at the Edge with 1.4 Billion...
Altitude San Francisco 2018: Scale and Stability at the Edge with 1.4 Billion...Altitude San Francisco 2018: Scale and Stability at the Edge with 1.4 Billion...
Altitude San Francisco 2018: Scale and Stability at the Edge with 1.4 Billion...
 
Altitude San Francisco 2018: Moving Off the Monolith: A Seamless Migration
Altitude San Francisco 2018: Moving Off the Monolith: A Seamless MigrationAltitude San Francisco 2018: Moving Off the Monolith: A Seamless Migration
Altitude San Francisco 2018: Moving Off the Monolith: A Seamless Migration
 
Altitude San Francisco 2018: Bringing TLS to GitHub Pages
Altitude San Francisco 2018: Bringing TLS to GitHub PagesAltitude San Francisco 2018: Bringing TLS to GitHub Pages
Altitude San Francisco 2018: Bringing TLS to GitHub Pages
 
Altitude San Francisco 2018: HTTP Invalidation Workshop
Altitude San Francisco 2018: HTTP Invalidation WorkshopAltitude San Francisco 2018: HTTP Invalidation Workshop
Altitude San Francisco 2018: HTTP Invalidation Workshop
 
Altitude San Francisco 2018: HTTP/2 Tales: Discovery and Woe
Altitude San Francisco 2018: HTTP/2 Tales: Discovery and WoeAltitude San Francisco 2018: HTTP/2 Tales: Discovery and Woe
Altitude San Francisco 2018: HTTP/2 Tales: Discovery and Woe
 
Altitude San Francisco 2018: How Magento moved to the cloud while maintaining...
Altitude San Francisco 2018: How Magento moved to the cloud while maintaining...Altitude San Francisco 2018: How Magento moved to the cloud while maintaining...
Altitude San Francisco 2018: How Magento moved to the cloud while maintaining...
 
Altitude San Francisco 2018: Scaling Ethereum to 10B requests per day
Altitude San Francisco 2018: Scaling Ethereum to 10B requests per dayAltitude San Francisco 2018: Scaling Ethereum to 10B requests per day
Altitude San Francisco 2018: Scaling Ethereum to 10B requests per day
 
Altitude San Francisco 2018: Authentication at the Edge
Altitude San Francisco 2018: Authentication at the EdgeAltitude San Francisco 2018: Authentication at the Edge
Altitude San Francisco 2018: Authentication at the Edge
 
Altitude San Francisco 2018: WebAssembly Tools & Applications
Altitude San Francisco 2018: WebAssembly Tools & ApplicationsAltitude San Francisco 2018: WebAssembly Tools & Applications
Altitude San Francisco 2018: WebAssembly Tools & Applications
 
Altitude San Francisco 2018: Testing with Fastly Workshop
Altitude San Francisco 2018: Testing with Fastly WorkshopAltitude San Francisco 2018: Testing with Fastly Workshop
Altitude San Francisco 2018: Testing with Fastly Workshop
 
Altitude San Francisco 2018: Fastly Purge Control at the USA TODAY NETWORK
Altitude San Francisco 2018: Fastly Purge Control at the USA TODAY NETWORKAltitude San Francisco 2018: Fastly Purge Control at the USA TODAY NETWORK
Altitude San Francisco 2018: Fastly Purge Control at the USA TODAY NETWORK
 
Altitude San Francisco 2018: WAF Workshop
Altitude San Francisco 2018: WAF WorkshopAltitude San Francisco 2018: WAF Workshop
Altitude San Francisco 2018: WAF Workshop
 
Altitude San Francisco 2018: Logging at the Edge
Altitude San Francisco 2018: Logging at the Edge Altitude San Francisco 2018: Logging at the Edge
Altitude San Francisco 2018: Logging at the Edge
 
Altitude San Francisco 2018: Video Workshop Docs
Altitude San Francisco 2018: Video Workshop DocsAltitude San Francisco 2018: Video Workshop Docs
Altitude San Francisco 2018: Video Workshop Docs
 
Altitude San Francisco 2018: Programming the Edge
Altitude San Francisco 2018: Programming the EdgeAltitude San Francisco 2018: Programming the Edge
Altitude San Francisco 2018: Programming the Edge
 

Recently uploaded

Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Bert Blevins
 
INDIAN AIR FORCE FIGHTER PLANES LIST.pdf
INDIAN AIR FORCE FIGHTER PLANES LIST.pdfINDIAN AIR FORCE FIGHTER PLANES LIST.pdf
INDIAN AIR FORCE FIGHTER PLANES LIST.pdf
jackson110191
 
find out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challengesfind out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challenges
huseindihon
 
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
Kief Morris
 
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Chris Swan
 
Research Directions for Cross Reality Interfaces
Research Directions for Cross Reality InterfacesResearch Directions for Cross Reality Interfaces
Research Directions for Cross Reality Interfaces
Mark Billinghurst
 
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyyActive Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
RaminGhanbari2
 
Quantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLMQuantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLM
Vijayananda Mohire
 
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - MydbopsScaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Mydbops
 
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALLBLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
Liveplex
 
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
Toru Tamaki
 
Observability For You and Me with OpenTelemetry
Observability For You and Me with OpenTelemetryObservability For You and Me with OpenTelemetry
Observability For You and Me with OpenTelemetry
Eric D. Schabell
 
20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf
Sally Laouacheria
 
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Erasmo Purificato
 
How RPA Help in the Transportation and Logistics Industry.pptx
How RPA Help in the Transportation and Logistics Industry.pptxHow RPA Help in the Transportation and Logistics Industry.pptx
How RPA Help in the Transportation and Logistics Industry.pptx
SynapseIndia
 
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Bert Blevins
 
Quality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of TimeQuality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of Time
Aurora Consulting
 
What's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptxWhat's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptx
Stephanie Beckett
 
Best Programming Language for Civil Engineers
Best Programming Language for Civil EngineersBest Programming Language for Civil Engineers
Best Programming Language for Civil Engineers
Awais Yaseen
 
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdfBT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
Neo4j
 

Recently uploaded (20)

Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
 
INDIAN AIR FORCE FIGHTER PLANES LIST.pdf
INDIAN AIR FORCE FIGHTER PLANES LIST.pdfINDIAN AIR FORCE FIGHTER PLANES LIST.pdf
INDIAN AIR FORCE FIGHTER PLANES LIST.pdf
 
find out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challengesfind out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challenges
 
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
 
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
 
Research Directions for Cross Reality Interfaces
Research Directions for Cross Reality InterfacesResearch Directions for Cross Reality Interfaces
Research Directions for Cross Reality Interfaces
 
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyyActive Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
 
Quantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLMQuantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLM
 
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - MydbopsScaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
 
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALLBLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
BLOCKCHAIN FOR DUMMIES: GUIDEBOOK FOR ALL
 
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
 
Observability For You and Me with OpenTelemetry
Observability For You and Me with OpenTelemetryObservability For You and Me with OpenTelemetry
Observability For You and Me with OpenTelemetry
 
20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf
 
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
 
How RPA Help in the Transportation and Logistics Industry.pptx
How RPA Help in the Transportation and Logistics Industry.pptxHow RPA Help in the Transportation and Logistics Industry.pptx
How RPA Help in the Transportation and Logistics Industry.pptx
 
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
 
Quality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of TimeQuality Patents: Patents That Stand the Test of Time
Quality Patents: Patents That Stand the Test of Time
 
What's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptxWhat's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptx
 
Best Programming Language for Civil Engineers
Best Programming Language for Civil EngineersBest Programming Language for Civil Engineers
Best Programming Language for Civil Engineers
 
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdfBT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
 

Solving anything in VCL

  • 1. Solving anything in VCL Andrew Betts, Financial Times
  • 2. Who is this guy? 1. Helped build the original HTML5 web app for the FT 2. Created our Origami component system 3. Ran FT Labs for 3 years 4. Now working with Nikkei to rebuild nikkei.com 5. Also W3C Technical Architecture Group 6. Live in Tokyo, Japan 2 Pic of me.
  • 3. Nikkei 1. Largest business newspaper in Japan 2. Globally better known for the Nikkei 225 stock index 3. Around 3 million readers
  • 4. 4
  • 5. 5
  • 6. 6
  • 7. 7
  • 8. 8
  • 9. Coding on the edge 9
  • 10. Benefits of edge code 10 1. Smarter routing 2. Faster authentication 3. Bandwidth management 4. Higher cache hit ratio
  • 11. Edge side includes 11 <esi:include src="http://example.com/1.html" alt="http://bak.example.com/2.html" onerror="continue"/> index.html my-news.html Cache-control: max-age=86400 Cache-control: private Server
  • 12. The VCL way 1. Request and response bodies are opaque 2. Everything happens in metadata 3. Very restricted: No loops or variables 4. Extensible: some useful Fastly extensions include geo-ip and crypto 5. Incredibly powerful when used creatively 12
  • 13. SOA Routing Send requests to multiple microservice backends This is great if... You have a microservice architecture Many backends, one domain You add/remove services regularly 1
  • 14. SOA Routing in VCL 14 Front page Article page Timeline Content API Choose a backend based on a path match of the request URL /article/123
  • 15. SOA Routing in VCL 15 [ { name, paths, host, useSsl, }, … ] {{#each backends}} backend {{name}} { .port = "{{p}}"; .host = "{{h}}"; } {{/each}} let vclContent = vclTemplate(data); fs.writeFileSync( vclFilePath, vclContent, 'UTF-8' ); services.json Defines all the backends and paths that they control. routing.vcl.handlebars VCL template with Handlebars placeholders for backends & routing build.js Task script to merge service data into VCL template
  • 16. SOA Routing: key tools and techniques ● Choose a backend: set req.backend = {{backendName}}; ● Match a route pattern: if (req.url ~ "{{pattern}}") ● Remember to set a Host header: set req.http.Host = "{{backendhost}}"; ● Upload to Fastly using FT Fastly tools ○ https://github.com/Financial-Times/fastly-tools 16
  • 17. service-registry.json 17 [ { "name": "front-page", "paths": [ "/(?qs)", "/.resources/front/(**)(?qs)" ], "hosts": [ "my-backend.ap-northeast-1.elasticbeanstalk.com" ] }, { "name": "article-page", ... } ] Common regex patterns simplified into shortcuts
  • 18. routing.vcl.handlebars 18 {{#each backends}} backend {{name}} { .port = "{{port}}"; .host = "{{host}}"; .ssl = {{use_ssl}}; .probe = { .request = "GET / HTTP/1.1" "Host: {{host}}" "Connection: close"; } } {{/each}} sub vcl_recv { {{#each routes}} if (req.url ~ "{{pattern}}") { set req.backend = {{backend}}; {{#if target}} set req.url = regsub(req.url, "{{pattern}}", "{{target}}"); {{/if}} {{!-- Fastly doesn't support the host_header property in backend definitions --}} set req.http.Host = "{{backendhost}}"; } {{/each}} return(lookup); }
  • 19. build.js 19 const vclTemplate = handlebars.compile(fs.readFileSync('routing.vcl.handlebars'), 'UTF-8')); const services = require('services.json'); // ... transform `services` into `viewData` let vclContent = vclTemplate(viewData); fs.writeFileSync(vclFilePath, vclContent, 'UTF-8');
  • 20. UA Targeting Return user-agent specific responses without destroying your cache hit ratio This is great if... You have a response that is tailored to different device types There are a virtually infinite number of User-Agent values 2
  • 22. UA Targeting 22 /normalizeUA /polyfill.js?ua=ie/11 /polyfill.js Add the normalised User- Agent to the URL and restart the original request Add a Vary: User-Agent header to the response before sending it back to the browser We call this a preflight request
  • 23. UA targeting: key tools and techniques ● Remember something using request headers: set req.http.tmpOrigURL = req.url; ● Change the URL of the backend request: set req.url = "/api/normalizeUA?ua=" req.http.User-Agent; ● Reconstruct original URL adding a backend response header: set req.url = req.http.tmpOrigURL "?ua=" resp.http.NormUA; ● Restart to send the request back to vcl_recv: restart; 23
  • 24. ua-targeting.vcl 24 sub vcl_recv { if (req.url ~ "^/v2/polyfill." && req.url !~ "[?&]ua=") { set req.http.X-Orig-URL = req.url; set req.url = "/v2/normalizeUa?ua=" urlencode(req.http.User-Agent); } } sub vcl_deliver { if (req.url ~ "^/vd/normalizeUa" && resp.status == 200 && req.http.X-Orig-URL) { set req.http.Fastly-force-Shield = "1"; if (req.http.X-Orig-URL ~ "?") { set req.url = req.http.X-Orig-URL "&ua=" resp.http.UA; } else { set req.url = req.http.X-Orig-URL "?ua=" resp.http.UA; } restart; } else if (req.url ~ "^/vd/polyfill..*[?&]ua=" && req.http.X-Orig-URL && req.http.X-Orig-URL !~ "[?&]ua=") { add resp.http.Vary = "User-Agent"; } return(deliver); }
  • 25. Authentication Implement integration with your federated identity system entirely in VCL This is great if... You have a federated login system using a protocol like OAuth You want to annotate requests with a simple verified authentication state 3
  • 26. Magic circa 2001 26 <?php echo $_SERVER['PHP_AUTH_USER']; ?> http://intranet/my/example/app
  • 27. New magic circa 2016 27 app.get('/', (req, res) => { res.end(req.get('Nikkei-UserID')); });
  • 28. Authentication 28 /article/123 Nikkei-UserID: andrew.betts Nikkei-UserRank: premium Vary: Nikkei-UserRank Article Cookie: Auth=a139fm24... Cache-control: private
  • 29. Authentication: key tools and techniques ● Get a cookie by name: req.http.Cookie:MySiteAuth ● Base64 normalisation: digest.base64url_decode(), digest.base64_decode ● Extract the parts of a JSON Web Token (JWT): regsub({{cookie}}, "(^[^.]+).[^.]+.[^.]+$", "1"); ● Check JWT signature: digest.hmac_sha256_base64() ● Set trusted headers for backend use: req.http.Nikkei-UserID = regsub({{jwt}}, {{pattern}}, "1"); 29
  • 30. authentication.vcl 30 if (req.http.Cookie:NikkeiAuth) { set req.http.tmpHeader = regsub(req.http.Cookie:NikkeiAuth, "(^[^.]+).[^.]+.[^.]+$", "1"); set req.http.tmpPayload = regsub(req.http.Cookie:NikkeiAuth, "^[^.]+.([^.]+).[^.]+$", "1"); set req.http.tmpRequestSig = digest.base64url_decode( regsub(req.http.Cookie:NikkeiAuth, "^[^.]+.[^.]+.([^.]+)$", "1") ); set req.http.tmpCorrectSig = digest.base64_decode( digest.hmac_sha256_base64("{{jwt_secret}}", req.http.tmpHeader "." req.http.tmpPayload) ); if (req.http.tmpRequestSig != req.http.tmpCorrectSig) { error 754 "/login; NikkeiAuth=deleted; expires=Thu, 01 Jan 1970 00:00:00 GMT"; } ... continues ...
  • 31. authentication.vcl (cont) 31 set req.http.tmpPayload = digest.base64_decode(req.http.tmpPayload); set req.http.Nikkei-UserID = regsub(req.http.tmpPayload, {"^.*?"sub"s*:s*"(w+)".*?$"}, "1"); set req.http.Nikkei-Rank = regsub(req.http.tmpPayload, {"^.*?"ds_rank"s*:s*"(w+)".*?$"}, "1"); unset req.http.base64_header; unset req.http.base64_payload; unset req.http.signature; unset req.http.valid_signature; unset req.http.payload; } else { set req.http.Nikkei-UserID = "anonymous"; set req.http.Nikkei-Rank = "anonymous"; }
  • 32. Feature flags Dark deployments and easy A/B testing without reducing front end perf or cache efficiency This is great if... You want to serve different versions of your site to different users Test new features internally on prod before releasing them to the world 4
  • 33. 33
  • 34. 34 Now you see it...
  • 35. Feature flags parts 35 ● A flags registry - a JSON file will be fine ○ Include all possible values of each flag and what percentage of the audience it applies to ○ Publish it statically - S3 is good for that ● A flag toggler tool ○ Reads the JSON, renders a table, writes an override cookie with chosen values ● An API ○ Reads the JSON, responds to requests by calculating a user's position number on a 0-100 line and matches them with appropriate flag values
  • 36. Feature flags 36 Flags API Article Merge the flags response with the override cookie, set as HTTP header, restart original request... /article/123 Cookie: Flgs- Override= Foo=10; /api/flags?userid=6453 Flgs: highlights=true; Foo=42; Flgs: highlights=true; Foo=42; Foo=10 Vary: Flgs
  • 37. ExpressJS flags middleware 37 app.get('/', (req, res) => { if (req.flags.has('highlights')) { // Enable highlights feature } }); HTTP/1.1 200 OK Vary: Nikkei-Flags ...
  • 38. Dynamic backends Override backend rules at runtime without updating your VCL This is great if... You have a bug you can't reproduce without the request going through the CDN You want to test a local dev version of a service with live integrations 5
  • 39. Dynamic backends 39 Developer laptopDynamic backend proxy (node-http-proxy) Check forwarded IP is whitelisted or auth header is also present GET /article/123 Backend-Override: article -> fc57848a.ngrok.io ngrok fc57848a .ngrok.io
  • 40. Dynamic backends: key tools and techniques ● Extract backend to override: set req.http.tmpORBackend = regsub(req.http.Backend-Override, "s*->.*$", ""); ● Check whether current backend matches if (req.http.tmpORBackend == req.http.tmpCurrentBackend) { ● Use node-http-proxy for the proxy app ○ Remember res.setHeader('Vary', 'Backend-Override'); ○ I use {xfwd: false, changeOrigin: true, hostRewrite: true} 40
  • 41. Debug headers Collect request lifecycle information in a single HTTP response header This is great if... You find it hard to understand what path the request is taking through your VCL You have restarts in your VCL and need to see all the individual backend requests, not just the last one 6
  • 45. Debug journey 45 vcl_recv { set req.http.tmpLog = if (req.restarts == 0, "", req.http.tmpLog ";"); # ... routing ... set req.http.tmpLog = req.http.tmpLog " {{backend}}:" req.url; } vcl_fetch { set req.http.tmpLog = req.http.tmpLog " fetch"; ... } vcl_hit { set req.http.tmpLog = req.http.tmpLog " hit"; ... } vcl_miss { set req.http.tmpLog = req.http.tmpLog " miss"; ... } vcl_pass { set req.http.tmpLog = req.http.tmpLog " pass"; ... } vcl_deliver { set resp.http.CDN-Process-Log = req.http.tmpLog; }
  • 46. Debug journey 46 CDN-Process-Log: apigw:/flags/v1/rnikkei/allocate?output=diff&segid=foo&rank=X HIT (hits=2 ttl=1.204/5.000 age=4 swr=300.000 sie=604800.000); rnikkei_front_0:/ MISS (hits=0 ttl=1.000/1.000 age=0 swr=300.000 sie=86400.000)
  • 47. RUM++ Resource Timing API + data Fastly exposes in VCL. And no backend. This is great if... You want to track down hotspots of slow response times You'd like to understand how successfully end users are being matched to their nearest PoPs 7
  • 48. Resource timing on front end 48 var rec = window.performance.getEntriesByType("resource") .find(rec => rec.name.indexOf('[URL]') !== -1) ; (new Image()).src = '/sendBeacon'+ '?dns='+(rec.domainLookupEnd-rec.domainLookupStart)+ '&connect='+(rec.connectEnd-rec.connectStart)+ '&req='+(rec.responseStart-rec.requestStart)+ '&resp='+(rec.responseEnd-rec.responseStart) ;
  • 49. Add CDN data in VCL & respond with synthetic 49 sub vcl_recv { if (req.url ~ "^/sendBeacon") { error 204 "No content"; } }
  • 51. 51
  • 53. Beyond ASCII Use these encoding tips to embed non-ASCII content in your VCL file. This is great if... Your users don't speak English, but you can only write ASCII in VCL files 8
  • 54. Everyone does UTF-8 now, right? 54 synthetic {"Responsive Nikkeiアルファプログラムのメンバーの皆様、ア ルファバージョンのサイトにアクセスできない場合、 rnfeedback@nex.nikkei.co.jp までその旨連絡ください。"};
  • 55. 55
  • 56. Quick conversion 56 "string" .split('') .map( char => char.codePointAt(0) < 128 ? char : "&#"+char.codePointAt(0)+";" ) .join('') ;
  • 59. 59
  • 60. I have 68 backends 60
  • 61. Varnishlog to the rescue A way to submit a varnish transaction ID to the API, and get all varnishlog events relating to that transaction, including related (backend) transactions 61 > fastly log 1467852934 17 SessionOpen c 66.249.72.22 47013 :80 17 ReqStart c 66.249.72.22 47013 1467852934 17 RxRequest c GET 17 RxURL c /articles/123 17 RxProtocol c HTTP/1.1 17 RxHeader c Host: www.example.com ...
  • 62. Thanks for listening 62 Andrew Betts andrew.betts@ft.com @triblondon Get the slides bit.ly/ft-fastly-altitude-2016