1278 lines
86 KiB
HTML
1278 lines
86 KiB
HTML
<!doctype html><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en" > <![endif]--><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en" > <![endif]--><!--[if IE 8]> <html class="no-js lt-ie9" lang="en" > <![endif]--><!--[if gt IE 8]><!--><html class="no-js" lang="en"><!--<![endif]--><head>
|
||
<meta charset="utf-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||
<meta name="author" content="Ian Miell">
|
||
<meta name="description" content="Analysis of Amazon Prime Video's shift from serverless to ECS & EC2, exploring the debate, scalability, & development time.">
|
||
<meta name="generator" content="HubSpot">
|
||
<title>Reflections on Amazon Prime Video’s Monolith Move</title>
|
||
<link rel="shortcut icon" href="https://blog.container-solutions.com/hubfs/favicon.ico">
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
|
||
<script src="/hs/hsstatic/jquery-libs/static-1.1/jquery/jquery-1.7.1.js"></script>
|
||
<script>hsjQuery = window['jQuery'];</script>
|
||
<meta property="og:description" content="Analysis of Amazon Prime Video's shift from serverless to ECS & EC2, exploring the debate, scalability, & development time.">
|
||
<meta property="og:title" content="Reflections on Amazon Prime Video’s Monolith Move">
|
||
<meta name="twitter:description" content="Analysis of Amazon Prime Video's shift from serverless to ECS & EC2, exploring the debate, scalability, & development time.">
|
||
<meta name="twitter:title" content="Reflections on Amazon Prime Video’s Monolith Move">
|
||
|
||
|
||
|
||
|
||
<style>
|
||
a.cta_button{-moz-box-sizing:content-box !important;-webkit-box-sizing:content-box !important;box-sizing:content-box !important;vertical-align:middle}.hs-breadcrumb-menu{list-style-type:none;margin:0px 0px 0px 0px;padding:0px 0px 0px 0px}.hs-breadcrumb-menu-item{float:left;padding:10px 0px 10px 10px}.hs-breadcrumb-menu-divider:before{content:'›';padding-left:10px}.hs-featured-image-link{border:0}.hs-featured-image{float:right;margin:0 0 20px 20px;max-width:50%}@media (max-width: 568px){.hs-featured-image{float:none;margin:0;width:100%;max-width:100%}}.hs-screen-reader-text{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}
|
||
</style>
|
||
|
||
<link rel="stylesheet" href="https://blog.container-solutions.com/hubfs/hub_generated/module_assets/1/9848497348/1743627661455/module_image--logo.min.css">
|
||
<link rel="stylesheet" href="https://blog.container-solutions.com/hubfs/hub_generated/template_assets/1/29086683658/1743407238685/template_CS--megamenu.css">
|
||
<link rel="stylesheet" href="https://blog.container-solutions.com/hubfs/hub_generated/module_assets/1/29104102065/1743627972543/module_CS--Megamenu__helper.min.css">
|
||
<link rel="stylesheet" href="https://blog.container-solutions.com/hubfs/hub_generated/module_assets/1/29544378357/1743627988045/module_Blog2_Normal_Sidebar_Topic_Post.min.css">
|
||
<link rel="stylesheet" href="/hs/hsstatic/AsyncSupport/static-1.501/sass/comments_listing_asset.css">
|
||
<link rel="stylesheet" href="https://blog.container-solutions.com/hubfs/hub_generated/module_assets/1/29544595978/1743628123051/module_Footer_Social_Icon_CM_copy.min.css">
|
||
<!-- Editor Styles -->
|
||
<style id="hs_editor_style" type="text/css">
|
||
#hs_cos_wrapper_module_15894459824861109 { display: block !important; padding-left: 0px !important }
|
||
</style>
|
||
|
||
|
||
|
||
<!-- Added by GoogleAnalytics integration -->
|
||
<script>
|
||
var _hsp = window._hsp = window._hsp || [];
|
||
_hsp.push(['addPrivacyConsentListener', function(consent) { if (consent.allowed || (consent.categories && consent.categories.analytics)) {
|
||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||
ga('create','UA-53586058-2','auto');
|
||
ga('send','pageview');
|
||
}}]);
|
||
</script>
|
||
|
||
<!-- /Added by GoogleAnalytics integration -->
|
||
|
||
<!-- Added by GoogleAnalytics4 integration -->
|
||
<script>
|
||
var _hsp = window._hsp = window._hsp || [];
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
|
||
var useGoogleConsentModeV2 = true;
|
||
var waitForUpdateMillis = 1000;
|
||
|
||
|
||
if (!window._hsGoogleConsentRunOnce) {
|
||
window._hsGoogleConsentRunOnce = true;
|
||
|
||
gtag('consent', 'default', {
|
||
'ad_storage': 'denied',
|
||
'analytics_storage': 'denied',
|
||
'ad_user_data': 'denied',
|
||
'ad_personalization': 'denied',
|
||
'wait_for_update': waitForUpdateMillis
|
||
});
|
||
|
||
if (useGoogleConsentModeV2) {
|
||
_hsp.push(['useGoogleConsentModeV2'])
|
||
} else {
|
||
_hsp.push(['addPrivacyConsentListener', function(consent){
|
||
var hasAnalyticsConsent = consent && (consent.allowed || (consent.categories && consent.categories.analytics));
|
||
var hasAdsConsent = consent && (consent.allowed || (consent.categories && consent.categories.advertisement));
|
||
|
||
gtag('consent', 'update', {
|
||
'ad_storage': hasAdsConsent ? 'granted' : 'denied',
|
||
'analytics_storage': hasAnalyticsConsent ? 'granted' : 'denied',
|
||
'ad_user_data': hasAdsConsent ? 'granted' : 'denied',
|
||
'ad_personalization': hasAdsConsent ? 'granted' : 'denied'
|
||
});
|
||
}]);
|
||
}
|
||
}
|
||
|
||
gtag('js', new Date());
|
||
gtag('set', 'developer_id.dZTQ1Zm', true);
|
||
gtag('config', 'G-ML0V60VEZ4');
|
||
</script>
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-ML0V60VEZ4"></script>
|
||
|
||
<!-- /Added by GoogleAnalytics4 integration -->
|
||
|
||
|
||
|
||
<link rel="amphtml" href="https://blog.container-solutions.com/reflections-on-amazon-prime-videos-monolith-move?hs_amp=true">
|
||
|
||
<meta property="og:image" content="https://blog.container-solutions.com/hubfs/hulki-okan-tabak-PdTYsSgJJNA-unsplash-2.jpg">
|
||
<meta property="og:image:width" content="300">
|
||
<meta property="og:image:height" content="200">
|
||
|
||
<meta name="twitter:image" content="https://blog.container-solutions.com/hubfs/hulki-okan-tabak-PdTYsSgJJNA-unsplash-2.jpg">
|
||
|
||
|
||
<meta property="og:url" content="https://blog.container-solutions.com/reflections-on-amazon-prime-videos-monolith-move">
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
|
||
<link rel="canonical" href="https://blog.container-solutions.com/reflections-on-amazon-prime-videos-monolith-move">
|
||
<link rel="stylesheet" href="https://blog.container-solutions.com/hubfs/Blog-Assets/prismCS.css">
|
||
<script type="text/javascript" src="https://blog.container-solutions.com/hubfs/Blog-Assets/prismCS.js"></script>
|
||
<script>
|
||
Prism.hooks.add("before-highlight", function (env) {
|
||
env.code = env.element.innerText;
|
||
});
|
||
Prism.highlightElement(code);
|
||
|
||
</script>
|
||
<meta property="og:type" content="article">
|
||
<link rel="alternate" type="application/rss+xml" href="https://blog.container-solutions.com/rss.xml">
|
||
<meta name="twitter:domain" content="blog.container-solutions.com">
|
||
<meta name="twitter:site" content="@containersoluti">
|
||
<script src="//platform.linkedin.com/in.js" type="text/javascript">
|
||
lang: en_US
|
||
</script>
|
||
|
||
<meta http-equiv="content-language" content="en">
|
||
<link rel="stylesheet" href="//7052064.fs1.hubspotusercontent-na1.net/hubfs/7052064/hub_generated/template_assets/DEFAULT_ASSET/1783348970918/template_layout.min.css">
|
||
|
||
|
||
<link rel="stylesheet" href="https://blog.container-solutions.com/hubfs/hub_generated/template_assets/1/29544378321/1743407238877/template_360_Design_Style.css">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
|
||
<script type="text/javascript" src="//cdn2.hubspot.net/hubfs/2558854/infinite_scroll_v1.js?t=1495695879614"></script>
|
||
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css" integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay" crossorigin="anonymous">
|
||
|
||
|
||
|
||
<script>
|
||
|
||
|
||
var ias = $.ias({
|
||
container : '.post-listing',
|
||
item: '.post-item',
|
||
pagination: '.blog-pagination',
|
||
next: '.next-posts-link',
|
||
});
|
||
|
||
setTimeout(function(){
|
||
$('.post-listing').masonry({
|
||
// options
|
||
itemSelector: '.post-item',
|
||
columnWidth: '.post-item',
|
||
gutter: 1,
|
||
resizesContainer: false,
|
||
percentPosition: true,
|
||
isAnimated: true,
|
||
});
|
||
}, 300);
|
||
|
||
ias.on('loaded', function(data, items) {
|
||
$('.post-listing').removeData('masonry');
|
||
setTimeout(function(){
|
||
|
||
$('.post-listing').masonry({
|
||
// options
|
||
itemSelector: '.post-item',
|
||
columnWidth: '.post-item',
|
||
gutter: 1,
|
||
resizesContainer: false,
|
||
percentPosition: true,
|
||
isAnimated: true,
|
||
});
|
||
}, 300);
|
||
})
|
||
|
||
ias.extension(new IASSpinnerExtension());
|
||
ias.extension(new IASTriggerExtension({offset:0}));
|
||
ias.extension(new IASNoneLeftExtension({text: 'There are no more pages left to load.'}));
|
||
|
||
|
||
</script>
|
||
|
||
|
||
</head>
|
||
<body class="blog-360-style2 hs-content-id-116545276742 hs-blog-post hs-blog-id-5674137972" style="">
|
||
<div class="header-container-wrapper">
|
||
<div class="header-container container-fluid">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-global_group " style="" data-widget-type="global_group" data-x="0" data-w="12">
|
||
<div class="" data-global-widget-path="generated_global_groups/30127606334.html"><div class="row-fluid-wrapper row-depth-1 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget line-top-nav center" style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_15894459824861109" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-rich_text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span id="hs_cos_wrapper_module_15894459824861109_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_rich_text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="rich_text"><div id="topwrappercarla" style="margin-left: 0!important;">
|
||
<p>Check out our <strong><a href="https://www.container-solutions.com/services" rel="noopener">Cloud Native Services</a> </strong>and<strong> </strong>book a call with one of our experts today! </p>
|
||
</div></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1588876584329219" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-space" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span class="hs-horizontal-spacer"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-3 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1588876586294221" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-space" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span class="hs-horizontal-spacer"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-4 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell header-grp header-360" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-5 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell mega-navigation wrapper equal-height-container" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-6 ">
|
||
<div class="row-fluid ">
|
||
<div class="span2 widget-span widget-type-custom_widget hidden-phone" style="" data-widget-type="custom_widget" data-x="0" data-w="2">
|
||
<div id="hs_cos_wrapper_module_1588861885855449" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-space" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span class="hs-horizontal-spacer"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span2 widget-span widget-type-custom_widget logo-image vertical-center" style="" data-widget-type="custom_widget" data-x="2" data-w="2">
|
||
<div id="hs_cos_wrapper_module_1588861885855450" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-logo" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><div aria-hidden="true" class="logo-main">
|
||
<section class="logo-image">
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_1588861885855450_hs_logo_widget" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_logo" style="" data-hs-cos-general-type="widget" data-hs-cos-type="logo"><a href="http://container-solutions.com" id="hs-link-module_1588861885855450_hs_logo_widget" style="border-width:0px;border:0px;"><img src="https://blog.container-solutions.com/hubfs/CS_blog/logo-main.svg" class="hs-image-widget " height="120" style="height: auto;width:120px;border-width:0px;border:0px;" width="120" alt="Container Solutions" title="Container Solutions"></a></span>
|
||
|
||
</section>
|
||
</div></div>
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span8 widget-span widget-type-cell mega-custom-menu header-menu vertical-center custom-menu-primary" style="" data-widget-type="cell" data-x="4" data-w="8">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-7 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1588861885855452" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-8 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1588861885855453" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-menu" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
<span id="hs_cos_wrapper_module_1588861885855453_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_menu" style="" data-hs-cos-general-type="widget" data-hs-cos-type="menu"><div id="hs_menu_wrapper_module_1588861885855453_" class="hs-menu-wrapper active-branch flyouts hs-menu-flow-horizontal" role="navigation" data-sitemap-name="default" data-menu-id="29112379890" aria-label="Navigation Menu">
|
||
<ul role="menu">
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com" role="menuitem">Home</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/services" role="menuitem">Services</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/events" role="menuitem">Events</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1 hs-item-has-children" role="none"><a href="javascript:;" aria-haspopup="true" aria-expanded="false" role="menuitem">Content</a>
|
||
<ul role="menu" class="hs-menu-children-wrapper">
|
||
<li class="hs-menu-item hs-menu-depth-2" role="none"><a href="https://blog.container-solutions.com" role="menuitem">Blogs</a></li>
|
||
</ul></li>
|
||
</ul>
|
||
</div></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-9 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell mega-menu-1 hidden-phone hidden-tablet" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell mega-drop-1" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell mega-menu hidden-phone" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-3 ">
|
||
<div class="row-fluid ">
|
||
<div class="span3 widget-span widget-type-cell nav-column" style="" data-widget-type="cell" data-x="0" data-w="3">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_16299859664272722" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_16299859664272722_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span3 widget-span widget-type-cell center nav-column" style="" data-widget-type="cell" data-x="3" data-w="3">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-3 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-4 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_16299853344462565" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_16299853344462565_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span3 widget-span widget-type-cell center nav-column" style="" data-widget-type="cell" data-x="6" data-w="3">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-5 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-6 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_16299853310642563" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_16299853310642563_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span3 widget-span widget-type-cell nav-column" style="" data-widget-type="cell" data-x="9" data-w="3">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-7 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-8 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1648341413920261" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_1648341413920261_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell mega-menu-2 hidden-phone hidden-tablet" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell mega-drop-2" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell mega-menu hidden-phone" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-3 ">
|
||
<div class="row-fluid ">
|
||
<div class="span3 widget-span widget-type-cell nav-column" style="" data-widget-type="cell" data-x="0" data-w="3">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1594821908906860" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_1594821908906860_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span3 widget-span widget-type-cell nav-column" style="" data-widget-type="cell" data-x="3" data-w="3">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-3 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-4 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1594822950655390" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_1594822950655390_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span3 widget-span widget-type-cell nav-column" style="" data-widget-type="cell" data-x="6" data-w="3">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-5 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-6 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1594823562783675" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_1594823562783675_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span3 widget-span widget-type-cell nav-column" style="" data-widget-type="cell" data-x="9" data-w="3">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-7 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-3 row-number-8 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1643154843573484" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_1643154843573484_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
</div>
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end header -->
|
||
</div><!--end header wrapper -->
|
||
|
||
<div class="body-container-wrapper">
|
||
<div class="body-container container-fluid">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell wow2-blog-sec" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell wrapper" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-3 ">
|
||
<div class="row-fluid ">
|
||
<div class="span7 widget-span widget-type-cell left-col" style="" data-widget-type="cell" data-x="0" data-w="7">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-4 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_158381964095203" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-blog_content" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
<div class="blog-section">
|
||
<div class="blog-post-wrapper cell-wrapper">
|
||
<div class="blog-section post-blog-section">
|
||
<div class="blog-social-share">
|
||
<div class="post-social-share">
|
||
<ul>
|
||
<li>share:</li>
|
||
<li><a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fblog.container-solutions.com%2Freflections-on-amazon-prime-videos-monolith-move"><i class="fab fa-facebook-f"></i></a></li>
|
||
<li><a target="_blank" href="https://www.twitter.com/share?url=https%3A%2F%2Fblog.container-solutions.com%2Freflections-on-amazon-prime-videos-monolith-move"><i class="fab fa-twitter"></i></a></li>
|
||
<li> <a target="_blank" href="http://www.linkedin.com/shareArticle?mini=true&url=https://blog.container-solutions.com/reflections-on-amazon-prime-videos-monolith-move"><i class="fab fa-linkedin-in"></i></a></li>
|
||
<li><a target="_blank" href="#"><i class="fas fa-envelope"></i></a></li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="simple-post-wrapper blog-post-wrapper cell-wrapper">
|
||
<div class="section post-header">
|
||
<div class="hs-featured-image-wrapper default-type">
|
||
<a href="https://blog.container-solutions.com/reflections-on-amazon-prime-videos-monolith-move" title="" class="hs-featured-image-link">
|
||
<img src="https://blog.container-solutions.com/hubfs/hulki-okan-tabak-PdTYsSgJJNA-unsplash-2.jpg" alt="" class="hs-featured-image">
|
||
</a>
|
||
</div>
|
||
<p id="hubspot-topic_data">
|
||
<a class="topic-link" href="https://blog.container-solutions.com/tag/cloud-native">Cloud native</a>,
|
||
<a class="topic-link" href="https://blog.container-solutions.com/tag/microservices">Microservices</a>,
|
||
<a class="topic-link" href="https://blog.container-solutions.com/tag/architecture">Architecture</a>
|
||
</p>
|
||
<h1><span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text">Reflections on Amazon Prime Video’s Monolith Move</span></h1>
|
||
<div class="row-fluid post-author-sec">
|
||
<div id="hubspot-author_data" class="span6 hubspot-editable" data-hubspot-form-id="author_data" data-hubspot-name="Blog Author">
|
||
<a class="author-link" href="https://blog.container-solutions.com/author/ian-miell">Ian Miell</a>
|
||
<div class="hs-author-avatar"> <img src="https://blog.container-solutions.com/hubfs/ian_miell.jpeg" alt="Ian Miell"> </div>
|
||
</div>
|
||
<div class="span6 post-read align-right">
|
||
<div><span> May 30, 2023</span></div>
|
||
<span> 21 minutes Read</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="section post-body">
|
||
<span id="hs_cos_wrapper_post_body" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_rich_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="rich_text"><p style="font-size: 18px;">Recently an <a href="https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90">Amazon Prime Video (APV) article</a> about their move from serverless tools to ECS and EC2 did the rounds on all the tech socials. A lot of noise was made about it, initially because it was interpreted as a harbinger of the death of serverless technologies, followed by a second wave that lashed back against that narrative. This second wave argued that what had happened was not a failure of serverless, but rather a standard architectural evolution of an initial serverless microservices implementation to a ‘microservice refactoring’.</p>
|
||
<!--more-->
|
||
<p style="font-size: 18px;">This brouhaha got me thinking about why, as an architect, I’ve never truly got onto the serverless boat, and what light this mini-drama throws on that stance. I ended up realising how Amazon and AWS had been at the centre of two computing revolutions that changed the computing paradigm we labour within.</p>
|
||
<p style="font-size: 18px;">Before I get to that, let’s recap the story so far.</p>
|
||
<h4 style="font-size: 24px;">The Story</h4>
|
||
<p style="font-size: 18px;">The APV team had a service which monitored every stream viewed on the platform, and triggered a process to correct poorly-operating streams. This service was built using AWS’s serverless Step Functions and Lambda services, and was never intended to run at high scale.</p>
|
||
<p style="font-size: 18px;">As the service scaled, two problems were hit which together forced a re-architecture. Account limits were hit on the number of AWS Step Function transitions, and the cost of running the service was prohibitive.</p>
|
||
<p style="font-size: 18px;">In the article’s own words: ‘The move from a distributed microservices architecture to a monolith application helped achieve higher scale, resilience, and reduce costs. [...] We realised that [a] distributed approach wasn’t bringing a lot of benefits in our specific use case, so we packed all of the components into a single process.’</p>
|
||
<h2 style="font-size: 24px;">The Reactions</h2>
|
||
<p style="font-size: 18px;">There were more than a few commentators who relished the chance to herald this as the return of the monolith and/or the demise of the microservice. The New Stack led with an emotive ‘<a href="https://thenewstack.io/return-of-the-monolith-amazon-dumps-microservices-for-video-monitoring/">Amazon Dumps Microservices</a>’ headline, while David Heinemeier Hansson, as usual, went for the jugular with ‘<a href="https://world.hey.com/dhh/even-amazon-can-t-make-sense-of-serverless-or-microservices-59625580">Even Amazon Can’t Make Sense of Serverless or Microservices</a>’.</p>
|
||
<p style="font-size: 18px;">After this initial wave of ‘I told you so’ responses, a rearguard action was fought by defenders of serverless approaches to argue that reports of the death of the serverless and microservices was premature, and that others were misinterpreting the significance of the original article.</p>
|
||
<p style="font-size: 18px;">Adrian Cockroft, former AWS VP and well-known proponent of microservices fired back with ‘<a href="https://adrianco.medium.com/so-many-bad-takes-what-is-there-to-learn-from-the-prime-video-microservices-to-monolith-story-4bd0970423d4">So Many Bad Takes - What Is There To Learn From The Prime Video Microservices To Monolith Story</a>’, which argued that the original article did not describe a move from microservice to monolith, rather it was ‘clearly a microservice refactoring step’, and that the team’s evolution from serverless to microservice was a standard architectural pathway called ‘Serverless First’. In other words: nothing to see here, ‘the result isn’t a monolith’.</p>
|
||
<h2 style="font-size: 24px;">The Semantics</h2>
|
||
<p style="font-size: 18px;">At this point, the debate has become a matter of semantics: What is a microservice? Looking at <a href="https://aws.amazon.com/microservices/">various</a> <a href="https://microservices.io/">definitions</a> <a href="https://learn.microsoft.com/en-us/azure/architecture/guide/architecture-styles/microservices">available</a>, the essential unarguable point is that a microservice is ‘owned by a small team’. You can’t have a microservice that requires extensive coordination between teams to build or deploy.</p>
|
||
<p style="font-size: 18px;">But that can’t be the whole story, as you probably wouldn’t describe a small team that releases a single binary with an embedded database, a web server and a Ruby-on-Rails application as a microservice. A <a href="https://en.wikipedia.org/wiki/Microservices">microservice</a> implies that services are ‘fine-grained […] communicating through lightweight protocols’.</p>
|
||
<p style="font-size: 18px;">If a microservice is 'fine-grained', then there must be some element of component decomposition in a set of microservices that make up a set of applications. So what is a component? In the Amazon Prime Video case, you could argue both ways. You could say that the tool itself is a component, as it is a bounded piece of software managed by a small team, or you could say that the detectors and converters within the tool are separate components mushed into a now-monolithic application. You could even say that my imagined Ruby-on-Rails monolithic binary above is a microservice if you want to just define a component as something owned by a small team.</p>
|
||
<p style="font-size: 18px;">And what is an application? A service? A process? And on and on it goes. We can continue deconstructing terms all the way down the stack, and as we do so, we see that whether or not a piece of software is architecturally monolithic or a microservice is more or less a matter of perspective. My idea of a microservice can be the same as your idea of a monolith.</p>
|
||
<p style="font-size: 18px;">But does all this argumentation over words matter? Maybe not. Let’s ignore the question of what exactly a microservice or a monolith is for now (aside from ‘small team size’) and focus on another aspect of the story.</p>
|
||
<h2 style="font-size: 24px;">Easier to Scale?</h2>
|
||
<p style="font-size: 18px;">The second paragraph of AWS’s definition of <a href="https://aws.amazon.com/microservices/">microservices</a> made me raise my eyebrows:</p>
|
||
<blockquote style="font-size: 18px;">
|
||
<p style="line-height: 1.15;"><em>‘Microservices architectures make applications <span style="font-weight: bold;">easier to scale and faster to develop</span>, enabling innovation and accelerating time-to-market for new features.’<br><br>Source: <a href="https://aws.amazon.com/microservices/">https://aws.amazon.com/microservices/</a></em></p>
|
||
</blockquote>
|
||
<p style="font-size: 18px;">Regardless of <em>what </em>microservices were, these were their promised benefits: faster to develop, and easier to scale. What makes the AVP story so triggering to those of us who had been told we were dinosaurs is that the original serverless implementation of their tool was ludicrously<em> un</em>-scalable:</p>
|
||
<blockquote style="font-size: 18px;">
|
||
<p style="line-height: 1.15;"><em>We designed our initial solution as a distributed system using serverless components (for example, AWS Step Functions or AWS Lambda), which was a good choice for building the service quickly. In theory, this would allow us to scale each service component independently. However, <strong>the way we used some components caused us to hit a hard scaling limit at around 5% of the expected load</strong>.<br><br></em><span style="font-style: normal; font-weight: normal;">Source: </span><a href="https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90" style="font-style: normal;">https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90</a></p>
|
||
</blockquote>
|
||
<p style="font-size: 18px;">and not just technically un-scalable, but financially too:</p>
|
||
<blockquote style="font-size: 18px;">
|
||
<p style="line-height: 1.15;"><em>Also, the overall cost of all the building blocks was too high to accept the solution at a large scale.<br></em></p>
|
||
<p style="line-height: 1.15;">Source: <a href="https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90" style="font-style: normal;">https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90</a></p>
|
||
</blockquote>
|
||
<p style="font-size: 18px;">To me, this doesn’t sound like their approach has made it ‘easier to scale’.</p>
|
||
<p style="font-size: 18px;">Some, indeed, <a href="https://twitter.com/dvassallo/status/1654880475603935232">saw this coming</a>:<a href="https://twitter.com/dvassallo/status/1654880475603935232" rel="noopener" target="_blank"><img src="https://blog.container-solutions.com/hs-fs/hubfs/1-1.png?width=463&height=760&name=1-1.png" alt="Lambda's limitations" width="463" height="760" loading="lazy" style="height: auto; max-width: 100%; width: 463px; margin-left: auto; margin-right: auto; display: block;" srcset="https://blog.container-solutions.com/hs-fs/hubfs/1-1.png?width=232&height=380&name=1-1.png 232w, https://blog.container-solutions.com/hs-fs/hubfs/1-1.png?width=463&height=760&name=1-1.png 463w, https://blog.container-solutions.com/hs-fs/hubfs/1-1.png?width=695&height=1140&name=1-1.png 695w, https://blog.container-solutions.com/hs-fs/hubfs/1-1.png?width=926&height=1520&name=1-1.png 926w, https://blog.container-solutions.com/hs-fs/hubfs/1-1.png?width=1158&height=1900&name=1-1.png 1158w, https://blog.container-solutions.com/hs-fs/hubfs/1-1.png?width=1389&height=2280&name=1-1.png 1389w" sizes="(max-width: 463px) 100vw, 463px"></a></p>
|
||
<h2 style="font-size: 24px;">Faster to Develop?</h2>
|
||
<p style="font-size: 18px;">But what about the other benefit, that of being ‘faster to develop’? Adrian Cockroft’s <a href="https://adrianco.medium.com/so-many-bad-takes-what-is-there-to-learn-from-the-prime-video-microservices-to-monolith-story-4bd0970423d4" rel="noopener" target="_blank">post</a> talks about this, and lays out this comparison table:</p>
|
||
<p style="font-size: 18px;"><img src="https://blog.container-solutions.com/hs-fs/hubfs/2.png?width=716&height=408&name=2.png" alt="2" width="716" height="408" loading="lazy" style="height: auto; max-width: 100%; width: 716px; margin-left: auto; margin-right: auto; display: block;" srcset="https://blog.container-solutions.com/hs-fs/hubfs/2.png?width=358&height=204&name=2.png 358w, https://blog.container-solutions.com/hs-fs/hubfs/2.png?width=716&height=408&name=2.png 716w, https://blog.container-solutions.com/hs-fs/hubfs/2.png?width=1074&height=612&name=2.png 1074w, https://blog.container-solutions.com/hs-fs/hubfs/2.png?width=1432&height=816&name=2.png 1432w, https://blog.container-solutions.com/hs-fs/hubfs/2.png?width=1790&height=1020&name=2.png 1790w, https://blog.container-solutions.com/hs-fs/hubfs/2.png?width=2148&height=1224&name=2.png 2148w" sizes="(max-width: 716px) 100vw, 716px"></p>
|
||
<p style="font-size: 18px;">This is where I must protest, starting with the second line, which states that ‘traditional’, non-serverless/non-microservices development takes ‘months of work’ compared to the ‘hours of work’ microservices applications take to build.</p>
|
||
<p style="font-size: 18px;">Anyone who has actually built a serverless system <em>in a real world context</em> will know that it is not always, or even usually, ‘hours of work’. To take one small example of problems that can come up: </p>
|
||
<p style="font-size: 18px;"><a href="https://twitter.com/matthewcp/status/1654928007897677824" rel="noopener" target="_blank"><img src="https://blog.container-solutions.com/hs-fs/hubfs/3.png?width=542&height=193&name=3.png" alt="Serverless frustrations" width="542" height="193" loading="lazy" style="height: auto; max-width: 100%; width: 542px; margin-left: auto; margin-right: auto; display: block;" srcset="https://blog.container-solutions.com/hs-fs/hubfs/3.png?width=271&height=97&name=3.png 271w, https://blog.container-solutions.com/hs-fs/hubfs/3.png?width=542&height=193&name=3.png 542w, https://blog.container-solutions.com/hs-fs/hubfs/3.png?width=813&height=290&name=3.png 813w, https://blog.container-solutions.com/hs-fs/hubfs/3.png?width=1084&height=386&name=3.png 1084w, https://blog.container-solutions.com/hs-fs/hubfs/3.png?width=1355&height=483&name=3.png 1355w, https://blog.container-solutions.com/hs-fs/hubfs/3.png?width=1626&height=579&name=3.png 1626w" sizes="(max-width: 542px) 100vw, 542px"></a></p>
|
||
<p style="font-size: 18px;">...to which you might add: difficulty of debugging, integration with other services, difficulty of testing scaling scenarios, state management, getting IAM rules right… the list goes on.</p>
|
||
<p style="font-size: 18px;">You might object to this, and argue that if your business has approved all the cloud provider’s services, <em>and</em> has a standard pattern for deploying them, <em>and</em> your staff is already well versed in the technologies and how to implement them, then yes, you can implement something in a few hours.</p>
|
||
<p style="font-size: 18px;">But this is where I’m baffled. In an analogous context, I have set up ‘traditional’ three-tier systems in a minimal and scalable way in a similar time-frame. Much of my career has been spent doing just that, and I still do that in my spare time because it’s easier for me for prototyping to do just that on a server than wiring together different cloud services.</p>
|
||
<p style="font-size: 18px;">The supposed development time difference between the two methods <em>is not based on the technology itself, but the context in which you’re deploying it</em>. The argument made by the table is tendentious. It’s based on comparing the <em>worst</em> case for ‘traditional’ application development (months of work) with the <em>best</em> case for ‘rapid development’ (hours of work). Similar arguments can be made for all the table’s comparisons.</p>
|
||
<h2 style="font-size: 24px;">The Water We Swim In</h2>
|
||
<p style="font-size: 18px;">Context is everything in these debates. As all the experts point out, there is no architectural magic bullet that fits all use cases. Context is as complex as human existence itself, but here I want to focus on two areas specifically:</p>
|
||
<ul style="font-size: 18px;">
|
||
<li>governance</li>
|
||
<li>knowledge</li>
|
||
</ul>
|
||
<p style="font-size: 18px;"><br>The governance context is the set of constraints on your freedom to build and deploy software. In a low-regulation startup these constraints are close to zero. The knowledge context is the degree to which you and your colleagues know how a set of technologies work. It’s assumptions around these contexts that make up the fault lines of most of the serverless debate.<br><br>Take <a href="https://twitter.com/awscloud/status/1222924795995705346">this tweet</a> from AWS, which approvingly quotes the CEO of Serverless:</p>
|
||
<div class="hs-embed-wrapper" data-service="twitter" data-script-embed="true" data-responsive="true" style="position: relative; overflow: hidden; width: 100%; height: auto; padding: 0px; max-width: 550px; min-width: 256px; display: block; margin: auto;"><div class="hs-embed-content-wrapper"><blockquote class="twitter-tweet" align="center"><p lang="en" dir="ltr">"The great thing about serverless is that you don't have to think about migrating a big app or building out this huge application, you just have to think about one task, one unit of work." - <a href="https://twitter.com/austencollins?ref_src=twsrc%5Etfw">@austencollins</a>, Founder & CEO <a href="https://twitter.com/goserverless?ref_src=twsrc%5Etfw">@goserverless</a> w/<a href="https://twitter.com/danilop?ref_src=twsrc%5Etfw">@danilop</a>. <a href="https://t.co/TVfP1CFCNS">https://t.co/TVfP1CFCNS</a> <a href="https://t.co/yCuY8ChvmM">pic.twitter.com/yCuY8ChvmM</a></p>— Amazon Web Services (@awscloud) <a href="https://twitter.com/awscloud/status/1222924795995705346?ref_src=twsrc%5Etfw">January 30, 2020</a></blockquote>
|
||
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div></div>
|
||
<blockquote>
|
||
<p><em>The great thing about serverless is that you don't have to think about migrating a big app or building out this huge application, you just have to think about one task, one unit of work.<br></em>@austencollins, Founder & CEO @goserverless</p>
|
||
</blockquote>
|
||
<p style="font-size: 18px;">I can’t speak for other developers, but that’s almost always true for me most of the time when I write functions (or procedures) in ‘traditional’ codebases. When I’m doing that, I’m not thinking about IAM rules, how to connect to databases, the big app, the huge application. I’m just thinking about this one task, this unit of work. And conversely, if I’m working on a serverless application, I might have to think about all the problems I might run into that I listed above, starting with database connectivity.</p>
|
||
<p style="font-size: 18px;">You might object that a badly-written three-tier system makes it difficult to write such functions in isolation because of badly-structured monolithic codebases. Maybe so. But microservices architectures can be bad too, and let you ‘think about the one task’ you are doing when you <em>should</em> be thinking about the overall architecture. Maybe your one serverless task is going to cost a ludicrous amount of money (as with APV), or is duplicated elsewhere, or is going to bottleneck another task elsewhere.</p>
|
||
<p style="font-size: 18px;">Again: The supposed difference between the two methods <em>is not based on the technology itself, but the context in which you’re working</em>. If I’m fully bought into AWS as my platform from a governance and knowledge perspective, then serverless does allow me to focus on just the task I’m doing, because everything else is taken care of by the business around me. Note that this context is independent of 'the problem you are trying to solve'. That problem may or may not lend itself to a serverless architecture, but is not <span style="font-style: italic;">the context in which you're working</span>.<br><br>Here I’d like to bring up a<a href="https://fs.blog/david-foster-wallace-this-is-water/"> David Foster Wallace parable</a> about fish:</p>
|
||
<p style="font-size: 18px;"><em>There are these two young fish swimming along and they happen to meet an older fish swimming the other way, who nods at them and says “Morning, boys. How’s the water?” And the two young fish swim on for a bit, and then eventually one of them looks over at the other and goes “What the hell is water?”</em></p>
|
||
<p style="font-size: 18px;">When you’re developing, you want your context to be like water to a fish: invisible, not in your way, sustaining you. But if I’m not a fish swimming in AWS’s metaphorical water, then I’m likely to splash around a lot if I dive into it.</p>
|
||
<p style="font-size: 18px;">Most advocates of serverless take it as a base assumption of the discussion that you are fully, maturely, and exclusively bought into cloud technologies, and the hyperscalers’ ecosystems. But for many more people working in software (including our customers), that’s not true, and they are wrestling with what, for them, is still a relatively unfamiliar environment.</p>
|
||
<h2 style="font-size: 24px;">A Confession</h2>
|
||
<p style="font-size: 18px;">I want to make a confession. Based on what you’ve read so far, you might surmise I’m someone who doesn’t like the idea of serverless technology. But I’ve spent 23 years so far doing serverless work. Yes, I’m one of those people who claims to have 23 years experience in a 15-year old technology.</p>
|
||
<p style="font-size: 18px;">In fact, there’s many of us out there. This is because in those days we didn’t call these technologies ‘serverless’ or ‘Lambda’, we called them ‘stored procedures’.</p>
|
||
<p style="font-size: 18px;"><a href="https://twitter.com/ianmiell/status/921767022056345602">https://twitter.com/ianmiell/status/921767022056345602</a></p>
|
||
<div class="hs-embed-wrapper" data-service="twitter" data-script-embed="true" data-responsive="true" style="position: relative; overflow: hidden; width: 100%; height: auto; padding: 0px; max-width: 490px; min-width: 256px; display: block; margin: auto;"><div class="hs-embed-content-wrapper"><blockquote class="twitter-tweet" align="center"><p lang="en" dir="ltr">Serverless seems like stored procedures to me. The surrounding platform is just a cloud mainframe rather than a database.</p>— Ian Miell (@ianmiell) <a href="https://twitter.com/ianmiell/status/921767022056345602?ref_src=twsrc%5Etfw">October 21, 2017</a></blockquote>
|
||
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div></div>
|
||
<p style="font-size: 18px;">I worked for a company for 15 of those years where the ‘<a href="https://wiki.c2.com/?BigIronDatabase">big iron</a>’ database was the water we swam in. We used it for message queues (at such a scale that IBM had to do some pretty nifty work to optimise for our specific use case and give us our own binaries off the main trunk), for our event-driven architectures (using triggers), and as our serverless platform (using stored procedures).</p>
|
||
<p style="font-size: 18px;">The joy of having a database as the platform was exactly the same then as the joys of having a serverless platform on a hyperscaler now. We didn’t have to provision compute resources for it (DBA’s problem), maintain the operating system (DBA’s problem), or worry or performance (DBA’s problem, mostly). <em>We didn’t have to think about building a huge application, we just had to think about one task, one unit of work.</em> And it took minutes to deploy.</p>
|
||
<p style="font-size: 18px;">People have drawn <a href="https://twitter.com/turtlemonvh/status/1169722761020919813">similar analogies</a> between serverless and <a href="https://en.wikipedia.org/wiki/Xinetd">xinetd</a>.</p>
|
||
<div class="hs-embed-wrapper" data-service="twitter" data-script-embed="true" data-responsive="true" style="position: relative; overflow: hidden; width: 100%; height: auto; padding: 0px; max-width: 550px; min-width: 256px; display: block; margin: auto;"><div class="hs-embed-content-wrapper"><blockquote class="twitter-tweet" align="center"><p lang="en" dir="ltr">xinetd, but the daemons are containers. Not a bad idea, but certainly not the solution to everything, which is how some "serverless experts" seem to be approaching this.</p>— Timothy Van Heest (@turtlemonvh) <a href="https://twitter.com/turtlemonvh/status/1169722761020919813?ref_src=twsrc%5Etfw">September 5, 2019</a></blockquote>
|
||
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div></div>
|
||
<p style="font-size: 18px;">Serverless itself is nothing new. It’s just a name for what you’re doing when you can write code and let someone else manage the runtime environment (the ‘water’) for you. What’s new is the platform you treat as your water. For me 23 years ago, it was the database. Now it’s the cloud platform.</p>
|
||
<h2 style="font-size: 24px;">Mainframes, Clouds, Databases, and Lock-In</h2>
|
||
<p style="font-size: 18px;">The other objection to serverless that’s often heard is that it increases your lock-in to the hyperscaler, something that many architects, CIOs, and regulators say they are concerned about. But as a colleague once quipped to me: “Lock-in? We are all locked into x86”, the point being that we’re all swimming in some kind of water, so it’s not about avoiding lock-in, but rather choosing your lock-in wisely.</p>
|
||
<p style="font-size: 18px;">It was symbolic when Amazon (not AWS) <a href="https://aws.amazon.com/blogs/aws/migration-complete-amazons-consumer-business-just-turned-off-its-final-oracle-database/">got rid of their last Oracle database</a> in 2019, replacing them with AWS database services. In retrospect, this might be considered the point where businesses started to accept that their core platform had moved from a database to a cloud service provider. A similar inflection point where the mainframe platform was supplanted by commodity servers and PCs might be considered to be July 5, 1994, when Amazon itself was founded. Ironically, then, Amazon heralded both the death of the mainframe, and the birth of its replacement with AWS.</p>
|
||
<h2 style="font-size: 18px;"><img src="https://blog.container-solutions.com/hs-fs/hubfs/1%20(1).png?width=2000&height=400&name=1%20(1).png" alt="1 (1)" width="2000" height="400" loading="lazy" style="height: auto; max-width: 100%; width: 2000px;" srcset="https://blog.container-solutions.com/hs-fs/hubfs/1%20(1).png?width=1000&height=200&name=1%20(1).png 1000w, https://blog.container-solutions.com/hs-fs/hubfs/1%20(1).png?width=2000&height=400&name=1%20(1).png 2000w, https://blog.container-solutions.com/hs-fs/hubfs/1%20(1).png?width=3000&height=600&name=1%20(1).png 3000w, https://blog.container-solutions.com/hs-fs/hubfs/1%20(1).png?width=4000&height=800&name=1%20(1).png 4000w, https://blog.container-solutions.com/hs-fs/hubfs/1%20(1).png?width=5000&height=1000&name=1%20(1).png 5000w, https://blog.container-solutions.com/hs-fs/hubfs/1%20(1).png?width=6000&height=1200&name=1%20(1).png 6000w" sizes="(max-width: 2000px) 100vw, 2000px"></h2>
|
||
<h2 style="font-size: 24px;">The Circle of Life</h2>
|
||
<p style="font-size: 18px;">With this context in mind, it seems that the reason I never hopped onto the serverless train is because, to me, it’s not the software paradigm I was ushered into as a youngengineer. To me, quickly spinning up a three-tier application is as natural as throwing together an application using S3, DynamoDB, and API Gateway is for those cloud natives that cut their teeth knowing nothing else.</p>
|
||
<p style="font-size: 18px;">What strikes this old codger most about the Amazon Prime Video article is the sheer irony of serverless’s defenders saying that its <em>lack of scalability is the reason you need to move</em> to a more monolithic architecture. It was serverless’s very scalability and the avoidance of the need to re-architect later that was one of its key original selling points!</p>
|
||
<p style="font-size: 18px;">But when three-tier architectures started becoming popular I’m sure mainframers of the past said the same thing: “What’s the point of building software on commodity hardware, when it’ll end up on the mainframe?” Maybe they even leapt on articles describing how big businesses were moving their software back to the mainframe, having failed to make commodity servers work for them, and joyously proclaimed that rumours of the death of the mainframe was greatly exaggerated.</p>
|
||
<p style="font-size: 18px;">And in a way, maybe they were right. Amazon killed the physical mainframe, then killed the database mainframe, then created the cloud mainframe. Long live the monolith!</p>
|
||
<hr>
|
||
<p style="font-size: 18px;">If you want to read more about what makes a Cloud Native work for organisations like yours, download the Cloud Native Attitude book below.<!--HubSpot Call-to-Action Code --><span class="hs-cta-wrapper" id="hs-cta-wrapper-ac93f2fd-838a-41d9-baa1-49b957ca2622"><span class="hs-cta-node hs-cta-ac93f2fd-838a-41d9-baa1-49b957ca2622" id="hs-cta-ac93f2fd-838a-41d9-baa1-49b957ca2622"><!--[if lte IE 8]><div id="hs-cta-ie-element"></div><![endif]--><a href="https://cta-redirect.hubspot.com/cta/redirect/2252258/ac93f2fd-838a-41d9-baa1-49b957ca2622"><img class="hs-cta-img" id="hs-cta-img-ac93f2fd-838a-41d9-baa1-49b957ca2622" style="border-width:0px;" height="3342" width="6675" src="https://no-cache.hubspot.com/cta/default/2252258/ac93f2fd-838a-41d9-baa1-49b957ca2622.png" alt="Download the Cloud Native Attitude book for free"></a></span><script charset="utf-8" src="/hs/cta/cta/current.js"></script><script type="text/javascript"> hbspt.cta._relativeUrls=true;hbspt.cta.load(2252258, 'ac93f2fd-838a-41d9-baa1-49b957ca2622', {"useNewLoader":"true","region":"na1"}); </script></span><!-- end HubSpot Call-to-Action Code --></p></span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<script type="text/javascript">
|
||
$(document).ready(function(){
|
||
var $sticky = $('.post-social-share');
|
||
var $stickyrStopper = $('.post-pagination-sec');
|
||
if (!!$sticky.offset()) { // make sure ".sticky" element exists
|
||
var generalSidebarHeight = $sticky.innerHeight();
|
||
var stickyTop = $sticky.offset().top + 500;
|
||
var stickOffset = 0;
|
||
var stickyStopperPosition = $stickyrStopper.offset().top;
|
||
var stopPoint = stickyStopperPosition - generalSidebarHeight - stickOffset;
|
||
var diff = stopPoint + stickOffset;
|
||
$(window).scroll(function(){ // scroll event
|
||
var windowTop = $(window).scrollTop(); // returns number
|
||
if (stopPoint < windowTop) {
|
||
$sticky.css({ position: 'absolute',opacity:'0'});
|
||
} else if (stickyTop < windowTop+stickOffset) {
|
||
$sticky.css({ position: 'fixed', top: stickOffset,opacity:'1' });
|
||
} else {
|
||
$sticky.css({position: 'absolute', top: 'initial',opacity:'1'});
|
||
}
|
||
});
|
||
}
|
||
});
|
||
</script>
|
||
</div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span5 widget-span widget-type-cell right-col" style="" data-widget-type="cell" data-x="7" data-w="5">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-5 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell listing-sidebar-rss" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1585037683162262" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
<div class="sidebar-rss">
|
||
<div class="sidebar-recent-post-section">
|
||
<div class="sidebar-recent-related-post">
|
||
|
||
</div>
|
||
</div>
|
||
</div></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1585037960356419" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><div class="post-pagination-sec">
|
||
<div class="row-fluid-wrapper">
|
||
<div class="row-fluid">
|
||
<div class="widget-span widget-type-cell wrapper equal-height-container">
|
||
<div class="row-fluid-wrapper">
|
||
<div class="row-fluid">
|
||
|
||
<div class="span6 left-col">
|
||
|
||
<div class="span6 prev-post">
|
||
<a href="/its-not-just-the-money-were-talking-about">
|
||
<div class="span8 prev-pagi-text-sec">
|
||
|
||
<h3>Engineering Ethics: It’s Not Just The Money We’re Talking Ab...</h3>
|
||
</div>
|
||
<div class="span4 featured-image" style="background:url(https://blog.container-solutions.com/hubfs/blog%20hero%20images/Engineering%20Ethics_it%20is%20not%20just%20the%20money%20we%20are%20talking%20about_SOCIAL.png);background-repeat:no-repeat;
|
||
background-size:cover;height:80px;">
|
||
|
||
</div>
|
||
</a>
|
||
</div>
|
||
<div class="span6 prev-anchor align-right">
|
||
<a href="/its-not-just-the-money-were-talking-about"> <img src="https://cdn2.hubspot.net/hubfs/3842749/Wow%202019/Images/left-arrow.png" alt="prev-arrow">
|
||
Previous article</a>
|
||
</div>
|
||
|
||
</div>
|
||
<div class="span6 right-col">
|
||
|
||
<div class="span6 next-anchor align-left">
|
||
<a href="/how-ebpf-enables-cloud-native-innovation"> Next article <img src="https://cdn2.hubspot.net/hubfs/3842749/Wow%202019/Images/right-arrow.png" alt="next-arrow">
|
||
</a>
|
||
</div>
|
||
<div class="span6 next-post">
|
||
<a href="/how-ebpf-enables-cloud-native-innovation">
|
||
<div class="span4 featured-image" style="background:url(https://blog.container-solutions.com/hubfs/blog%20hero%20images/How%20eBPF%20enables%20Cloud%20Native%20Innovation%20and%20Performance_HERO.png);background-size:cover;
|
||
background-repeat:no-repeat;height:80px;">
|
||
</div>
|
||
<div class="span8 next-pagi-text-sec">
|
||
|
||
<h3>How eBPF enables Cloud Native Innovation and Performance</h3>
|
||
</div>
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell comment-sec" style=" display:block; " data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-3 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell wrapper" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-4 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell " style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-5 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget comment-sec-heading-text" style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_158382180556003" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span id="hs_cos_wrapper_module_158382180556003_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="text">Comments</span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-6 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell comment-form-sec" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget comment-heading-text" style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_158382180556005" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span id="hs_cos_wrapper_module_158382180556005_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="text">Leave your Comment</span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-2 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_158382180556006" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-blog_comments" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span id="hs_cos_wrapper_module_158382180556006_blog_comments" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_blog_comments" style="" data-hs-cos-general-type="widget" data-hs-cos-type="blog_comments">
|
||
<div class="section post-footer">
|
||
<div id="comments-listing" class="new-comments"></div>
|
||
|
||
<div id="hs_form_target_e5ba3739-20e2-48cd-8272-c926646d555c"></div>
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end body -->
|
||
</div><!--end body wrapper -->
|
||
|
||
<div class="footer-container-wrapper">
|
||
<div class="footer-container container-fluid">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-global_group " style="" data-widget-type="global_group" data-x="0" data-w="12">
|
||
<div class="" data-global-widget-path="generated_global_groups/29544596322.html"><div class="row-fluid-wrapper row-depth-1 row-number-1 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell footer-grp" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-2 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-cell wrapper equal-height-container" style="" data-widget-type="cell" data-x="0" data-w="12">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-3 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget footer-logo" style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1579264940018354" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span id="hs_cos_wrapper_module_1579264940018354_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_linked_image" style="" data-hs-cos-general-type="widget" data-hs-cos-type="linked_image"><img src="https://blog.container-solutions.com/hs-fs/hubfs/cs-logo-white.png?width=150&height=61&name=cs-logo-white.png" class="hs-image-widget " width="150" height="61" style="max-width: 100%; height: auto;" alt="cs-logo-white" title="cs-logo-white" srcset="https://blog.container-solutions.com/hs-fs/hubfs/cs-logo-white.png?width=75&height=31&name=cs-logo-white.png 75w, https://blog.container-solutions.com/hs-fs/hubfs/cs-logo-white.png?width=150&height=61&name=cs-logo-white.png 150w, https://blog.container-solutions.com/hs-fs/hubfs/cs-logo-white.png?width=225&height=92&name=cs-logo-white.png 225w, https://blog.container-solutions.com/hs-fs/hubfs/cs-logo-white.png?width=300&height=122&name=cs-logo-white.png 300w, https://blog.container-solutions.com/hs-fs/hubfs/cs-logo-white.png?width=375&height=153&name=cs-logo-white.png 375w, https://blog.container-solutions.com/hs-fs/hubfs/cs-logo-white.png?width=450&height=183&name=cs-logo-white.png 450w" sizes="(max-width: 150px) 100vw, 150px"></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-4 ">
|
||
<div class="row-fluid ">
|
||
<div class="span8 widget-span widget-type-cell four-col" style="" data-widget-type="cell" data-x="0" data-w="8">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-5 ">
|
||
<div class="row-fluid ">
|
||
<div class="span6 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="6">
|
||
<div id="hs_cos_wrapper_module_15783825602011356" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-simple_menu" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span id="hs_cos_wrapper_module_15783825602011356_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_simple_menu" style="" data-hs-cos-general-type="widget" data-hs-cos-type="simple_menu"><div id="hs_menu_wrapper_module_15783825602011356_" class="hs-menu-wrapper active-branch flyouts hs-menu-flow-vertical" role="navigation" data-sitemap-name="" data-menu-id="" aria-label="Navigation Menu">
|
||
<ul role="menu" class="active-branch">
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com" role="menuitem" target="_self">Home</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/events" role="menuitem" target="_self">Events</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/services" role="menuitem" target="_self">Services</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1 active active-branch" role="none"><a href="https://blog.container-solutions.com" role="menuitem" target="_self">Blog</a></li>
|
||
</ul>
|
||
</div></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span6 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="6" data-w="6">
|
||
<div id="hs_cos_wrapper_module_15783825632451363" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-simple_menu" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span id="hs_cos_wrapper_module_15783825632451363_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_simple_menu" style="" data-hs-cos-general-type="widget" data-hs-cos-type="simple_menu"><div id="hs_menu_wrapper_module_15783825632451363_" class="hs-menu-wrapper active-branch flyouts hs-menu-flow-vertical" role="navigation" data-sitemap-name="" data-menu-id="" aria-label="Navigation Menu">
|
||
<ul role="menu">
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/website-terms-of-use" role="menuitem" target="_self">Website terms of use</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/privacy-policy" role="menuitem" target="_self">Privacy policy</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/sexual-harassment-policy" role="menuitem" target="_self">Sexual Harassment Policy</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/data-privacy-notice-for-job-applicants" role="menuitem" target="_self">Data Privacy for Job Seekers</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/cookie-notice" role="menuitem" target="_self">Cookie Notice</a></li>
|
||
<li class="hs-menu-item hs-menu-depth-1" role="none"><a href="https://www.container-solutions.com/events-code-of-conduct" role="menuitem" target="_self">Events Code of Conduct</a></li>
|
||
</ul>
|
||
</div></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
<div class="span4 widget-span widget-type-cell four-col" style="" data-widget-type="cell" data-x="8" data-w="4">
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-6 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_15783822780451167" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-rich_text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span id="hs_cos_wrapper_module_15783822780451167_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_rich_text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="rich_text"><h4 style="line-height: 1.5; font-size: 20px; margin-bottom: 5px !important;"><span style="color: #1b1464;"><strong>Talk to sales</strong></span></h4>
|
||
<div style="line-height: 1.5;"><span style="color: #1b1464;"><a href="mailto:info@container-Solutions.com" rel=" noopener" style="color: #1b1464;">info@container-solutions.com</a></span></div></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-7 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_158452391621561" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
|
||
<div class="row-fluid">
|
||
<div class="span12 connected-col" style="margin-left:0">
|
||
<div class="row-fluid-wrapper">
|
||
<div class="row-fluid">
|
||
<h4 class="footer_header">
|
||
Stay In Touch
|
||
</h4>
|
||
<ul>
|
||
<li><a href="https://www.linkedin.com/company/container-solutions/" target="_blank"><i class="fab fa-linkedin" style="color:white"></i></a></li>
|
||
<li><a href="https://twitter.com/containersoluti" target="_blank"><i class="fab fa-twitter" style="color:white"></i></a></li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-8 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget copy-right-text" style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_15783823043581171" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module widget-type-rich_text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><span id="hs_cos_wrapper_module_15783823043581171_" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_rich_text" style="" data-hs-cos-general-type="widget" data-hs-cos-type="rich_text"><p><span style="color: #1b1464;">© 2024 Container Solutions</span></p></span></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
<div class="row-fluid-wrapper row-depth-1 row-number-9 ">
|
||
<div class="row-fluid ">
|
||
<div class="span12 widget-span widget-type-custom_widget " style="" data-widget-type="custom_widget" data-x="0" data-w="12">
|
||
<div id="hs_cos_wrapper_module_1585658103724856" class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module" style="" data-hs-cos-general-type="widget" data-hs-cos-type="module"><!-- <script>
|
||
$(window).load(function() {
|
||
$("body").addClass('all-loaded');
|
||
});
|
||
</script> --></div>
|
||
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
</div>
|
||
</div><!--end widget-span -->
|
||
</div><!--end row-->
|
||
</div><!--end row-wrapper -->
|
||
|
||
</div><!--end footer -->
|
||
</div><!--end footer wrapper -->
|
||
|
||
|
||
<!-- HubSpot performance collection script -->
|
||
<script defer src="/hs/hsstatic/content-cwv-embed/static-1.1293/embed.js"></script>
|
||
<script src="https://blog.container-solutions.com/hubfs/hub_generated/template_assets/1/29544596312/1743407268787/template_360_Design_Script.min.js"></script>
|
||
<script>
|
||
var hsVars = hsVars || {}; hsVars['language'] = 'en';
|
||
</script>
|
||
|
||
<script src="/hs/hsstatic/cos-i18n/static-1.53/bundles/project.js"></script>
|
||
<script src="https://blog.container-solutions.com/hubfs/hub_generated/template_assets/1/29086575625/1743407264175/template_CS--Megamenu.min.js"></script>
|
||
<script src="https://blog.container-solutions.com/hubfs/hub_generated/module_assets/1/29104102065/1743627972543/module_CS--Megamenu__helper.min.js"></script>
|
||
<script src="/hs/hsstatic/keyboard-accessible-menu-flyouts/static-1.17/bundles/project.js"></script>
|
||
<script src="/hs/hsstatic/AsyncSupport/static-1.501/js/comment_listing_asset.js"></script>
|
||
<script>
|
||
function hsOnReadyPopulateCommentsFeed() {
|
||
var options = {
|
||
commentsUrl: "https://api-na1.hubapi.com/comments/v3/comments/thread/public?portalId=2252258&offset=0&limit=10000&contentId=116545276742&collectionId=5674137972",
|
||
maxThreadDepth: 10,
|
||
showForm: true,
|
||
|
||
target: "hs_form_target_e5ba3739-20e2-48cd-8272-c926646d555c",
|
||
replyTo: "Reply to <em>{{user}}</em>",
|
||
replyingTo: "Replying to {{user}}"
|
||
};
|
||
window.hsPopulateCommentsFeed(options);
|
||
}
|
||
|
||
if (document.readyState === "complete" ||
|
||
(document.readyState !== "loading" && !document.documentElement.doScroll)
|
||
) {
|
||
hsOnReadyPopulateCommentsFeed();
|
||
} else {
|
||
document.addEventListener("DOMContentLoaded", hsOnReadyPopulateCommentsFeed);
|
||
}
|
||
|
||
</script>
|
||
|
||
|
||
<!--[if lte IE 8]>
|
||
<script charset="utf-8" src="https://js.hsforms.net/forms/v2-legacy.js"></script>
|
||
<![endif]-->
|
||
|
||
<script data-hs-allowed="true" src="/_hcms/forms/v2.js"></script>
|
||
|
||
<script data-hs-allowed="true">
|
||
hbspt.forms.create({
|
||
portalId: '2252258',
|
||
formId: 'e5ba3739-20e2-48cd-8272-c926646d555c',
|
||
pageId: '116545276742',
|
||
region: 'na1',
|
||
pageName: "Reflections on Amazon Prime Video\u2019s Monolith Move",
|
||
contentType: 'blog-post',
|
||
|
||
formsBaseUrl: '/_hcms/forms/',
|
||
|
||
|
||
|
||
css: '',
|
||
target: "#hs_form_target_e5ba3739-20e2-48cd-8272-c926646d555c",
|
||
type: 'BLOG_COMMENT',
|
||
|
||
submitButtonClass: 'hs-button primary',
|
||
formInstanceId: '4798',
|
||
getExtraMetaDataBeforeSubmit: window.hsPopulateCommentFormGetExtraMetaDataBeforeSubmit
|
||
});
|
||
|
||
window.addEventListener('message', function(event) {
|
||
var origin = event.origin; var data = event.data;
|
||
if ((origin != null && (origin === 'null' || document.location.href.toLowerCase().indexOf(origin.toLowerCase()) === 0)) && data !== null && data.type === 'hsFormCallback' && data.id == 'e5ba3739-20e2-48cd-8272-c926646d555c') {
|
||
if (data.eventName === 'onFormReady') {
|
||
window.hsPopulateCommentFormOnFormReady({
|
||
successMessage: "Hi, your comment will be reviewed and posted as soon as possible.",
|
||
target: "#hs_form_target_e5ba3739-20e2-48cd-8272-c926646d555c"
|
||
});
|
||
} else if (data.eventName === 'onFormSubmitted') {
|
||
window.hsPopulateCommentFormOnFormSubmitted();
|
||
}
|
||
}
|
||
});
|
||
</script>
|
||
|
||
|
||
<!-- Start of HubSpot Analytics Code -->
|
||
<script type="text/javascript">
|
||
var _hsq = _hsq || [];
|
||
_hsq.push(["setContentType", "blog-post"]);
|
||
_hsq.push(["setCanonicalUrl", "https:\/\/blog.container-solutions.com\/reflections-on-amazon-prime-videos-monolith-move"]);
|
||
_hsq.push(["setPageId", "116545276742"]);
|
||
_hsq.push(["setContentMetadata", {
|
||
"contentPageId": 116545276742,
|
||
"legacyPageId": "116545276742",
|
||
"contentFolderId": null,
|
||
"contentGroupId": 5674137972,
|
||
"abTestId": null,
|
||
"languageVariantId": 116545276742,
|
||
"languageCode": "en",
|
||
|
||
|
||
}]);
|
||
</script>
|
||
|
||
<script type="text/javascript" id="hs-script-loader" async defer src="/hs/scriptloader/2252258.js"></script>
|
||
<!-- End of HubSpot Analytics Code -->
|
||
|
||
|
||
<script type="text/javascript">
|
||
var hsVars = {
|
||
render_id: "4cc653d7-d2b7-490b-8a3b-2dd2c554de5b",
|
||
ticks: 1783393705701,
|
||
page_id: 116545276742,
|
||
|
||
content_group_id: 5674137972,
|
||
portal_id: 2252258,
|
||
app_hs_base_url: "https://app.hubspot.com",
|
||
cp_hs_base_url: "https://cp.hubspot.com",
|
||
language: "en",
|
||
analytics_page_type: "blog-post",
|
||
scp_content_type: "",
|
||
|
||
analytics_page_id: "116545276742",
|
||
category_id: 3,
|
||
folder_id: 0,
|
||
is_hubspot_user: false
|
||
}
|
||
</script>
|
||
|
||
|
||
<script defer src="/hs/hsstatic/HubspotToolsMenu/static-1.640/js/index.js"></script>
|
||
|
||
|
||
|
||
<!-- Twitter universal website tag code -->
|
||
<script>
|
||
!function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments);
|
||
},s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js',
|
||
a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script');
|
||
// Insert Twitter Pixel ID and Standard Event data below
|
||
twq('init','ny8jx');
|
||
twq('track','PageView');
|
||
</script>
|
||
<!-- End Twitter universal website tag code -->
|
||
|
||
<div id="fb-root"></div>
|
||
<script>(function(d, s, id) {
|
||
var js, fjs = d.getElementsByTagName(s)[0];
|
||
if (d.getElementById(id)) return;
|
||
js = d.createElement(s); js.id = id;
|
||
js.src = "//connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v3.0";
|
||
fjs.parentNode.insertBefore(js, fjs);
|
||
}(document, 'script', 'facebook-jssdk'));</script> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="https://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
|
||
|
||
|
||
|
||
|
||
<!-- Generated by the HubSpot Template Builder - template version 1.03 -->
|
||
|
||
</body></html> |