SlideShare a Scribd company logo
PROGRAMMING PROXIES
TO DO WHAT WE NEED SO
WE DON'T HAVE TO TALK
TO THE NETWORK GUYS
AGAIN
@lmacvittie from @f5networks at #gluecon
Lori MacVittie
Sr. Product Manager, Emerging Technologies
F5 Networks
Deployment
patterns
WHY WOULD YOU NEED
TO TALK TO THE
NETWORK GUYS
ANYWAY?
@lmacvittie #gluecon
DEPLOYMENT PATTERNS USE LAYER 7 ROUTING
Canary Deployments Blue/Green Deployments
A/B Testing
v.1
v.2
v.3
API Management
Redirection Replication
(Dark Architecture)
@lmacvittie #gluecon
ROUTING IS A NETWORK THING
Router Switch FirewallDDoS Protection Load BalancingDNS
CORE NETWORK (SHARED)
THE NETWORK GUYS ARE GENERALLY RESPONSIBLE FOR LAYER 7 ROUTING
@lmacvittie #gluecon
THEY DON’T WANT YOU TOUCHING THEIR TOYS
@lmacvittie #gluecon
proxiesSO WHAT DO YOU DO?
@lmacvittie #gluecon
Go forward and
backwards.
PROXIES
A Reverse Proxy sits between the user and an
application and can do things like caching, load
balancing, and security on behalf of the app.
A Forward Proxy sits between the user and an
application and does things like caching and
stopping you from using Facebook at work.
Today we’re (mostly) talking about the Reverse kind of Proxy.
@lmacvittie #gluecon
Proxies are
application-
aware with
network chops.
They are fluent
in both the
language of
applications
and networks.
PROXIES
THIS IS WHERE NETWORK STUFFS LIVE
THIS IS WHERE PROXIES LIVE
THIS IS WHERE APPLICATIONS LIVE
DATA
NETWORK
TRANSPORT
SESSION
PRESENTATION
APPLICATION
MAC ADDRESS
IP ADDRESS
TCP
SOCKS
SSL
HTTP / SPDY
L2-3 SERVICES
L4-7 SERVICES
HTML JSON XMLCSS
@lmacvittie #gluecon
WEB SERVER
PROXY
MODEL
VERSUS
PROGRAMMABLE
PROXY
MODEL
Proxy
Code
Config
Web Server Proxy Model
Application Stuffs
Network Stuffs
Programmable Proxy Model
Proxy
Code
Config
Application Stuffs
Network Stuffs
@lmacvittie #gluecon
A programmable
proxy is a proxy
that lets you
write code that
interacts with
both application
and network
stuffs like load
balancing and
application (L7)
routing and
databases.
PROGRAMMABLE
PROXIES
var onRequest = function(request, response, next ) {
var cookie = new Cookies( request, response );
var bugz_login = cookie.get("Bugzilla_login");
if( !logged_in || !bugz_login ) {
vs_a.newRequest(request, response, next);
return;
}
connection.query('SELECT opt_in from abtest where
userid=' + bugz_login, function(err, rows, fields) {
if (err) throw err;
var opt_in = rows[0].opt_in;
if( !opt_in ) {
vs_a.newRequest(request, response, next);
return;
} else {
vs_b.newRequest(request, response, next);
return;
}
});
Bugzilla
Bugzilla-A
Bugzilla-B
APPLICATION
STUFFS
NETWORK
STUFFS
@lmacvittie #gluecon
Deployment
patterns with
programmable
proxies
EXAMPLES
@lmacvittie #gluecon
A/B TESTING
Devices
Internet
Service Pool A
Service Pool B
serverGroupA
serverGroupB
vs1
vs2
• Transparently direct users to either version “A” or version “B”
• Increase or decrease traffic to each version in an instant
• Customize the selection criteria to your needs with a short Node.js script
• Use resources like databases or web APIs as part of the decision
@lmacvittie #gluecon
MySQL
Database
var assert = require('assert');
var os = require('os');
var http = require('http');
var fpm = require('lrs/forwardProxyModule');
var vsm = require('lrs/virtualServerModule');
var mysql = require('mysql');
var Cookies = require('cookies');
var proxyhost = os.hostname();
var vs = vsm.find('Bugzilla');
var vs_a = vsm.find('Bugzilla-A');
var vs_b = vsm.find('Bugzilla-B');
var logged_in = false;
// Log to a database
var connection = mysql.createConnection({
host : '192.168.22.22',
user : ‘xxxx',
password : ‘yyyyyyyyy',
database : 'abtesting'
});
var onRequest = function(request, response, next ) {
var cookie = new Cookies( request, response );
var bugz_login = cookie.get("Bugzilla_login");
if( !logged_in || !bugz_login ) {
// Default action: Send to A
vs_a.newRequest(request, response, next);
return;
}
// Add the user to the database automatically if they don't already exist
connection.query('INSERT INTO abtest (userid, ip) select * FROM (SELECT ' +
bugz_login + ', "' + request.connection.remoteAddress + '") as tmp 
WHERE NOT EXISTS(SELECT userid from abtest where userid=' +
bugz_login + ')', function(err, rows, fields) {
if (err) throw err;
// Use the database to decide which server to send this request to
connection.query('SELECT opt_in from abtest where userid=' + bugz_login,
function(err, rows, fields) {
if (err) throw err;
var opt_in = rows[0].opt_in;
if( !opt_in ) { vs_a.newRequest(request, response, next);
return;
} else { vs_b.newRequest(request, response, next);
return;
}
});
});
};
// onRequest
var onExist = function(vs) {
if(vs.id == 'Bugzilla') {
vs.on('request', onRequest);
connection.connect();
logged_in = true;
setInterval(keepAlive, 60000);
}
};
vsm.on('exist', 'Bugzilla', onExist);
URI MANAGEMENT (REDIRECTION)
Devices
Internet
• Manage hundreds of redirects/rewrites
(www.example.com/app2  www.example.com/app/v2)
• Update redirects without incurring potential outages
• Turn over management to the business folks because updating http conf files
every other day isn’t exactly the job you signed up for @lmacvittie #gluecon
serverGroupA
serverGroupB
vs1
vs2
TRAFFIC REPLICATION
Devices
Internet
Production
Staging
serverGroupA
serverGroupB
LB
LB
• Selected requests are replicated to both environments
• Selection criteria can be custom logic or network or application variables
@lmacvittie #gluecon
TRAFFIC REPLICATION
Devices
Internet
Production
Staging
serverGroupA
serverGroupB
LB
LB
• Production response flows back to user immediately
• Staging response is blocked from clients
• Custom code can compare production and staging response, report errors,
slowness, etc. and can log for later analysis @lmacvittie #gluecon
function forwardRequest(request, response, next) {
"use strict";
var vsm = require('lrs/virtualServerModule');
var http = require('http');
var mgmt = require('lrs/managementRest');
function ReplicateTraffic(scenarioName, primaryVSName, secondaryPort) {
var self = this;
self.scenarioName = scenarioName;
self.primaryVS = primaryVSName;
self.port = secondaryPort;
//We need a secondary port that we expect is a loopback virtual IP that
//goes to the secondary virtual server
vsm.on('exist', primaryVSName, function(vs) {
vs.on('request', function(req, res, next) {
self.replicate(req, res, next);
});
});
}
ReplicateTraffic.prototype.cloneReq = function(req) {
var newReq = http.request({ host: "127.0.0.1",
port: this.port,
method: req.method,
path: req.url,
headers: req.headers},
function() {});
return newReq;
}
ReplicateTraffic.prototype.replicate = function(req, res, next) {
if(req.method == 'GET' || req.method == 'HEAD') {
// Only do GET and HEAD
var newReq = this.cloneReq(req);
// I want to do vsB.newRequest(newReq) but cannot
// so I loop it through a dummy vip in cloneReq
newReq.on('response', function(res)
{ console.log('saw B resp'); });
newReq.end();
}
next();
}
var repl = new ReplicateTraffic("xxx",
'vsAandB',
15000);
Network
stuffs
belong in
the network.
WHEN SHOULD I USE A
PROGRAMMABLE
PROXY?
@lmacvittie #gluecon
How to choose
between proxy
and app
NETWORK
STUFFS
• chooses an application instance based on HTTP header
• Content-type, URI, device (user-agent), API version, HTTP
CRUD operation, etc…
• chooses an application instance based on payload
• Value of a key in a JSON payload, XML element value,
HTML form data, etc…
• would force you to use an HTTP redirect
• Changing URLs
• Deprecated API calls
• is enforcing a quota (rate limiting) to avoid overwhelming
applications
• needs to do a network thing (e.g. app routing, load balancing,
service chaining) that requires application data from an
external source (database, API call, etc…)
Put the logic in a proxy if the logic ….
@lmacvittie #gluecon
Use
programmable
proxies to
implement
deployment
patterns that
require more
logic than basic
conditionals or
data from
external sources
DEVOPS
PATTERNS
@lmacvittie #gluecon
Canary Deployments
Blue/Green Deployments
A/B Testing
v.1
v.2
v.3
API Management
Redirection
Replication
(Dark Architecture)
If you can code
it, you can do it
(probably)
PROGRAMMABLE
PROXIES
More things you can do with a programmable proxy
Application
security
Broker
authentication
Identity
devices and
users
v1.04
API version
matching
Rate Limiting /
API quota
enforcement
@lmacvittie #gluecon
Programmability in the Network: Traffic Replication
Programmability in the Network: Canary Deployments
Programmability in the Network: Blue-Green Deployment Pattern
Devops.com - Code in Flight
Gluecon 2013 - Dark Architecture and How to Forklift Upgrade Your System
Dyn's CTO Cory von Wallenstein:
LineRate Proxy Download (https://linerate.f5.com/)
@lmacvittie #gluecon

More Related Content

PPTX
Devops is all greek
PPTX
Metrics Driven DevOps - Automate Scalability and Performance Into your Pipeline
PDF
Performance Testing for Mobile Apps & Sites using Apache JMeter
PPTX
Deploy Faster Without Failing Faster - Metrics-Driven - Dynatrace User Groups...
PPTX
DevOps Days Toronto: From 6 Months Waterfall to 1 hour Code Deploys
PPTX
OOP 2016 - Building Software That Eats The World
PPTX
DevOps Pipelines and Metrics Driven Feedback Loops
PPTX
Performance Metrics Driven CI/CD - Introduction to Continuous Innovation and ...
Devops is all greek
Metrics Driven DevOps - Automate Scalability and Performance Into your Pipeline
Performance Testing for Mobile Apps & Sites using Apache JMeter
Deploy Faster Without Failing Faster - Metrics-Driven - Dynatrace User Groups...
DevOps Days Toronto: From 6 Months Waterfall to 1 hour Code Deploys
OOP 2016 - Building Software That Eats The World
DevOps Pipelines and Metrics Driven Feedback Loops
Performance Metrics Driven CI/CD - Introduction to Continuous Innovation and ...

What's hot (16)

PPTX
How to explain DevOps to your mom
PPTX
Top Java Performance Problems and Metrics To Check in Your Pipeline
PPTX
DOES SFO 2016 - Chris Fulton - CD for DBs
PDF
Metrics-driven Continuous Delivery
PPTX
Cloud Networking
PPTX
DevOps Transformation at Dynatrace and with Dynatrace
PDF
Using microsoft application insights to implement a build, measure, learn loop
PPTX
Monitoring as a Self-Service in Atlassian DevOps Toolchain
PDF
Micro Service – The New Architecture Paradigm
PDF
Creating Event Driven Serverless Applications - Sandeep - Adobe - Serverless ...
PPTX
DevOps for AI Apps
PPTX
Four Practices to Fix Your Top .NET Performance Problems
PDF
FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...
PDF
Revolutionize DevOps with ML capabilities. Introduction to Amazon CodeGuru an...
PPTX
NashTech - Azure Application Insights
PDF
Revolutionize DevOps with ML capabilities. Introduction to Amazon CodeGuru an...
How to explain DevOps to your mom
Top Java Performance Problems and Metrics To Check in Your Pipeline
DOES SFO 2016 - Chris Fulton - CD for DBs
Metrics-driven Continuous Delivery
Cloud Networking
DevOps Transformation at Dynatrace and with Dynatrace
Using microsoft application insights to implement a build, measure, learn loop
Monitoring as a Self-Service in Atlassian DevOps Toolchain
Micro Service – The New Architecture Paradigm
Creating Event Driven Serverless Applications - Sandeep - Adobe - Serverless ...
DevOps for AI Apps
Four Practices to Fix Your Top .NET Performance Problems
FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...
Revolutionize DevOps with ML capabilities. Introduction to Amazon CodeGuru an...
NashTech - Azure Application Insights
Revolutionize DevOps with ML capabilities. Introduction to Amazon CodeGuru an...
Ad

Similar to Programming proxies to do what we need so we don't have to talk to the network guys again (20)

PDF
Scalable Architecture 101
PDF
Load balancing at tuenti
PDF
Apache HTTPD 2.4 Reverse Proxy: The Hidden Gem
PDF
Apache httpd 2.4 Reverse Proxy: The Hidden Gem
PPTX
RubyConf 2012: Custom Reverse Proxies
PDF
ApacheConNA 2015: Apache httpd 2.4 Reverse Proxy
ODP
MNPHP Scalable Architecture 101 - Feb 3 2011
PPTX
RESTful modules in zf2
PPTX
ql.io: Consuming HTTP at Scale
PPTX
Solving anything in VCL
PPTX
Crossfire DDoS Protection
KEY
Apache httpd 2.4 Reverse Proxy
KEY
Modern Web Technologies — Jerusalem Web Professionals, January 2011
KEY
Modern Web technologies (and why you should care): Megacomm, Jerusalem, Febru...
PDF
HAProxy tech talk
PDF
Surge 2012 fred_moyer_lightning
PDF
Acus08 Advanced Load Balancing Apache2.2
PDF
Apache httpd Reverse Proxy and Tomcat
KEY
Apache httpd-2.4 : Watch out cloud!
Scalable Architecture 101
Load balancing at tuenti
Apache HTTPD 2.4 Reverse Proxy: The Hidden Gem
Apache httpd 2.4 Reverse Proxy: The Hidden Gem
RubyConf 2012: Custom Reverse Proxies
ApacheConNA 2015: Apache httpd 2.4 Reverse Proxy
MNPHP Scalable Architecture 101 - Feb 3 2011
RESTful modules in zf2
ql.io: Consuming HTTP at Scale
Solving anything in VCL
Crossfire DDoS Protection
Apache httpd 2.4 Reverse Proxy
Modern Web Technologies — Jerusalem Web Professionals, January 2011
Modern Web technologies (and why you should care): Megacomm, Jerusalem, Febru...
HAProxy tech talk
Surge 2012 fred_moyer_lightning
Acus08 Advanced Load Balancing Apache2.2
Apache httpd Reverse Proxy and Tomcat
Apache httpd-2.4 : Watch out cloud!
Ad

More from Lori MacVittie (15)

PDF
So you think you can scale containers
PPTX
State of Application Delivery 2017 - Cloud Insights
PPTX
State of Application Delivery 2017 - DevOps Insights
PPTX
So you think you can scale
PPTX
Beyond POLB (Plain Old Load Balancing)
PPTX
Pushing the DevOps envelope into the network with microservices
PPTX
Architectural Patterns for Scaling Microservices and APIs - GlueCon 2015
PPTX
The Internet of Security Things (A Story about Change)
PPTX
HTTP/2 Changes Everything
PPTX
5 ways to use node.js in the network
PPTX
What are Software Defined Application Services
PPTX
Operationalize all the network things
PPTX
Dynamic Infrastructure
PPT
Nine Ways to Use Network-Side Scripting
PDF
Web 2 And Application Delivery Public
So you think you can scale containers
State of Application Delivery 2017 - Cloud Insights
State of Application Delivery 2017 - DevOps Insights
So you think you can scale
Beyond POLB (Plain Old Load Balancing)
Pushing the DevOps envelope into the network with microservices
Architectural Patterns for Scaling Microservices and APIs - GlueCon 2015
The Internet of Security Things (A Story about Change)
HTTP/2 Changes Everything
5 ways to use node.js in the network
What are Software Defined Application Services
Operationalize all the network things
Dynamic Infrastructure
Nine Ways to Use Network-Side Scripting
Web 2 And Application Delivery Public

Recently uploaded (20)

PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Electronic commerce courselecture one. Pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Empathic Computing: Creating Shared Understanding
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
cuic standard and advanced reporting.pdf
PDF
Encapsulation theory and applications.pdf
PPT
Teaching material agriculture food technology
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
NewMind AI Monthly Chronicles - July 2025
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Machine learning based COVID-19 study performance prediction
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
Advanced methodologies resolving dimensionality complications for autism neur...
Electronic commerce courselecture one. Pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Mobile App Security Testing_ A Comprehensive Guide.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Empathic Computing: Creating Shared Understanding
NewMind AI Weekly Chronicles - August'25 Week I
cuic standard and advanced reporting.pdf
Encapsulation theory and applications.pdf
Teaching material agriculture food technology
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
NewMind AI Monthly Chronicles - July 2025
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Machine learning based COVID-19 study performance prediction
Encapsulation_ Review paper, used for researhc scholars
Dropbox Q2 2025 Financial Results & Investor Presentation
Chapter 3 Spatial Domain Image Processing.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm

Programming proxies to do what we need so we don't have to talk to the network guys again

  • 1. PROGRAMMING PROXIES TO DO WHAT WE NEED SO WE DON'T HAVE TO TALK TO THE NETWORK GUYS AGAIN @lmacvittie from @f5networks at #gluecon Lori MacVittie Sr. Product Manager, Emerging Technologies F5 Networks
  • 2. Deployment patterns WHY WOULD YOU NEED TO TALK TO THE NETWORK GUYS ANYWAY? @lmacvittie #gluecon
  • 3. DEPLOYMENT PATTERNS USE LAYER 7 ROUTING Canary Deployments Blue/Green Deployments A/B Testing v.1 v.2 v.3 API Management Redirection Replication (Dark Architecture) @lmacvittie #gluecon
  • 4. ROUTING IS A NETWORK THING Router Switch FirewallDDoS Protection Load BalancingDNS CORE NETWORK (SHARED) THE NETWORK GUYS ARE GENERALLY RESPONSIBLE FOR LAYER 7 ROUTING @lmacvittie #gluecon
  • 5. THEY DON’T WANT YOU TOUCHING THEIR TOYS @lmacvittie #gluecon
  • 6. proxiesSO WHAT DO YOU DO? @lmacvittie #gluecon
  • 7. Go forward and backwards. PROXIES A Reverse Proxy sits between the user and an application and can do things like caching, load balancing, and security on behalf of the app. A Forward Proxy sits between the user and an application and does things like caching and stopping you from using Facebook at work. Today we’re (mostly) talking about the Reverse kind of Proxy. @lmacvittie #gluecon
  • 8. Proxies are application- aware with network chops. They are fluent in both the language of applications and networks. PROXIES THIS IS WHERE NETWORK STUFFS LIVE THIS IS WHERE PROXIES LIVE THIS IS WHERE APPLICATIONS LIVE DATA NETWORK TRANSPORT SESSION PRESENTATION APPLICATION MAC ADDRESS IP ADDRESS TCP SOCKS SSL HTTP / SPDY L2-3 SERVICES L4-7 SERVICES HTML JSON XMLCSS @lmacvittie #gluecon
  • 9. WEB SERVER PROXY MODEL VERSUS PROGRAMMABLE PROXY MODEL Proxy Code Config Web Server Proxy Model Application Stuffs Network Stuffs Programmable Proxy Model Proxy Code Config Application Stuffs Network Stuffs @lmacvittie #gluecon
  • 10. A programmable proxy is a proxy that lets you write code that interacts with both application and network stuffs like load balancing and application (L7) routing and databases. PROGRAMMABLE PROXIES var onRequest = function(request, response, next ) { var cookie = new Cookies( request, response ); var bugz_login = cookie.get("Bugzilla_login"); if( !logged_in || !bugz_login ) { vs_a.newRequest(request, response, next); return; } connection.query('SELECT opt_in from abtest where userid=' + bugz_login, function(err, rows, fields) { if (err) throw err; var opt_in = rows[0].opt_in; if( !opt_in ) { vs_a.newRequest(request, response, next); return; } else { vs_b.newRequest(request, response, next); return; } }); Bugzilla Bugzilla-A Bugzilla-B APPLICATION STUFFS NETWORK STUFFS @lmacvittie #gluecon
  • 12. A/B TESTING Devices Internet Service Pool A Service Pool B serverGroupA serverGroupB vs1 vs2 • Transparently direct users to either version “A” or version “B” • Increase or decrease traffic to each version in an instant • Customize the selection criteria to your needs with a short Node.js script • Use resources like databases or web APIs as part of the decision @lmacvittie #gluecon MySQL Database
  • 13. var assert = require('assert'); var os = require('os'); var http = require('http'); var fpm = require('lrs/forwardProxyModule'); var vsm = require('lrs/virtualServerModule'); var mysql = require('mysql'); var Cookies = require('cookies'); var proxyhost = os.hostname(); var vs = vsm.find('Bugzilla'); var vs_a = vsm.find('Bugzilla-A'); var vs_b = vsm.find('Bugzilla-B'); var logged_in = false; // Log to a database var connection = mysql.createConnection({ host : '192.168.22.22', user : ‘xxxx', password : ‘yyyyyyyyy', database : 'abtesting' }); var onRequest = function(request, response, next ) { var cookie = new Cookies( request, response ); var bugz_login = cookie.get("Bugzilla_login"); if( !logged_in || !bugz_login ) { // Default action: Send to A vs_a.newRequest(request, response, next); return; } // Add the user to the database automatically if they don't already exist connection.query('INSERT INTO abtest (userid, ip) select * FROM (SELECT ' + bugz_login + ', "' + request.connection.remoteAddress + '") as tmp WHERE NOT EXISTS(SELECT userid from abtest where userid=' + bugz_login + ')', function(err, rows, fields) { if (err) throw err; // Use the database to decide which server to send this request to connection.query('SELECT opt_in from abtest where userid=' + bugz_login, function(err, rows, fields) { if (err) throw err; var opt_in = rows[0].opt_in; if( !opt_in ) { vs_a.newRequest(request, response, next); return; } else { vs_b.newRequest(request, response, next); return; } }); }); }; // onRequest var onExist = function(vs) { if(vs.id == 'Bugzilla') { vs.on('request', onRequest); connection.connect(); logged_in = true; setInterval(keepAlive, 60000); } }; vsm.on('exist', 'Bugzilla', onExist);
  • 14. URI MANAGEMENT (REDIRECTION) Devices Internet • Manage hundreds of redirects/rewrites (www.example.com/app2  www.example.com/app/v2) • Update redirects without incurring potential outages • Turn over management to the business folks because updating http conf files every other day isn’t exactly the job you signed up for @lmacvittie #gluecon serverGroupA serverGroupB vs1 vs2
  • 15. TRAFFIC REPLICATION Devices Internet Production Staging serverGroupA serverGroupB LB LB • Selected requests are replicated to both environments • Selection criteria can be custom logic or network or application variables @lmacvittie #gluecon
  • 16. TRAFFIC REPLICATION Devices Internet Production Staging serverGroupA serverGroupB LB LB • Production response flows back to user immediately • Staging response is blocked from clients • Custom code can compare production and staging response, report errors, slowness, etc. and can log for later analysis @lmacvittie #gluecon
  • 17. function forwardRequest(request, response, next) { "use strict"; var vsm = require('lrs/virtualServerModule'); var http = require('http'); var mgmt = require('lrs/managementRest'); function ReplicateTraffic(scenarioName, primaryVSName, secondaryPort) { var self = this; self.scenarioName = scenarioName; self.primaryVS = primaryVSName; self.port = secondaryPort; //We need a secondary port that we expect is a loopback virtual IP that //goes to the secondary virtual server vsm.on('exist', primaryVSName, function(vs) { vs.on('request', function(req, res, next) { self.replicate(req, res, next); }); }); } ReplicateTraffic.prototype.cloneReq = function(req) { var newReq = http.request({ host: "127.0.0.1", port: this.port, method: req.method, path: req.url, headers: req.headers}, function() {}); return newReq; } ReplicateTraffic.prototype.replicate = function(req, res, next) { if(req.method == 'GET' || req.method == 'HEAD') { // Only do GET and HEAD var newReq = this.cloneReq(req); // I want to do vsB.newRequest(newReq) but cannot // so I loop it through a dummy vip in cloneReq newReq.on('response', function(res) { console.log('saw B resp'); }); newReq.end(); } next(); } var repl = new ReplicateTraffic("xxx", 'vsAandB', 15000);
  • 18. Network stuffs belong in the network. WHEN SHOULD I USE A PROGRAMMABLE PROXY? @lmacvittie #gluecon
  • 19. How to choose between proxy and app NETWORK STUFFS • chooses an application instance based on HTTP header • Content-type, URI, device (user-agent), API version, HTTP CRUD operation, etc… • chooses an application instance based on payload • Value of a key in a JSON payload, XML element value, HTML form data, etc… • would force you to use an HTTP redirect • Changing URLs • Deprecated API calls • is enforcing a quota (rate limiting) to avoid overwhelming applications • needs to do a network thing (e.g. app routing, load balancing, service chaining) that requires application data from an external source (database, API call, etc…) Put the logic in a proxy if the logic …. @lmacvittie #gluecon
  • 20. Use programmable proxies to implement deployment patterns that require more logic than basic conditionals or data from external sources DEVOPS PATTERNS @lmacvittie #gluecon Canary Deployments Blue/Green Deployments A/B Testing v.1 v.2 v.3 API Management Redirection Replication (Dark Architecture)
  • 21. If you can code it, you can do it (probably) PROGRAMMABLE PROXIES More things you can do with a programmable proxy Application security Broker authentication Identity devices and users v1.04 API version matching Rate Limiting / API quota enforcement @lmacvittie #gluecon
  • 22. Programmability in the Network: Traffic Replication Programmability in the Network: Canary Deployments Programmability in the Network: Blue-Green Deployment Pattern Devops.com - Code in Flight Gluecon 2013 - Dark Architecture and How to Forklift Upgrade Your System Dyn's CTO Cory von Wallenstein: LineRate Proxy Download (https://linerate.f5.com/) @lmacvittie #gluecon

Editor's Notes

  • #4: All of these deployment patterns require dynamically changing the route through the network. They require layer 7 routing.
  • #10: A programmable proxy is not the same as a web server proxy. A web server proxy separates the proxy from the application. The application can’t modify the config or behavior of the proxy. A programmable proxy brings it all together and code can interact with “config” and network stuffs as well as with application stuffs.
  • #15: Managing redirects (www.directv.com/NFL -> www.directv.com/entertainment/something) can quickly become a coordination nightmare 5 or 15 are easy, but what about hundreds? How do you respond to marketing campaigns quickly without incurring potential outages? (A typo in http.conf can bring down a web server) How can we get better control of “redirect sprawl”?