Files
nexus/sreweekly/articles/138/03-colmmacc-on-twitter-shuffle-sharding.html
2026-09-12 17:23:01 +08:00

1374 lines
118 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<title>Thread by @colmmacc: It&#039;s my ten year anniversary at AWS, I got a new badge and everything! To celebrate, I&#039;m going to tweet out the lightning talk I gave at las…</title>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#575553">
<link rel="manifest" href="/manifest.json">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
<meta name="apple-mobile-web-app-title" content="Thread Reader">
<meta name="application-name" content="Thread Reader">
<meta name="theme-color" content="#575553">
<meta name="description" content="Thread by @colmmacc: It&#039;s my ten year anniversary at AWS, I got a new badge and everything! To celebrate, I&#039;m going to tweet out the lightnin I gave at last week&#039;s Amazon dev con. It&#039;s all about my favorite thing from my ten years: Shuffle Sharding! Ever…">
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
<link rel="stylesheet" href="https://threadreaderapp.com/styles/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" type="0eb08f2d879f1d5b0fff5d11-text/javascript"></script>
<meta property="og:title" content="Thread by @colmmacc: It&#039;s my ten year anniversary at AWS, I got a new badge and everything! To celebrate, I&#039;m going to tweet out the lightning talk I gave at las…" />
<meta property="og:image" content="https://threadreaderapp.com/images/screenshots/thread/1034492056968736768.jpg" />
<meta property="og:image:alt" content="Thread Reader Logo" />
<meta property="og:url" content="https://threadreaderapp.com/thread/1034492056968736768.html" />
<meta property="og:description" content="Thread by @colmmacc: It&#039;s my ten year anniversary at AWS, I got a new badge and everything! To celebrate, I&#039;m going to tweet out the lightnin I gave at last week&#039;s Amazon dev con. It&#039;s all about my favorite thing from my ten years: Shuffle Sharding! Ever…" />
<meta property="article:author" content="https://twitter.com/colmmacc" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:creator" content="@colmmacc" />
<meta property="twitter:image" content="https://threadreaderapp.com/images/screenshots/thread/1034492056968736768.jpg" />
<meta property="twitter:description" content="Thread by @colmmacc: It&#039;s my ten year anniversary at AWS, I got a new badge and everything! To celebrate, I&#039;m going to tweet out the lightnin I gave at last week&#039;s Amazon dev con. It&#039;s all about my favorite thing from my ten years: Shuffle Sharding! Ever…" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:type" content="image/jpeg" />
<meta property="og:type" content="article" />
<script type="0eb08f2d879f1d5b0fff5d11-text/javascript">
;!function(e){var n=!1;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var o=window.Cookies,t=window.Cookies=e();t.noConflict=function(){return window.Cookies=o,t}}}(function(){function e(){for(var e=0,n={};e<arguments.length;e++){var o=arguments[e];for(var t in o)n[t]=o[t]}return n}function n(o){function t(n,r,i){var c;if("undefined"!=typeof document){if(arguments.length>1){if("number"==typeof(i=e({path:"/"},t.defaults,i)).expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}i.expires=i.expires?i.expires.toUTCString():"";try{c=JSON.stringify(r),/^[\{\[]/.test(c)&&(r=c)}catch(e){}r=o.write?o.write(r,n):encodeURIComponent(String(r)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),n=(n=(n=encodeURIComponent(String(n))).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var s="";for(var f in i)i[f]&&(s+="; "+f,!0!==i[f]&&(s+="="+i[f]));return document.cookie=n+"="+r+s}n||(c={});for(var p=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,u=0;u<p.length;u++){var l=p[u].split("="),C=l.slice(1).join("=");this.json||'"'!==C.charAt(0)||(C=C.slice(1,-1));try{var g=l[0].replace(d,decodeURIComponent);if(C=o.read?o.read(C,g):o(C,g)||C.replace(d,decodeURIComponent),this.json)try{C=JSON.parse(C)}catch(e){}if(n===g){c=C;break}n||(c[g]=C)}catch(e){}}return c}}return t.set=t,t.get=function(e){return t.call(t,e)},t.getJSON=function(){return t.apply({json:!0},[].slice.call(arguments))},t.defaults={},t.remove=function(n,o){t(n,"",e(o,{expires:-1}))},t.withConverter=n,t}return n(function(){})});
var base_path = "https://threadreaderapp.com";
var showAds = true
var google_ad_client = "ca-pub-3755072543989337";
var google_analytics = "UA-104569155-1";
var isPremium = Cookies.get('is_premium') || false;
var isLogged = Cookies.get('is_logged') || false;
var showAds = !isPremium && window.showAds;
if (showAds) {
var adsbygoogle = window.adsbygoogle || [];
adsbygoogle.push({
google_ad_client: window.google_ad_client,
enable_page_level_ads: true
})
}
var retries = {}
function imgErr(img) {
var src = img.src.split('?')[0]
if (!retries[src]) {
retries[src] = true
img.src = src + '?refresh=' + Date.now()
}
else {
img.onerror = null
img.src = '/images/default_avatar.png'
}
}
</script>
<style>@keyframes rotation{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}body{font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Arial,sans-serif;color:rgba(0,0,0,.84);background:#fff;xbackground:red;background-attachment:fixed;margin-bottom:50px}h1,h2,h3,h4,h5,h6{padding:0;margin:0;color:rgba(0,0,0,.9);font-weight:700;font-family:Lato,sans-serif}p{font-size:14px}a{color:#1da1f2}a:active,a:focus,a:hover,a:visited{text-decoration:underline;opacity:.8}.table thead th{text-align:left}button{cursor:pointer}.background-gray{background:#f8f9fa!important;border:1px solid #eee;border-width:1px 0}.background-gradient-gray{background:#f8f9fa;background:-moz-linear-gradient(top,#fff 0%,#f8f9fa 100%);background:-webkit-linear-gradient(top,#fff 0%,#f8f9fa 100%);background:linear-gradient(to bottom,#fff 0%,#f8f9fa 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f8f9fa',GradientType=0 );border-bottom:1px solid #eee}.background-blue{background:#e6ecf0;border-top:1px solid #eee}.background-green{background:#e8f3ec!important;border-top:1px solid #eee}.cookies{position:fixed;bottom:0;right:0;background:#515151;color:#fff;padding:16px;width:250px;border-radius:8px 0 0 0;font-size:.85rem}.cookies .close span{color:#fff;padding:8px;opacity:.8;line-height:normal}.accent,.support-banner a{color:#fe3873}.navbar{height:58px;color:#fff;background:-webkit-linear-gradient(left,#000,#515151);margin-bottom:20px}.section-one{padding:2rem 0 1rem}.below-nav,.section-one{margin-top:-20px}#prefetch #text,.below-nav.alert{text-align:center}.show-premium #prefetch{position:absolute;top:50%;left:50%;width:242px;height:16px;margin-left:calc(242px/-2)}#prefetch #text{font-size:.7em;font-weight:700;padding-top:16px;color:#666}.anchorable{position:relative}.modal .anchorable{font-size:1.2rem;margin-bottom:10px}.anchor{position:absolute;top:-82px}body>.container{padding:0 15px}.container~.container{padding-top:0}.navbar-brand{background-image:url(/images/header-logo-mobile.png);background-size:26px 18px;background-repeat:no-repeat;background-position:top left;width:152px;height:18px}.navbar-brand,.navbar-brand:hover{color:transparent}.support-banner{display:flex;justify-content:center;align-items:center;margin-top:-20px;border-bottom:1px solid #ccc;text-align:center;margin-bottom:20px;background:#e6ecf0;height:50px;color:#000}.support-banner img{height:35px;float:left}.support-banner p{font-size:1rem;font-family:'Lato',sans-serif}.top-right-action{z-index:1032;position:absolute;top:10px;right:10px}.button{border-radius:5px;color:#fff;font-size:1.05rem;padding:6px 12px;font-weight:600;display:inline-block;border:0;cursor:pointer}.button,.nav-pills .nav-link.active{background:#63615f}.button:active,.button:focus,.button:hover{color:#fff;text-decoration:none;opacity:.8}.button.button-main-action,.button.button-share{background:#fe3873}.button.button-cancel{background:#ababab}.button-danger{color:#fff;background:red;font-weight:700}.button.button-bar-action{font-size:.9rem;padding:5px 8px 5px 32px;background-position:5px center;background-repeat:no-repeat;background-size:20px;background-color:#fe3873;margin-bottom:4px}.button.button-bar-action.button-subscribe{background-image:url(/images/icon-subscribe-128.png)}.button.button-bar-action.button-bar-share{padding:5px 8px}.button.button-bar-action.button-archive{background-image:url(/images/icon-archive.png)}.button.button-bar-action.button-read-later{background-image:url(/images/icon-read-later-128.png)}.btn-share-thread span.txt,.content-header.content-tweet br,.thread-card br{display:none}.box-bar-action form,.btn-share-thread.with-txt span.txt,.share-inline a{display:inline-block}.btn-share-thread .btn-outline-primary{border-color:#fff;color:#38a1f3;padding:.25rem 1rem}.btn-share-thread .btn-outline-primary:hover{background:#fff;color:#333}.share-modal{text-align:center}.share-inline a{margin-bottom:1.5rem;font-size:.85rem}#tweet_1.content-tweet,.content-header.content-tweet{font-family:'Lato',sans-serif;font-size:1.5rem;line-height:1.5;xcolor:#000}.ribbon{position:absolute;top:0;right:0;padding:10px;z-index:1000}.ribbon-content{position:relative;width:100%;height:35px}.ribbon.base{background:#3498db;color:#fff;border-right:5px solid #8bc4ea}.ribbon:after,.ribbon:before{content:'';position:absolute;left:-9px;border-left:10px solid transparent}.ribbon:before{top:0}.ribbon:after{bottom:0}.ribbon.base:before{border-top:27px solid #3498db}.ribbon.base:after{border-bottom:27px solid #3498db}.ribbon span{display:block;font-size:12px;font-weight:600}.ribbon span a{color:#fff;text-decoration:underline}.thread-info{color:#333;font-size:.8rem;letter-spacing:-.6px;white-space:nowrap}.thread-info .count{padding-right:5px}.thread-info a.time{color:#333}#viewcount{color:#999;font-size:.7rem}.viewcount{margin:0;padding:0}.box-user{margin:.5rem 0;border-radius:5px}.card .box-user{margin:0}.box-user .avatar{padding-right:10px}.box-user .avatar img{border-radius:60px;width:60px;height:60px}.t-user .box-user .avatar img,.user-page .box-user .avatar img{border-radius:50px;width:50px;height:50px}.box-user .username{display:block}.box-user .screenName,.box-user .username,.entity-url-preview a small,.entity-url-preview a strong{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.box-user .username a{font-size:1rem;font-weight:700;color:#2e2c2d}.box-user .screenName a{font-size:.8em;color:#666;position:relative}.box-user .screenName,form.subscribe{display:inline}.userbio{font-size:.75rem;color:#777;display:block;line-height:1rem;margin:3px 0 5px}.box-bar-action{text-align:right;margin-bottom:1.5rem;margin-top:1rem}.user-info .box-subscribers{border-top:1px solid #ccc;margin:10px -20px 0;padding:20px 20px 0}.box-subscribers .subscriber-pp{display:inline-block;width:25px}.box-subscribers .subscriber-pp img{height:30px;border-radius:24px;border:solid 1px #e5e5e7;padding-right:0}.box-subscribers .more{display:inline-block;font-size:14px;color:#333}.box-archive,.box-subscribe{text-align:center;padding:1rem 0 2rem}.box-archive strong,.box-subscribe strong{color:#fe3873;margin-bottom:16px;display:block}.box-archive strong{margin-bottom:0}.box-archive .details{margin-bottom:16px;display:block}.button.button-follow{padding:3px 6px 3px 25px}.button.button-embed,.button.button-follow,.button.button-twitter{background:#fff;color:#2e2c2d;background-repeat:no-repeat;font-size:.83rem;background-position:5px 5px;margin-right:6px;margin-top:6px}.button.button-twitter{padding:3px 6px 3px 25px}.box-user .button-author-related{color:#38a1f3;border-color:#38a1f3;padding:.09rem .5rem;font-size:.75rem;line-height:1.5;border-radius:.2rem}.box-user .button-author-related:hover{color:#fff;background-color:#38a1f3;border-color:#38a1f3}.card-user form.subscribe{float:none;display:block;text-align:center}.read-on-twitter{white-space:nowrap}.follow-on-twitter{font-size:.75rem}.popover-body{padding:1.75rem}.btn-xsm,.btn-xxsm{line-height:1.5;border-radius:.2rem}.btn-xsm{padding:.25rem .5rem;font-size:.75rem}.btn-xxsm{padding:2px 8px;font-size:10px}.retweet{width:1.35em;margin-right:0;vertical-align:middle;fill:#999}.retweet:hover{fill:#000}.twitter-actions{white-space:nowrap}.twitter-actions a{text-decoration:none}.tw-permalink{text-align:right;font-size:14px;width:12px;color:#eee}.tw-permalink a{color:#ddd}a.tweet-click{color:#000;text-decoration:none}.t-section.promo ul,.user-page .other-info{text-align:left}.button.button-embed{padding:3px 6px;float:right}.content-tweet{font-family:Georgia,Cambria,"Times New Roman",Times,serif;font-style:normal;font-size:18px;line-height:1.58;letter-spacing:-.003em;overflow:hidden;word-wrap:break-word;margin-bottom:1.25rem;color:#000;cursor:pointer}.t-tweet{transition:all .3s ease 0s}.t-tweet:hover{background:#f5f8fa}.col-force-refresh{opacity:.8;font-size:.7rem;text-align:center}.entity-url-preview{background:#fff;border:1px #e1e8ed solid;border-radius:8px;overflow:hidden;text-align:left!important}.entity-url-preview .paragraph{margin:1rem;font-size:.8rem;font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Arial,sans-serif}.entity-url-preview a small,.entity-url-preview a strong{color:#2e2c2d;display:block;font-size:.85rem}.entity-url-preview a{text-decoration:none;color:#63615f}.entity-url-preview a small{color:#1da1f2;margin-top:8px;padding-left:20px;background-repeat:no-repeat;background-image:url(/images/icon-link.png);background-position:0 2px;font-size:.75rem}.entity-url-preview .img-cover{display:block;height:100%;background-repeat:no-repeat;background-size:cover;background-position:center;background-color:#eee}.entity-url-preview .img-cover img{visibility:hidden}.entity-reveal-action{background:#bbb;font-size:.5rem;font-family:sans-serif;font-weight:400;padding:3px 6px;position:relative;top:-3px;margin-right:5px}.alert{font-size:.875rem}.alert-error{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-custom{background:#e6ecf0!important;border:1px solid #eee}.alert-custom a{color:#fe3873;text-decoration:underline}.box-message{border-width:1px 0;border-style:solid;padding:12px 16px;margin:18px 0;border-color:#65a0c6;background:#b3d9f1}.box-error,.box-support{border-color:#e8d35c;background:#fff4af}.box-info{border-color:#65a0c6;background:#b3d9f1}.box-success{border-color:#7abd6f;background:#c0ebb9}.button.button-support{background:#fff;color:#2e2c2d;padding:3px 6px;font-size:.95rem}.thread-card{transition:all 300ms;background:#fff;padding:16px;margin-bottom:20px;border:1px solid rgba(0,0,0,.125);border-radius:.25rem;position:relative;cursor:pointer;box-shadow:0 10px 40px 0 rgba(62,57,107,.07),0 2px 9px 0 rgba(62,57,107,.06)}.thread-card:hover{transition:all 300ms;transform:translateY(-5px) translateZ(0);box-shadow:0 16px 32px 0 rgba(62,57,107,.28),0 0 0 transparent}.thread-card .box-user{background:0 0;padding:0 0 10px;border-bottom:solid 1px #a4a4a4;margin-bottom:14px;margin-top:0;border-radius:0}.thread-card .box-user .avatar img{border:solid 2px #fff;border-radius:42px;width:42px;height:42px}.thread-card .box-user .username{display:block;font-size:1.1rem;font-weight:700;color:#2e2c2d}.thread-card .box-user .screenName{font-size:.9em;color:#575553;display:block;position:relative;top:-4px}.thread-card .time{font-size:.7rem;position:absolute;width:100px;text-align:center;top:66px;left:-50px;background:#fff;margin-left:50%}.thread-card .content-tweet{font-size:1rem;margin-bottom:1.2rem}.thread-card .entity-embed,.thread-card .entity-url-preview,.thread-card .entity-video{display:none}.thread-card .card-tweets a,.thread-card .card-tweets a:hover,a.thread-card-wrap,a.thread-card-wrap:hover{color:#575553;text-decoration:none;opacity:1}.card-tweets{height:250px;max-height:250px;overflow:hidden;margin-bottom:16px}.button-tag{display:inline-block;color:#2e2c2d;border:1px #cfcfcf solid;border-radius:5px;background:#fff;padding:3px 6px;margin:0 6px 12px 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100%}a.button-tag:hover{color:#2e2c2d;text-decoration:none}.nop,.nop a{color:#a4a4a4}.nop-full{font-size:1rem}input{border:1px #a4a4a4 solid;color:#767472}.vertical-align{display:flex;align-items:center}.tr-fadeout{visibility:hidden;opacity:0;transition:visibility 0s 1s,opacity 1s linear}.t-rel{margin-bottom:3rem}html{position:relative;min-height:100%}.footer,.sharingfooter{bottom:0;display:flex;align-items:center}.footer{width:100%;display:block;font-size:.9rem;background:#000;position:absolute;padding:10px 0}.footer a{color:#fff}.footer a.btn-circle{width:30px;height:30px;text-align:center;padding:6px 0;font-size:12px;line-height:1.428571429;border-radius:15px;background:#999;color:#fff}.footer a.btn-circle.twitter{background:#38a1f3;color:#fff}.footer>.container{padding-right:15px;padding-left:15px}.sharingfooter{position:fixed;left:0;right:0;background:#fff;z-index:98;box-shadow:0 0 1px rgba(0,0,0,.4);height:50px;vertical-align:middle;font-size:13px;justify-content:center;padding:0 20px}.sharingfooter .btn-fb-share,.sharingfooter .btn-twitter{font-weight:700;padding:.25rem 1.6rem}.sharingfooter .btn-fb-share{margin-left:10px}.sharingfooter .follow-us{display:none}.entity-embed,.entity-image,.entity-url-preview,.entity-video,.entity-video-gif{font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Arial,sans-serif;color:#575553;font-size:.8rem;display:block;margin:10px 0 0}.entity-embed .youtube-player,.entity-image img,.entity-video video,.entity-video-gif video{max-width:100%;width:100%;background:#fff;border-radius:15px;border:solid 1px #e1e8ed}.entity-embed .twitter-player blockquote{max-width:100%;background:#fff;border-radius:15px;border:solid 1px #e1e8ed}.entity-image a:active,.entity-image a:focus,.entity-image a:hover,.entity-image a:visited{opacity:1}.entity-embed .youtube-player{max-height:600px}.entity-embed .twitter-player blockquote{text-align:left;padding:32px;min-width:500px;width:500px;margin:0 auto}.entity-embed .twitter-player blockquote:before{content:"External Tweet loading...\AIf nothing shows, it may have been deleted";display:block;white-space:pre}.entity-mention{opacity:.75;color:#515151}.homepage-header{text-align:center;font-weight:700;font-size:1.6rem;line-height:1.4}.list-content-header{font-family:'Lato',sans-serif;font-size:1.125rem;line-height:1.5;color:rgba(0,0,0,.9);font-weight:700;margin:1em 0}.homepage-header{padding:1rem 0}.homepage-search{padding-bottom:.8rem}.account-reassurance,.card{box-shadow:0 10px 40px 0 rgba(62,57,107,.07),0 2px 9px 0 rgba(62,57,107,.06)}.card-search,.card-user{border:0;background:#f4f4f4;border-radius:0;margin-bottom:20px;border-top:solid 5px #63615f}.card-user{padding:16px 16px 0}.homepage-title{font-family:Lato,sans-serif;font-size:1.4rem;text-align:center;line-height:2.1rem;padding-bottom:1rem}.homepage-title strong{color:#fe3873}.lead-search .button-tag{display:inline;display:inline-flex;font-size:.7rem;text-decoration:none;color:#333;cursor:pointer}.hashtags{margin-bottom:4rem}.btn-primary,.btn-primary:active,.btn-primary:focus,.btn-primary:hover{border-color:#fe3873;background-color:#fe3873}.btn-primary:hover{opacity:.8}.hide-mobile,body.isp .show-freemium{display:none}.box-ads{width:100%;position:relative;background-color:transparent!important;border:0!important;margin-bottom:20px}.ad-on-top{margin:10px auto}.page-help h3,.page-help h4,.page-help h5{padding:1rem 0 .8rem}.t-section{padding:1rem 0}.t-section.promo{text-align:center}.jumbotron img.icon,.t-section.promo img.icon{width:40%}.t-section .nav{margin:-2.5rem 0 3rem}.t-section h2.header{font-size:1.4rem}.archive-table{font-size:.875rem}.nav-link{font-family:Lato,sans-serif;padding:.5rem 0;font-size:14px;margin-right:2em;color:#999}.nav-item.active,.nav-link.active,.nav-link:active,.nav-link:hover,.sidenav .nav-item.active,.sidenav .nav-link.active{color:#fff}.login-box{text-align:center}.filter-thread{font-size:1rem;width:auto;float:right}.load-more-container{margin-bottom:3rem}.sidenav{height:100%;width:0;position:fixed;z-index:999;top:0;left:0;background-color:#111;overflow-x:hidden;padding-top:60px;transition:.5s}.sidenav a{padding:8px 8px 8px 32px;text-decoration:none;font-size:18px;white-space:nowrap;color:#818181;display:block;transition:.3s}.sidenav a:hover{color:#f1f1f1}.sidenav .closebtn{position:absolute;top:0;right:5px;font-size:36px;margin-left:50px}.badge-custom{background-color:#fe3873;vertical-align:top;color:#fff}.enjoy-boxes{border:0}.overlay-no-js{position:absolute;top:0;bottom:0;left:0;right:0;background:rgba(0,0,0,.5);transition:opacity 200ms;visibility:hidden;opacity:0}.overlay-no-js.light{background:rgba(255,255,255,.5)}.overlay-no-js .cancel{position:absolute;width:100%;height:100%;cursor:default}.overlay-no-js:target{visibility:visible;opacity:1}.popup{margin:75px auto;padding:20px;background:#fff;border:1px solid #666;width:400px;box-shadow:0 0 50px rgba(0,0,0,.5);position:relative}.popup h2{font-size:20px;margin-bottom:20px;margin-top:0;color:#666;font-family:"Trebuchet MS",Tahoma,Arial,sans-serif}.popup .close{position:absolute;width:20px;height:20px;top:20px;right:20px;opacity:.8;transition:all 200ms;font-size:24px;font-weight:700;text-decoration:none;color:#666}.popup .close:hover{opacity:1}.popup .content{max-height:400px;overflow:auto}.popup p{margin:0 0 1em}.popup p:last-child{margin:0}@media screen and (max-height:450px){.sidenav{padding-top:15px}.sidenav a{font-size:18px}}body.isp .hide-premium{display:none!important}body.isp .show-premium{display:block!important}@media (min-width:576px){.navbar-brand{background-size:152px 18px;background-image:url(/images/header-logo.png)}.homepage-header{padding:1.5rem 0 4rem}.homepage-header strong{font-size:155%}.lead-second{display:block;padding:1rem 0}.homepage-header{font-size:1.8rem}.hide-mobile{display:initial}.show-mobile{display:none}.box-ads{width:100%}.box-user .avatar img,.t-user .box-user .avatar img{border-radius:70px;width:70px;height:70px}.card-tweets{height:250px;max-height:200px;overflow:hidden;margin-bottom:16px}.twitter-logo{width:45px}.viewcount{text-align:right}p{font-size:1rem}.content-tweet{font-size:1.1875rem}.list-content-header{font-size:1.4rem}}@media (min-width:768px){.card-tweets{height:250px;max-height:250px;overflow:hidden;margin-bottom:16px}.homepage-title{font-size:1.6rem;line-height:2rem}.container{max-width:960px}.container.narrow{max-width:740px;padding-left:20px;padding-right:20px}.navbar{margin-bottom:40px}.below-nav,.section-one{margin-top:-40px}.below-nav{margin-bottom:30px}.support-banner{margin-top:-40px;margin-bottom:40px}.sharingfooter{justify-content:flex-end}.sharingfooter .follow-us{display:block;position:absolute;left:10px}#tweet_1.content-tweet{font-size:1.7rem}.t-section{padding:3rem 0}.login-box,.t-section,.t-section.promo{text-align:left}.jumbotron img.icon,.t-section.promo img.icon{width:80%}.t-section h2.header{font-size:2rem}.user-page .box-user .avatar img{border-radius:90px;width:90px;height:90px}.user-page .other-info{text-align:center}.enjoy-boxes{border-left:1px solid #ccc}.box-bar-action{margin-top:0}}@media (min-width:992px){.card-tweets{height:250px;max-height:250px;overflow:hidden;margin-bottom:16px}.entity-embed .youtube-player,.entity-image img,.entity-url-preview,.entity-video video,.entity-video-gif video,.thread-card .entity-embed .youtube-player,.thread-card .entity-image img,.thread-card .entity-video video,.thread-card .entity-video-gif video{max-width:100%;width:100%}}.emoji{width:16px;height:16px;position:relative;top:-1px}.unroll-item{text-overflow:ellipsis;overflow:hidden}.delete-thread,.hide-thread{position:absolute;right:5px;top:6px;font-weight:700;font-variant:small-caps;background:red;display:inline-block;padding:0 6px 3px;line-height:21px;border-radius:8px;border-width:3px;cursor:pointer;z-index:5}.delete-thread{color:#fff}.hide-thread{color:#8b0000;background:#d3d3d3}.delete-thread:hover,.hide-thread:hover{color:red;background:#fff}.account-reassurance{margin-top:1rem;border:0;background:#f4f4f4;border-radius:0;padding:16px;margin-bottom:20px;border-top:solid 5px #63615f}.account-reassurance h2{font-weight:700;font-size:1.5rem;padding-bottom:1rem}.account-reassurance .content-tweet{font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Arial,sans-serif}.see-more{display:none}.home-page .see-more,.toc a{display:block}.toc{margin-bottom:32px}.toc a{color:#333}.toc a.toc-h2{padding-left:16px;font-size:1.25rem;padding-top:8px;text-transform:uppercase}.toc a.toc-h3{padding-left:32px;font-size:1rem;padding-top:4px}.reassurance h3{margin:1rem 0;font-weight:700}.help-page h2{margin-top:2rem;text-transform:uppercase;font-size:1.5rem;padding-top:2rem;border-top:1px solid #ccc}.help-page h3,.reassurance h3{font-size:1.25rem}.about-press a,.about-team a,.option-or-other::after{display:block;text-align:center;color:#575553}.about-press a:hover,.about-team a:hover{text-decoration:none}.about-press img{width:80%;max-width:80%}.about-press strong{display:block;margin:24px;font-size:1.3rem}.about-team{margin-top:32px}.about-team img{display:inline-block;margin-bottom:16px;border-radius:128px;max-width:100%;width:128px}.about-quote{font-size:1.2rem;font-style:italic;background:#eee;padding:16px}.about-quote small{display:block;text-align:right}.ul-max-height{max-height:491px;overflow-y:auto}.option-or-other{position:relative;width:50%}.option-or-other::after{content:"or";position:absolute;font-size:12px;color:#a5a5a5;background:#fff;top:-10px;width:28px;left:50%;margin-left:-14px}.option-or-other.buffer{display:block;margin:2rem auto}.secondary-button-container{overflow:hidden!important;border-radius:5px!important;display:inline-block!important;width:100%!important;text-align:center!important}.patreon-button,.paypal-button{color:#fff;display:inline-block;min-height:35px;background:#009cde;font-size:16px;font-style:italic;border-radius:4px;line-height:35px;text-align:center;width:250px}.patreon-button:active,.patreon-button:hover,.patreon-button:visited,.paypal-button:active,.paypal-button:hover,.paypal-button:visited{color:#fff;text-decoration:none}.paypal-button .paypal-logo{height:17px;max-height:21px;min-height:14px;margin-top:-4px}.btn-twitter,.with-color .share-twitter,.with-color .share-twitter:hover{color:#fff;background-color:#38a1f3;border-color:#38a1f3}.btn-fb-share,.with-color .share-fb,.with-color .share-fb:hover{color:#fff;background-color:#3b5998;border-color:#3b5998}.with-color .share-email,.with-color .share-email:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.with-color .share-embed,.with-color .share-embed:hover{color:#fff;background-color:#007bff;border-color:#007bff}.with-color .share-email:hover,.with-color .share-embed:hover,.with-color .share-fb:hover,.with-color .share-twitter:hover{opacity:.8}.btn-paypal{background:#3b7bbf;border:#3b7bbf}.btn-patreon{background:#f96854;border:#f96854}.stripe-button-el{background:0 0!important;box-shadow:none!important;width:250px!important;display:block!important;margin:0 auto}.profile .stripe-button-el{width:auto!important;margin-right:5px}.stripe-button-el span{min-height:37px!important;background:#fe3873!important;border:0!important;font-size:16px!important;font-style:italic!important;font-weight:700!important;box-shadow:none!important;text-shadow:none!important;border-radius:4px!important;line-height:35px!important}.profile .stripe-button-el span{font-style:normal!important}.stripe-button-el span:hover{opacity:.8!important}.load-more-action{display:block;text-align:center;opacity:.5}.b-lazy,.entity-image img{background:url(/images/loading.gif) no-repeat center center #fff}.talking-outside{display:none}.pp-selected .talking-outside{display:block}.payment-overlay,.payment-spin-box{position:fixed;width:100%;height:100%;top:0;left:0;right:0;bottom:0}.payment-overlay{background-color:rgba(255,255,255,.95);cursor:pointer;z-index:2}.payment-spin-box{z-index:3;display:flex;align-items:center;justify-content:center}.payment-spin{max-width:50%}.spinner.loading{padding:90px;position:relative;text-align:center}.spinner.loading:before{content:"";height:80px;width:80px;margin:-40px auto auto -40px;position:absolute;top:50%;left:50%;border-width:4px;border-style:solid;border-color:#2180c0 #ccc #ccc;border-radius:100%;animation:rotation .7s infinite linear}.switch{position:relative;display:inline-block;width:48px;height:28px}.switch input{opacity:0;width:0;height:0}.slider,.slider:before{position:absolute;-webkit-transition:.4s;transition:.4s}.slider{cursor:pointer;top:0;right:0;left:0;bottom:0;background-color:#ccc}.slider:before{content:"";height:20px;width:20px;left:4px;bottom:4px;background-color:#fff}input:checked+.slider{background-color:#2196f3}input:focus+.slider{box-shadow:0 0 1px #2196f3}input:checked+.slider:before{-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}.slider.round{border-radius:20px}.slider.round:before{border-radius:50%}@media (prefers-color-scheme:dark){body{background:#282923;color:#f8f8f2}.box-user .username a,h1,h2,h3,h4,h5,h6{color:#eee}.btn-link,a{color:#2a9fd6;text-decoration:none;background-color:transparent}.btn-link:hover,a:hover{color:#1d7097}.text-muted{color:#777!important}.navbar{background:#000;border-bottom:1px solid #333}.card{background:#15202b}.card-footer{border-top:1px solid rgba(255,255,255,.125)}.box-user .screenName a{color:#fff}.alert-custom{background:#000!important}.form-control,.search-widget .form-control,.search-widget .form-control:focus,.search-widget .form-control:hover,.search-widget .search-card:hover,.search-widget .search-dropdown-menu{background:#15202b;color:#eee}.form-control{color:#fff}.search-card,.search-dropdown-menu,.thread-card,.thread-card .time{background:#15202b}.btn-outline-secondary{color:#fff;border-color:#fff}.background-gray{background:#111!important;border:0}.background-blue{background:#15202b!important;border-color:#15202b!important}.with-search{border:0}.payment-overlay,.search-overlay{background:#111}.press-quote:before{color:#555}.about-team a{color:#2a9fd6}nav[data-toggle=toc] .nav>li>a{color:#fff!important}.content-tweet{color:#eee}.thread-card .card-tweets a,.thread-card .card-tweets a:hover,a.thread-card-wrap,a.thread-card-wrap:hover{color:#ccc}.close{text-shadow:0 1px 0 #000}.close,.list-content-header{color:#fff}.t-tweet{transition:all .3s ease 0s}.option-or-other::after,.t-tweet:hover{background:#192734}.thread-info,.thread-info a.time{color:#999}.btn-outline-dark{color:#fff;background-color:transparent;background-image:none;border-color:#fff}.sharingfooter{background:#000;border-top:1px solid #333}hr{border-top:1px solid rgba(255,255,255,.4)}.entity-mention{color:#ccc}.retweet:hover{fill:#999}.modal-content{background-color:#192734}.modal-footer,.modal-header,.thread-card .box-user .avatar img{border:0}.tw-permalink{color:#555}.button-tag{background:0 0;color:#fff}.table td,.table th{border-top:1px solid #333}.bg-white{background-color:#000!important}.slider{background-color:#666}}</style>
<style>
.footer {
bottom: 50px;
}
.entry-support {
padding-bottom: 3rem;
}
</style>
</head>
<body>
<nav class="navbar justify-content-between">
<a class="navbar-brand" href="/">
Thread Reader
</a>
<div>
<a class="btn btn-secondary" href="https://threadreaderapp.com/account"><i class="fas fa-user"></i></a>
<a class="btn btn-primary action-share gaClickEvent" data-category="new-header-share-button" data-action="new-share-on-header" data-label="new-header" href="#"><i class="fas fa-share-alt"></i></a>
</div>
</nav><div class="ad-on-top hide-mobile">
<div class="container">
<div class="row">
<div class="col-12" style="margin-top:-20px; margin-bottom:20px; text-align:center;">
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-3755072543989337"
data-ad-slot="5339396365"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
</div>
</div>
</div>
</div>
<article class="container narrow">
<div class="row t-user">
<div class="col-12">
<p class="viewcount p-0 m-0"><small><span id="viewcount" style="display:none">12,399 views</span> </small></p>
<script type="0eb08f2d879f1d5b0fff5d11-text/javascript" async src="https://platform.twitter.com/widgets.js"></script>
<div class="box-user">
<div class="d-flex justify-content-between align-items-center">
<div class="avatar align-self-center">
<a href="https://twitter.com/colmmacc" target="_blank">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/14340150.jpg" alt="Profile picture" onerror="imgErr(this)">
</a>
</div>
<div style="flex-grow:1; min-width:0;">
<div class="d-flex justify-content-between align-items-center">
<div style="flex-grow:1; min-width:0;">
<span class="username mr-2">
<a href="#" class="gaClickEvent" tabindex="0" data-toggle="popover" data-popover-content="#a2" data-placement="top" data-category="threadbuttons" data-action="author-name" data-label="user-name">
Colm MacCárthaigh
</a>
<div id="a2" class="d-none">
<div class="popover-body text-center">
<a href="https://twitter.com/colmmacc" class="btn btn-dark btn-xsm btn-block gaClickEvent" data-category="threadbuttons" data-action="twitter-page" data-label="above-thread-in-popup"><i class="fab fa-twitter"></i> Twitter Profile</a>
<a href="https://threadreaderapp.com/user/colmmacc" class="btn btn-dark btn-xsm btn-block gaClickEvent" data-category="threadbuttons" data-action="user-page" data-label="above-thread-in-popup"><i class="far fa-user"></i> Read all threads</a>
</div>
</div>
</span>
</div>
</div>
<div class="d-flex align-self-center justify-content-between mt-1">
<span class="screenName mr-2"><a href="https://twitter.com/colmmacc">@colmmacc</a></span>
<div class="float-right">
<a href="https://twitter.com/intent/tweet?in_reply_to=1034492056968736768">
<svg viewBox="0 0 24 24" class="retweet">
<g>
<path
d="M14.046 2.242l-4.148-.01h-.002c-4.374 0-7.8 3.427-7.8 7.802 0 4.098 3.186 7.206 7.465 7.37v3.828c0 .108.044.286.12.403.142.225.384.347.632.347.138 0 .277-.038.402-.118.264-.168 6.473-4.14 8.088-5.506 1.902-1.61 3.04-3.97 3.043-6.312v-.017c-.006-4.367-3.43-7.787-7.8-7.788zm3.787 12.972c-1.134.96-4.862 3.405-6.772 4.643V16.67c0-.414-.335-.75-.75-.75h-.396c-3.66 0-6.318-2.476-6.318-5.886 0-3.534 2.768-6.302 6.3-6.302l4.147.01h.002c3.532 0 6.3 2.766 6.302 6.296-.003 1.91-.942 3.844-2.514 5.176z">
</path>
</g>
</svg>
</a>
<a href="https://twitter.com/intent/retweet?tweet_id=1034492056968736768">
<svg viewBox="0 0 24 24" class="retweet">
<g>
<path
d="M23.77 15.67c-.292-.293-.767-.293-1.06 0l-2.22 2.22V7.65c0-2.068-1.683-3.75-3.75-3.75h-5.85c-.414 0-.75.336-.75.75s.336.75.75.75h5.85c1.24 0 2.25 1.01 2.25 2.25v10.24l-2.22-2.22c-.293-.293-.768-.293-1.06 0s-.294.768 0 1.06l3.5 3.5c.145.147.337.22.53.22s.383-.072.53-.22l3.5-3.5c.294-.292.294-.767 0-1.06zm-10.66 3.28H7.26c-1.24 0-2.25-1.01-2.25-2.25V6.46l2.22 2.22c.148.147.34.22.532.22s.384-.073.53-.22c.293-.293.293-.768 0-1.06l-3.5-3.5c-.293-.294-.768-.294-1.06 0l-3.5 3.5c-.294.292-.294.767 0 1.06s.767.293 1.06 0l2.22-2.22V16.7c0 2.068 1.683 3.75 3.75 3.75h5.85c.414 0 .75-.336.75-.75s-.337-.75-.75-.75z">
</path>
</g>
</svg>
</a>
<a href="https://twitter.com/intent/like?tweet_id=1034492056968736768">
<svg viewBox="0 0 24 24" class="retweet">
<g>
<path
d="M12 21.638h-.014C9.403 21.59 1.95 14.856 1.95 8.478c0-3.064 2.525-5.754 5.403-5.754 2.29 0 3.83 1.58 4.646 2.73.814-1.148 2.354-2.73 4.645-2.73 2.88 0 5.404 2.69 5.404 5.755 0 6.376-7.454 13.11-10.037 13.157H12zM7.354 4.225c-2.08 0-3.903 1.988-3.903 4.255 0 5.74 7.034 11.596 8.55 11.658 1.518-.062 8.55-5.917 8.55-11.658 0-2.267-1.823-4.255-3.903-4.255-2.528 0-3.94 2.936-3.952 2.965-.23.562-1.156.562-1.387 0-.014-.03-1.425-2.965-3.954-2.965z">
</path>
</g>
</svg>
</a>
<a href="https://twitter.com/colmmacc/status/1034492056968736768" target="_blank"><img src="/images/Twitter_Logo_Blue.png" alt="Profile picture" width="20px" /></a>
</div>
</div>
</div>
</div>
<div class="mt-2">
<span class=" thread-info">
<a href="https://twitter.com/colmmacc/status/1034492056968736768" class="time" data-time="1535477100" style="float:none;" title="Read on Twitter"></a>,
<span class="count">
40 tweets,
11 min read
</span>
</span>
</div>
</div>
</div>
</div>
<div class="row t-actions">
<div class="col-12">
<div class="box-bar-action">
<form method="post" action="https://threadreaderapp.com/account/readLater/1034492056968736768"
class="gaClickEvent" data-category="threadbuttons" data-action="read-later" data-label="top">
<button type="submit" class="btn btn-outline-dark btn-xsm button-read-later">
<i class="far fa-bookmark"></i> Bookmark
</button>
</form>
<form method="post" action="https://threadreaderapp.com/account/archive/1034492056968736768"
class="gaClickEvent" data-category="threadbuttons" data-action="archive" data-label="top">
<button type="submit" class="btn btn-outline-dark btn-xsm">
<i class="far fa-file-pdf"></i> Save as PDF
</button>
</form>
<a href="#" class="btn btn-outline-dark btn-xsm gaClickEvent" tabindex="0" data-toggle="popover"
data-popover-content="#a1" data-placement="top"
data-category="threadbuttons" data-action="my-authors" data-label="above-thread">
<i class="fas fa-plus"></i> My Authors</a>
<div id="a1" class="d-none">
<div class="popover-body text-center">
<form method="post" action="https://threadreaderapp.com/account/subscribe/colmmacc"
class="text-center gaClickEvent" data-category="threadbuttons" data-action="subscribe" data-label="above-thread-in-popup">
<button type="submit" class="btn btn-dark btn-xsm mb-4 btn-block">
<i class="fas fa-plus"></i> Add to 'My Authors'
</button>
</form>
<a href="https://threadreaderapp.com/user/colmmacc" class="btn btn-dark btn-xsm btn-block gaClickEvent" data-category="threadbuttons" data-action="user-page" data-label="above-thread-in-popup"><i class="far fa-user"></i> Read all threads</a>
</div>
</div>
</div>
</div>
</div>
<div class="t-main">
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_1" data-screenname="colmmacc" data-tweet="1034492056968736768" class="content-tweet allow-preview" dir="auto">
It's my ten year anniversary at AWS, I got a new badge and everything! To celebrate, I'm going to tweet out the lightning talk I gave at last week's Amazon dev con. It's all about my favorite thing from my ten years: Shuffle Sharding! <span class="entity-image"><a href="https://pbs.twimg.com/media/DltAuMNUYAEJCIQ.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltAuMNUYAEJCIQ.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_2" data-screenname="colmmacc" data-tweet="1034492508808474625" class="content-tweet allow-preview" dir="auto">
Ever wonder how we manage multi-tenancy at AWS? or why we want you to use the personal health dashboard instead of the AWS status dashboard? are you pining for a bonus content section with probabilistic math? These slides on Shuffle Sharding are for you!!
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_3" data-screenname="colmmacc" data-tweet="1034492862929416192" class="content-tweet allow-preview" dir="auto">
O.k., so this is me, 15 years ago, building a data center. That's what I used to do for money. This one was about 30 racks, and I was the project lead. It took me about a year to build it, everything from initial design to labeling cables. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltBh42U0AAMmPC.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltBh42U0AAMmPC.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_4" data-screenname="colmmacc" data-tweet="1034493216861511680" class="content-tweet allow-preview" dir="auto">
These days I work with the AWS ELB team, and we regularly spin up that same amount of capacity in minutes. Think software upgrades or new region builds. This is insane to me. What took me a year now takes me me minutes. That's Cloud.
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_5" data-screenname="colmmacc" data-tweet="1034493476350509058" class="content-tweet allow-preview" dir="auto">
Our Cloud gives us this agility because we all pool our resources. So a much bigger, and better than me, team can build much bigger, and better than mine, data centers, which we all share. 10 years in, pretty much everyone understands that this is awesome.
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_6" data-screenname="colmmacc" data-tweet="1034494167244656640" class="content-tweet allow-preview" dir="auto">
BUT ... it comes with a challenge. When I built my own data centers, I was the only tenant and didn't need to worry about problems due to other customers. The core competency of a cloud provider is handling this challenge: efficiency and agility but still a dedicated experience.
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_7" data-screenname="colmmacc" data-tweet="1034494834172604416" class="content-tweet allow-preview" dir="auto">
It's no good sharing everything if a single "noisy neighbor" can cause everyone to have a bad experience. We want the opposite! At AWS we are super into compartmentalization and isolation, and mature remediation procedures. Shuffle Sharding is one of our best techniques. O.k. ..
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_8" data-screenname="colmmacc" data-tweet="1034495111239847936" class="content-tweet allow-preview" dir="auto">
So to understand Shuffle Sharding, let's start with a traditional service. Here I have 8 instances, web servers or whatever. It's horizontally scalable, and fault tolerant in the sense that I have more than one instance. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltDnteV4AAbU90.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltDnteV4AAbU90.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_9" data-screenname="colmmacc" data-tweet="1034495393378131968" class="content-tweet allow-preview" dir="auto">
We put the servers behind a load balancer, and each server gets a portion of the incoming requests. LOTS of services are built like this. Super common pattern. You're probably yawning! <span class="entity-image"><a href="https://pbs.twimg.com/media/DltD33yUwAEUW0r.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltD33yUwAEUW0r.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_10" data-screenname="colmmacc" data-tweet="1034495632935800832" class="content-tweet allow-preview" dir="auto">
And then one day we get a problem request. Maybe the request is very expensive, or maybe it even crashes a server, or maybe it's a run-away client that is retrying super aggressively. AND it takes out a server. This is bad. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltEIgdUcAAPYNR.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltEIgdUcAAPYNR.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_11" data-screenname="colmmacc" data-tweet="1034495923127078912" class="content-tweet allow-preview" dir="auto">
What's even WORSE is that this can cascade. The load balancer takes the server out, and so the problem request goes to another server, and so on. Pretty soon, the whole service is down. OUCH. Everyone has a bad day, due to one problem request or customer. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltEYYJVsAA-skb.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltEYYJVsAA-skb.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_12" data-screenname="colmmacc" data-tweet="1034496363424243713" class="content-tweet allow-preview" dir="auto">
At AWS we have a term the scope of impact that we call "Blast Radius". And here the blast radius is basically "All customers". That's about as bad as it gets. But this is really common! Lot's of systems are built like this out in the world. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltExMVU4AAeuzQ.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltExMVU4AAeuzQ.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_13" data-screenname="colmmacc" data-tweet="1034496705155088384" class="content-tweet allow-preview" dir="auto">
O.k., so what can we do? Well traditional sharding is something that we can do! We can divide the capacity into shards or cells. Here we go with four shards of size two. This change makes things much better! <span class="entity-image"><a href="https://pbs.twimg.com/media/DltFB1GU0AAOaOr.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltFB1GU0AAOaOr.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_14" data-screenname="colmmacc" data-tweet="1034496863607504896" class="content-tweet allow-preview" dir="auto">
Now if we repeat the same event, the impact is much smaller, just 25% of what it is was. Or more formally ... <span class="entity-image"><a href="https://pbs.twimg.com/media/DltFUTFU8AArQqH.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltFUTFU8AArQqH.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_15" data-screenname="colmmacc" data-tweet="1034497309462032384" class="content-tweet allow-preview" dir="auto">
The blast radius is now the number of customers divided by the number of shards. It's a big improvement. Do this! At AWS we call this cellularization and many of our systems are internally cellular. Our isolated regions, and availability Zones are a big famous macro example too. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltFfyOVAAAmLHD.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltFfyOVAAAmLHD.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_16" data-screenname="colmmacc" data-tweet="1034497657366970368" class="content-tweet allow-preview" dir="auto">
THIS is one reason why the personal health dashboard is so much better than the status page. The status for your cell might be very different than someone else's!
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_17" data-screenname="colmmacc" data-tweet="1034498034917302273" class="content-tweet allow-preview" dir="auto">
... anyway, back to Shuffle Sharding. With Shuffle Sharding we can do much better again than traditional sharding. It's deceptively simple. All we do is that for each customer we assign them to two servers pretty much at random. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltGd1YVsAAfiaS.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltGd1YVsAAfiaS.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_18" data-screenname="colmmacc" data-tweet="1034498328002801664" class="content-tweet allow-preview" dir="auto">
So for example, the ❤️ customer is assigned to nodes 1 and 4. Suppose we get a problem request from ❤️ ? What happens? <span class="entity-image"><a href="https://pbs.twimg.com/media/DltGkZNV4AA1B3v.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltGkZNV4AA1B3v.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_19" data-screenname="colmmacc" data-tweet="1034498694593146880" class="content-tweet allow-preview" dir="auto">
Well ... it could take out nodes 1 and 4. So ❤️ is having a bad experience now. Amazing devops teams are on it, etc , but it's still not great for them. Not much we can do about that. But what about everyone else? <span class="entity-image"><a href="https://pbs.twimg.com/media/DltGzsTU0AE5ndd.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltGzsTU0AE5ndd.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_20" data-screenname="colmmacc" data-tweet="1034499082574692353" class="content-tweet allow-preview" dir="auto">
Well, if we look at ❤️'s neighbors. They're still fine! As long as their client is fault tolerant, which can be as simple as using retries, they can still get service. 😀 gets service from node 2 for example. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltHNnpUcAAIA_A.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltHNnpUcAAIA_A.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_21" data-screenname="colmmacc" data-tweet="1034499301408309248" class="content-tweet allow-preview" dir="auto">
O.k. let's PAUSE for a second and appreciate that. Same number of nodes. Same number of nodes for each customer. Same number of customers. Just by using MATH, we've reduced the blast radius to 1 customer! That's INSANE.
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_22" data-screenname="colmmacc" data-tweet="1034499700236333056" class="content-tweet allow-preview" dir="auto">
The blast radius ends up getting really small. It's roughly proportionate to the factorial of the shard size (small) divided by the factorial of the number of nodes (which is big) ... so it can get really really small. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltHvLsUYAA9qSO.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltHvLsUYAA9qSO.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_23" data-screenname="colmmacc" data-tweet="1034500109445165056" class="content-tweet allow-preview" dir="auto">
Let's look at example. So for 8 nodes and a shard size of 2, like these slides fit, the blast radius ends up being just 3.6%. What that means is that if one customer triggers an issue, only 3.6% of other customers will be impacted. Much better than the 25% we saw earlier. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltIKmiVAAAwN_u.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltIKmiVAAAwN_u.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_24" data-screenname="colmmacc" data-tweet="1034500380875341824" class="content-tweet allow-preview" dir="auto">
But that's still way to high for us. AWS HyperPlane, the system that powers VPC NAT Gateway, Network Load Balancer, PrivateLink, etc ... we design for a hundred nodes, and a shard size of five. Let's look at those numbers ...
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_25" data-screenname="colmmacc" data-tweet="1034500800020537344" class="content-tweet allow-preview" dir="auto">
O.k. now things get really really small. About 0.0000013% of other customers would share fate in this case. It's so small that because we have fewer than a million customers per cell anyway, there can be zero full overlap. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltItHJUwAAPz86.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltItHJUwAAPz86.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_26" data-screenname="colmmacc" data-tweet="1034500990311911425" class="content-tweet allow-preview" dir="auto">
Again think about, we can build a huge big multi-tenant system with lots of customers on it, and still guarantee that there is *no* full overlap between those customers. Just using math. This still blows my mind.
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_27" data-screenname="colmmacc" data-tweet="1034501566009552896" class="content-tweet allow-preview" dir="auto">
If you want to try some numbers out for yourself, here's a python script that calculates the blast radius: <a class="entity-url" data-preview="true" href="https://gist.github.com/colmmacc/4a39a6416d2a58b6c70bc73027bea4dc">gist.github.com/colmmacc/4a39a…</a> . Try it for Route 53's numbers. There are 2048 Route 53 virtual name servers, and each hosted zone is assigned to 4. So n = 2048, and m = 4.
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_28" data-screenname="colmmacc" data-tweet="1034501762344841216" class="content-tweet allow-preview" dir="auto">
If you want to make your own Shuffle Shard patterns, and make guarantees about non-overlap, we open sourced our approach years ago. It's at: <a class="entity-url" data-preview="true" href="https://github.com/awslabs/route53-infima">github.com/awslabs/route5…</a>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_29" data-screenname="colmmacc" data-tweet="1034502099399139328" class="content-tweet allow-preview" dir="auto">
Shuffle Sharding is amazing! It's just an application of combinatorials, but it decreases blast radiuses by huge factorial factors. So what does it take to use it in practice?
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_30" data-screenname="colmmacc" data-tweet="1034502453385822208" class="content-tweet allow-preview" dir="auto">
Well the client has to be fault-tolerant. That's easy, nearly all are. The technique works for servers, queues, and even things like storage. So that's easy too. The big gotcha is that you need a routing mechanism. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltKPTxVsAAQdbp.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltKPTxVsAAQdbp.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_31" data-screenname="colmmacc" data-tweet="1034502817757581313" class="content-tweet allow-preview" dir="auto">
You either give each customer resource a DNS name, like we do for S3, CloudFront, Route53, and handle it at the DNS layer, or you need a content-aware router than can do ShuffleSharding. Of course at our scale, this makes sense, but not everyone.
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_32" data-screenname="colmmacc" data-tweet="1034503020526989312" class="content-tweet allow-preview" dir="auto">
O.k,. bonus MATH content!! I want to convince you that that rough approximation from earlier is correct, because with more insight we can make smarter decisions. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltK8nhVAAAVigC.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltK8nhVAAAVigC.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_33" data-screenname="colmmacc" data-tweet="1034503344276922368" class="content-tweet allow-preview" dir="auto">
Shuffle Sharding is just like a lottery. Think about your nodes like the numbers in a lottery, and each customer gets a ticket with |shardsize| count of numbers. You want to measure the probability that two or tickets match.
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_34" data-screenname="colmmacc" data-tweet="1034504128200724480" class="content-tweet allow-preview" dir="auto">
First, we have to define some shorthand. N is the number of nodes. S is the shard size. O is the potential overlap between two tickets/customers. <a class="entity-url" data-preview="true" href="https://en.wikipedia.org/wiki/Lottery_mathematics">en.wikipedia.org/wiki/Lottery_m…</a> has good background on how we then come to this equation ... <span class="entity-image"><a href="https://pbs.twimg.com/media/DltL6nmV4AAAdee.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltL6nmV4AAAdee.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_35" data-screenname="colmmacc" data-tweet="1034504482774605824" class="content-tweet allow-preview" dir="auto">
Now, let's take the special case of "full overlap". That's the case we care the most about; the problem request eats all of the nodes it can reach. How many other customers are impacted? Since O=S in this case, we end up with ... <span class="entity-image"><a href="https://pbs.twimg.com/media/DltMSIyUcAA6LqM.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltMSIyUcAA6LqM.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_36" data-screenname="colmmacc" data-tweet="1034504816410513408" class="content-tweet allow-preview" dir="auto">
The bracket notation is short for "choose" and since x choose x is 1, and x choose 0 is 1, we can replace everything above the line with 1. <span class="entity-image"><a href="https://pbs.twimg.com/media/DltMc-AU8AAcCWB.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltMc-AU8AAcCWB.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_37" data-screenname="colmmacc" data-tweet="1034504977530544128" class="content-tweet allow-preview" dir="auto">
Now let's expand the choose operator into its factorials ... <span class="entity-image"><a href="https://pbs.twimg.com/media/DltMur_UwAAeJ0f.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltMur_UwAAeJ0f.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_38" data-screenname="colmmacc" data-tweet="1034505290157187074" class="content-tweet allow-preview" dir="auto">
When you were about 10 you probably learned the reciprocal of a reciprocal is just to turn it upside down. That's still true. That gives us our final form ... <span class="entity-image"><a href="https://pbs.twimg.com/media/DltNCQxUwAAc2xl.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/DltNCQxUwAAc2xl.jpg"></a></span>
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_39" data-screenname="colmmacc" data-tweet="1034505482034003970" class="content-tweet allow-preview" dir="auto">
In that form it's pretty easy to see that the smaller S is relative to N, that Shuffle Sharding gets dramatically more and more effective! Convinced? I hope so!
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
<div class="row t-tweet">
<div class="col-12">
<div id="tweet_40" data-screenname="colmmacc" data-tweet="1034505692919390208" class="content-tweet allow-preview" dir="auto">
That was my whole talk and it took me longer to tweet it than it did to give it on stage! Go figure. Feel free to AMA. And thanks for reading and making it to the end. Now use Shuffle Sharding anywhere that you can!
<sup class="tw-permalink"><i class="fas fa-link"></i></sup>
</div>
</div>
</div>
</div>
</article>
<div class="container mt-4">
<div class="row">
<div class="col-12 pb-4 col-force-refresh">
<span class="force-text">
Missing some Tweet in this thread? You can try to <a href="#" class="action-force">force a refresh</a>.
</span>
<form id="form-force" method="post" action="https://threadreaderapp.com/refresh/1034492056968736768.html"></form>
<div class="progress force-progress" style="display: none">
<div class="progress-bar progress-bar-striped progress-bar-animated"
aria-valuenow="100"
aria-valuemin="0"
aria-valuemax="100"
style="width: 100%"
></div>
</div>
</div>
</div>
</div>
<div class="container pb-4">
<div class="row">
<div class="col-12 text-center">
<div class="btn-group btn-share-thread with-txt with-color" role="group" aria-label="Share">
<a class="btn btn-outline-primary share-twitter gaClickEvent" target="_blank" href="https://twitter.com/intent/tweet?text=Thread%20by%20%40colmmacc%3A%20It%27s%20my%20ten%20year%20anniversary%20at%20AWS%2C%20I%20got%20a%20new%20badge%20and%20everything%21%20To%20celebrate%2C%20I%27m%20going%20to%20tweet%20out%20the%20lightnin%20I%20gave%20at%20last%20week%27s%20Amazon%20dev%20con.%20It%27s%20all%20about%20my%20favorite%20thing%20from%20my%20ten%20years%3A%20Shuffle%20Sharding%21%20Ever%E2%80%A6&amp;url=https%3A%2F%2Fthreadreaderapp.com%2Fthread%2F1034492056968736768.html"
data-category="sharebuttons" data-action="share-on-twitter" data-label="bottom"><i class="fab fa-twitter"></i> <span class="txt">Tweet</span></a>
<a class="btn btn-outline-primary share-fb gaClickEvent" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fthreadreaderapp.com%2Fthread%2F1034492056968736768.html"
data-category="sharebuttons" data-action="share-on-facebook" data-label="bottom"><i class="fab fa-facebook-f"></i> <span class="txt">Share</span></a>
<a class="btn btn-outline-primary share-email gaClickEvent" href="mailto:?subject=Thread%20by%20%40colmmacc%3A%20It%27s%20my%20ten%20year%20anniversary%20at%20AWS%2C%20I%20got%20a%20new%20badge%20and%20everything%21%20To%20celebrate%2C%20I%27m%20going%20to%20tweet%20out%20the%20lightning%20talk%20I%20gave%20at%20las%E2%80%A6&body=Thread%20by%20%40colmmacc%3A%20It%27s%20my%20ten%20year%20anniversary%20at%20AWS%2C%20I%20got%20a%20new%20badge%20and%20everything%21%20To%20celebrate%2C%20I%27m%20going%20to%20tweet%20out%20the%20lightnin%20I%20gave%20at%20last%20week%27s%20Amazon%20dev%20con.%20It%27s%20all%20about%20my%20favorite%20thing%20from%20my%20ten%20years%3A%20Shuffle%20Sharding%21%20Ever%E2%80%A6%0A%0Ahttps%3A%2F%2Fthreadreaderapp.com%2Fthread%2F1034492056968736768.html"
data-category="sharebuttons" data-action="share-by-email" data-label="bottom"><i class="far fa-envelope"></i> <span class="txt">Email</span></a>
<a href="#popup1" class="hide-mobile btn btn-outline-primary share-embed gaClickEvent" data-category="threadbuttons" data-action="embed">
<i class="fas fa-code"></i> <span class="txt">Embed</span>
</a>
</div>
</div>
<div class="row t-support">
<div class="col-12">
<div class="box-ads entry-ads hide-premium">
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-3755072543989337"
data-ad-slot="1570043609"
data-ad-format="auto"></ins>
</div> </div>
</div>
</div>
</div>
<div class="background-blue pb-2 mt-4">
<div class="container">
<h1 class="list-content-header">Enjoying this thread?</h1>
<div class="row t-user-2 mb-4">
<div class="col-12 col-md-6 pb-4">
<div class="box-user clearfix">
<p class="mb-2"><strong><i class="fas fa-bolt"></i> Keep Current with <a href="https://threadreaderapp.com/user/colmmacc">Colm MacCárthaigh</a>
</strong>
</p>
<div class="d-flex align-items-center mb-4">
<div class="avatar">
<a href="https://threadreaderapp.com/user/colmmacc" class="gaClickEvent" data-category="threadbuttons" data-action="user-page" data-label="below-thread"><script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img onerror="imgErr(this)" src="https://threadreaderapp.com/images/avatars/14340150.jpg" alt="Profile picture"></a>
</div>
<p class="mb-0">Stay in touch and get notified when new unrolls are available from this author!</p>
</div>
</div>
<form method="post" action="https://threadreaderapp.com/account/subscribe/colmmacc"
class="text-center gaClickEvent" data-category="threadbuttons" data-action="subscribe" data-label="below-thread">
<button type="submit" class="sbtn btn-primary btn-sm">
<i class="fas fa-plus"></i> Add to "My Authors" list
</button>
<a href="https://threadreaderapp.com/user/colmmacc" class="btn btn-secondary btn-sm"><i class="far fa-user"></i> Read all threads</a>
</form>
</div>
<div class="col-12 col-md-6 enjoy-boxes">
<hr class="d-md-none"/>
<div class="box-user clearfix">
<p class="mb-2"><strong><i class="fas fa-ban"></i> This Thread may be Removed Anytime!</strong></p>
<div class="d-flex align-items-center mb-4">
<div>
<img src="https://threadreaderapp.com/images/icon-pdf.png" style="height:70px; padding-right: 10px;" />
</div>
<p class="mb-0" style="min-height:60px">Twitter may remove this content at anytime, convert it as a PDF, save and print for later use!</p>
</div>
</div>
<form method="post" id="account-archive" action="https://threadreaderapp.com/account/archive/1034492056968736768" class="text-center gaClickEvent" data-category="threadbuttons" data-action="archive" data-label="below-thread">
<button type="submit" class="btn btn-primary btn-sm">
<i class="far fa-file-pdf"></i> Save this thread as PDF
</button>
</form>
</div>
</div>
</div>
</div>
<div class="container">
<h1 class="list-content-header">Try unrolling a thread yourself!</h1>
<div class="row t-user-2 pb-4">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-12 col-md-6 mb-4">
<img src="https://threadreaderapp.com/images/how-to-unroll.gif" width="100%" alt="how to unroll video" />
</div>
<div class="col-12 col-md-6 mb-4">
<p>1) Follow <a href="https://twitter.com/threadreaderapp" target="_blank" class="gaClickEvent" data-category="how-to" data-action="follow-tra" data-label="thread-page">Thread Reader App on Twitter</a> so you can easily mention us!</a></p>
<p>2) Go to a Twitter thread (series of Tweets by the same owner) and mention us with a keyword "unroll"
<code style="display:block; margin:10px 0; padding:10px; background:#eee; border-radius:8px;">@threadreaderapp unroll</code>
</p>
<p>You can <a href="https://twitter.com/threadreaderapp/status/1054877865362112513" target="_blank" class="gaClickEvent" data-category="how-to" data-action="practice">practice here</a> first or read more on our <a href="https://threadreaderapp.com/help#bot">help page</a>!</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="background-gray">
<div class="container t-rel">
<div class="row t-user-related">
<div class="col-12">
<h1 class="separator list-content-header">More from @colmmacc <a class="btn btn-secondary btn-sm float-right" href="https://threadreaderapp.com/user/colmmacc">see all</a></h1>
</div>
<div class="col-12 col-md-6 col-lg-4 t-user-related-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/14340150.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/colmmacc">Colm MacCárthaigh</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/colmmacc">@colmmacc</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1580846545"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet">Separate rant for this! Let's count some reasons ... <span class="entity-embed"><span class="twitter-player"><blockquote class="twitter-tweet" data-conversation="none" data-align="center" data-dnt="true"><a href="https://twitter.com/dandago2/status/1224772769709219840">https://twitter.com/dandago2/status/1224772769709219840</a></blockquote></span></span></div>
<div class="content-tweet"><span class="nop nop-start">1. </span> If there is any layer that is actually between layer 4 (like TCP) and layer 7 (like HTTP or SMTP) ... *surely* it is TLS. But that's not a layer in the OSI model.</div>
<div class="content-tweet"><span class="nop nop-start">2. </span> To double down on (1) ... have you *ever* seen layers 5 or 6 referred to? know what they are without looking? exactly? (also layers 5 and 6 make no real sense in a modern world).</div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1224785298564907008.html">Read 5 tweets</a>
</div>
</div>
<div class="col-12 col-md-6 col-lg-4 t-user-related-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/14340150.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/colmmacc">Colm MacCárthaigh</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/colmmacc">@colmmacc</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1580842040"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet">Tuesday Technical Tweet Thread Time! Let's go on the roller coaster of what happens at a low level when a DNS server sends an 4,000 byte EDNS0 response to a client whose MTU is 1200 bytes. Confused already? don't worry, we'll break it down. I promise it's super interesting.</div>
<div class="content-tweet">o.k. so DNS, the so-called "phonebook of the internet" (if you look the other way and ignore that that's a better metaphor for Google) ... ANYWAY ... DNS runs over the User Datagram Protocol (UDP).</div>
<div class="content-tweet">If you know anything about UDP it's that it's a "Fire and Forget" protocol, it can be lossy. From the perspective of an application, you send a packet, and it gets to the other end or it doesn't. If you want reliability, you have to retry yourself or have some kind of fallback.</div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1224766402629795840.html">Read 39 tweets</a>
</div>
</div>
<div class="col-12 col-md-6 col-lg-4 t-user-related-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/14340150.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/colmmacc">Colm MacCárthaigh</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/colmmacc">@colmmacc</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1572975689"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet">Tuesday Tweet Thread is a "Today in Infosec" one. It's 10 years since <a class="entity-mention" href="https://twitter.com/marshray">@marshray</a> published one of my favorite TLS/SSL issues, and the best named. The Pizza Attack! Read about it in EKR's blog post from the time: <a class="entity-url" data-preview="true" href="http://www.educatedguesswork.org/2009/11/understanding_the_tls_renegoti.html">educatedguesswork.org/2009/11/unders…</a> ...</div>
<div class="content-tweet"><a class="entity-mention entity-mention-first" href="https://twitter.com/marshray">@marshray</a> In a case of "History doesn't repeat itself, but it does rhyme", the attack is similar in several ways to the latest HTTP "DESYNC" attacks. The Pizza attack hinged on inconsistencies between layers, and clever use of HTTP headers to hide requests.</div>
<div class="content-tweet"><a class="entity-mention entity-mention-first" href="https://twitter.com/marshray">@marshray</a> Basically: TLS/SSL *used* to allow clients or servers to renegotiate a connection at any time, and that was like starting over. The Pizza attack had the attacker create a legit connection to a server, and then place a not quite finished lingering HTTP request on the connection.</div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1191772534737272832.html">Read 12 tweets</a>
</div>
</div>
</div>
<div class="row t-trending-thread">
<div class="col-12">
<h1 class="separator list-content-header">Related threads</h1>
</div>
<div class="col-12 col-md-6 col-lg-4 t-trending-thread-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/57029492.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/gelliottmorris">G. Elliott Morris</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/gelliottmorris">@gelliottmorris</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1582120801"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet"><a class="entity-hashtag" href="/hashtag/NEW">#NEW</a> poll of the 2020 Democratic primary from The Economist and YouGov:<br />
<br />
% support among likely voters (change vs last week)<br />
<br />
Sanders: 24 <span class="nop nop-end"> (3)</span><br />
Biden: 18 <span class="nop nop-end"> (0)</span><br />
Warren: 16 <span class="nop nop-end"> (1)</span><br />
Bloomberg: 12 <span class="nop nop-end"> (0)</span><br />
Buttigieg: 11 <span class="nop nop-end"> (1)</span><br />
Klobuchar: 7 <span class="nop nop-end"> (0)</span><br />
Steyer: 2 <span class="nop nop-end"> (1)</span><br />
Gabbard: 2 (-1)</div>
<div class="content-tweet">Compared to last week, our poll shows a big dip in Bloomberg's viability, and a modest increase in the share of Democratic primary voters who say they'll consider voting for Amy Klobuchar.</div>
<div class="content-tweet">Share of Democratic primary voters considering voting for each candidate (pooled over the last month):<br />
<br />
Sanders: 45%<br />
Biden: 45<br />
Warren: 45<br />
Buttigieg: 29<br />
Bloomberg: 26<br />
Klobuchar: 22<br />
Steyer: 13<br />
Gabbard: 6</div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1230129914772369408.html">Read 7 tweets</a>
</div>
</div>
<div class="col-12 col-md-6 col-lg-4 t-trending-thread-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/57029492.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/gelliottmorris">G. Elliott Morris</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/gelliottmorris">@gelliottmorris</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1580912338"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet"><a class="entity-hashtag" href="/hashtag/NEW">#NEW</a> poll of the 2020 Democratic primary from The Economist and YouGov:<br />
<br />
% support among likely voters (change vs last week)<br />
<br />
Biden: 24 (-2)<br />
Sanders: 19 (-5)<br />
Warren: 18 (-2)<br />
Buttigieg: 9 <span class="nop nop-end"> (2)</span><br />
Bloomberg: 9 <span class="nop nop-end"> (4)</span><br />
Klobuchar: 6 <span class="nop nop-end"> (1)</span><br />
Yang: 3 (-1)<br />
Gabbard: 3 <span class="nop nop-end"> (0)</span><br />
Steyer: 2 <span class="nop nop-end"> (1)</span><br />
Bennet: 1 <span class="nop nop-end"> (1)</span></div>
<div class="content-tweet">Which candidates are Democrats considering voting for? (These numbers are from the past month of polls)<br />
<br />
Biden: 48%<br />
Warren: 47%<br />
Sanders: 45%<br />
Buttigieg: 28%<br />
Bloomberg: 22%<br />
Klobuchar: 20%<br />
Yang: 16%<br />
Steyer: 12%<br />
Gabbard: 6%<br />
Bennet: 4%<br />
Patrick: 3%</div>
<div class="content-tweet">Who would Democrats be disappointed in as the nominee? <br />
(These numbers are from the past month of polls)<br />
<br />
Gabbard: 43%<br />
Bloomberg: 29%<br />
Patrick: 23%<br />
Biden: 23%<br />
Steyer: 22%<br />
Sanders: 22%<br />
Bennet: 21%<br />
Buttigieg: 19%<br />
Klobuchar: 17%<br />
Yang: 17%<br />
Warren: 16%</div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1225061255280570369.html">Read 3 tweets</a>
</div>
</div>
<div class="col-12 col-md-6 col-lg-4 t-trending-thread-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/57029492.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/gelliottmorris">G. Elliott Morris</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/gelliottmorris">@gelliottmorris</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1580308534"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet"><a class="entity-hashtag" href="/hashtag/NEW">#NEW</a> poll of the 2020 Democratic primary from The Economist and YouGov:<br />
<br />
% support among likely voters (chg vs last week):<br />
<br />
Biden: 26 (-3)<br />
Sanders: 24 <span class="nop nop-end"> (6)</span><br />
Warren: 20 (-1)<br />
Buttigieg: 7 (-1)<br />
Klobuchar: 4 <span class="nop nop-end"> (0)</span><br />
Bloomberg: 4 (-2)<br />
Yang: 4 <span class="nop nop-end"> (0)</span><br />
Gabbard: 3 <span class="nop nop-end"> (1)</span><br />
Steyer: 1 (-2)<br />
Patrick: 1 <span class="nop nop-end"> (0)</span></div>
<div class="content-tweet">Who are Democrats considering voting for?<br />
<br />
Biden: 49%<br />
Warren: 48<br />
Sanders: 45<br />
Buttigieg: 28<br />
Klobuchar: 20<br />
Bloomberg: 19<br />
Booker: 18<br />
Yang: 16<br />
Steyer: 12<br />
Castro: 10<br />
Gabbard: 6<br />
Bennet: 4<br />
Patrick: 3<br />
Delaney: 2</div>
<div class="content-tweet">Who would they be disappointed to see win the nomination?<br />
<br />
Gabbard: 42%<br />
Bloomberg: 31<br />
Delaney: 25<br />
Biden: 23<br />
Steyer: 23<br />
Patrick: 23<br />
Bennet: 21<br />
Sanders: 20<br />
Buttigieg: 19<br />
Yang: 17<br />
Klobuchar: 17<br />
Warren: 15</div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1222528719048380416.html">Read 5 tweets</a>
</div>
</div>
<div class="col-12 col-md-6 col-lg-4 t-trending-thread-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/57029492.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/gelliottmorris">G. Elliott Morris</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/gelliottmorris">@gelliottmorris</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1576073453"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet"><a class="entity-hashtag" href="/hashtag/NEW">#NEW</a> poll of the 2020 Democratic primary from The Economist and YouGov:<br />
<br />
% support among likely voters (change vs last month)<br />
<br />
Biden: 26 <span class="nop nop-end"> (3)</span><br />
Warren: 21 (-5)<br />
Sanders: 16 (-1)<br />
Buttigieg: 11 <span class="nop nop-end"> (2)</span><br />
Bloomberg: 4 (-)<br />
Yang: 3 <span class="nop nop-end"> (0)</span><br />
Gabbard: 3 <span class="nop nop-end"> (1)</span><br />
Booker: 3 <span class="nop nop-end"> (1)</span><br />
Klobuchar: 2 (-1)</div>
<div class="content-tweet">Which candidates are Democratic primary voters considering voting for? (Pooled over the last month)<br />
<br />
Warren: 50%<br />
Biden: 50<br />
Sanders: 39<br />
Buttigieg: 35<br />
Harris: 26%<br />
Booker: 20%<br />
Klobuchar: 16%<br />
Yang: 14%<br />
Bloomberg: 12<br />
Castro: 10%<br />
<br />
All else under 10%</div>
<div class="content-tweet">Which candidates would Democratic voters be disappointed by if they won the nomination?<br />
<br />
37% say Gabbard:<br />
Williamson: 36%<br />
Bloomberg: 31%<br />
Biden: 24%<br />
Steyer: 23%<br />
Sanders: 22%<br />
Delaney: 22%<br />
Yang: 18%<br />
Klobuchar: 17%<br />
Warren: 16%<br />
Buttigieg: 15%<br />
Booker: 14%</div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1204765499088949248.html">Read 4 tweets</a>
</div>
</div>
<div class="col-12 col-md-6 col-lg-4 t-trending-thread-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/48443.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/jeffbarr">Jeff Barr ☁️</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/jeffbarr">@jeffbarr</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1574726411"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet">I've been heads-down on final <a class="entity-hashtag" href="/hashtag/AWS">#AWS</a> re:Invent blogging, and need to catch up on all of the posts from the last couple of days. Unroll this thread to see them all..</div>
<div class="content-tweet">CloudTrail Insights: Identify and Respond to Unusual API Activity - <a class="entity-url" data-preview="true" href="https://aws.amazon.com/blogs/aws/announcing-cloudtrail-insights-identify-and-respond-to-unusual-api-activity/">aws.amazon.com/blogs/aws/anno…</a> (<a class="entity-mention" href="https://twitter.com/bwest">@bwest</a> ) <span class="entity-image"><a href="https://pbs.twimg.com/media/EKQdSNOUUAE2X5u.jpg" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/EKQdSNOUUAE2X5u.jpg"></a></span></div>
<div class="content-tweet">Convert Your Single-Region Amazon DynamoDB Tables to Global Tables - <a class="entity-url" data-preview="true" href="https://aws.amazon.com/blogs/aws/new-convert-your-single-region-amazon-dynamodb-tables-to-global-tables/">aws.amazon.com/blogs/aws/new-…</a> (<a class="entity-mention" href="https://twitter.com/sebsto">@sebsto</a> ) <span class="entity-image"><a href="https://pbs.twimg.com/media/EKQdSpQUcAEddFe.png" target="_blank"><img alt="" src="/images/1px.png" data-src="https://pbs.twimg.com/media/EKQdSpQUcAEddFe.png"></a></span></div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1199115596102656001.html">Read 11 tweets</a>
</div>
</div>
<div class="col-12 col-md-6 col-lg-4 t-trending-thread-entry">
<div class="thread-card">
<div class="box-user">
<div class="d-flex justify-content-between">
<div class="avatar align-self-center">
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49"></script><img src="https://threadreaderapp.com/images/avatars/57029492.jpg" alt="Profile picture" onerror="imgErr(this)">
</div>
<div style="flex-grow:1; min-width:0;" class="align-self-center">
<div class="username">
<a href="https://threadreaderapp.com/user/gelliottmorris">G. Elliott Morris</a>
</div>
<div class="d-flex justify-content-between flex-column flex-md-row">
<div style="min-width:0;" class="align-self-start align-self-md-center">
<span class="screenName"><a href="https://threadreaderapp.com/user/gelliottmorris">@gelliottmorris</a></span>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<span class="time" data-time="1570626121"></span>
<div class="card-tweets" dir="auto">
<div class="content-tweet"><a class="entity-hashtag" href="/hashtag/NEW">#NEW</a> poll of the 2020 Democratic primary from The Economist and YouGov:<br />
<br />
% support among likely voters (change v last month)<br />
Warren: 28 (+4)<br />
Biden: 25 (+1)<br />
Sanders: 13 (-4)<br />
Harris: 5 <span class="nop nop-end"> (0)</span><br />
Buttigieg: 5 (-1)<br />
Yang: 3 (+1)<br />
Bullock: 2 (+1)<br />
Klobuchar: 2 (+1)<br />
<br />
All else ≤ 1%</div>
<div class="content-tweet">% of Democratic primary voters considering voting for each candidate (over last month):<br />
<br />
Warren: 55%<br />
Biden: 47<br />
Sanders: 39<br />
Harris: 30<br />
Buttigieg: 28<br />
Booker: 18<br />
O'Rourke: 16<br />
Yang: 13<br />
Klobuchar: 11<br />
Castro: 11<br />
<br />
All else &lt; 10%</div>
<div class="content-tweet">% of Democratic primary voters who would be disappointed if ___ candidate won the nomination (over the last month):<br />
<br />
Williamson: 32<br />
Gabbard: 23<br />
Biden: 22<br />
Delaney: 21<br />
Steyer: 20<br />
Sanders: 19<br />
Bennet: 17<br />
Yang: 17<br />
O'Rourke: 16<br />
Booker: 13<br />
Buttigieg: 11<br />
Warren: 8</div>
</div>
<a class="tweet-url btn btn-secondary" href="https://threadreaderapp.com/thread/1181917735955189761.html">Read 7 tweets</a>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<h1 class="separator list-content-header">Trending hashtags</h1>
</div>
<div class="col-12 t-trending-hashtag-entries hashtags">
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/fml">#FML</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/enjoytheshow">#EnjoyTheShow</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/cloudsql">#CloudSQL</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/why">#Why</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/mothers">#mothers</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/jesustakethewheel">#JESUSTAKETHEWHEEL</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/livepdfans">#LivePDFans</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/bitchplease">#BitchPlease</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/dumb">#dumb</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/cyberwarcon">#cyberwarcon</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/winning">#Winning</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/bearspackers">#BearsPackers</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/impliedintent">#IMPLIEDINTENT</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/livepdnation">#LivePDNation</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/eveningtroll">#EveningTroll</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/impeachmentinquiry">#ImpeachmentInquiry</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/aws">#AWS</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/tactics">#tactics</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/pissedoff">#PISSEDOFF</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/trump">#Trump</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/proveit">#proveit</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/lololololllllll">#LOLOLOLOLLLLLLL</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/wednesdaywisdom">#wednesdaywisdom</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/holysmear">#HolySmear</a>
<a class="btn btn-outline-secondary btn-sm mb-3" href="https://threadreaderapp.com/hashtag/smeard">#smeard</a>
</div>
</div>
</div>
</div>
<div id="popup1" class="overlay-no-js">
<div class="popup">
<h2>Embed code for your website</h2>
<a class="close" href="#">&times;</a>
<div class="content">
<textarea class="form-control" id="embedCode" rows="12">&lt;iframe type=&quot;text/html&quot; width=&quot;100%&quot; height=&quot;500&quot; frameborder=&quot;0&quot; allowfullscreen style=&quot;max-width:100%&quot; src=&quot;https://threadreaderapp.com/embed/1034492056968736768.html&quot;&gt;&lt;/iframe&gt;</textarea>
</div>
</div>
</div>
<div class="sharingfooter">
<div class="follow-us">
<a href="https://twitter.com/threadreaderapp" target="_blank" class="btn btn-outline-secondary btn-xsm gaClickEvent" data-category="how-to" data-action="follow-tra" data-label="sharing-footer"><i class="fab fa-twitter"></i> Follow Us on Twitter!</a>
</div>
<div class="btn-group btn-share-thread with-txt with-color" role="group" aria-label="Share">
<a class="btn btn-outline-primary share-twitter btn-sm gaClickEvent" target="_blank" href="https://twitter.com/intent/tweet?text=Thread%20by%20%40colmmacc%3A%20It%27s%20my%20ten%20year%20anniversary%20at%20AWS%2C%20I%20got%20a%20new%20badge%20and%20everything%21%20To%20celebrate%2C%20I%27m%20going%20to%20tweet%20out%20the%20lightnin%20I%20gave%20at%20last%20week%27s%20Amazon%20dev%20con.%20It%27s%20all%20about%20my%20favorite%20thing%20from%20my%20ten%20years%3A%20Shuffle%20Sharding%21%20Ever%E2%80%A6&amp;url=https%3A%2F%2Fthreadreaderapp.com%2Fthread%2F1034492056968736768.html"
data-category="sharebuttons" data-action="share-on-twitter" data-label="thread-footer"><i class="fab fa-twitter"></i> <span class="txt">Tweet</span></a>
<a class="btn btn-outline-primary share-fb btn-sm gaClickEvent" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fthreadreaderapp.com%2Fthread%2F1034492056968736768.html"
data-category="sharebuttons" data-action="share-on-facebook" data-label="thread-footer"><i class="fab fa-facebook-f"></i> <span class="txt">Share</span></a>
</div>
</div>
<div class="background-blue entry-support hide-premium pd-4 hide-redundant">
<div class="container">
<div class="t-section promo">
<div class="row">
<div class="col-12 col-md-3 text-center">
<img src="https://threadreaderapp.com/images/emoji-robot.png" class="icon" />
</div>
<div class="col-12 col-md-9">
<h2 class="header mb-3">Did Thread Reader help you today?</h2>
<p class="lead">Support us! We are indie developers!</p>
<hr class="my-4">
<p>This site is made by just three indie developers on a laptop doing marketing, support and development! <a href="https://threadreaderapp.com/help/about#team" class="gaClickEvent" data-category="support-buttons" data-action="read-more-about-the-story">Read more about the story</a>.</p>
<p><strong>Become a Premium Member</strong> ($3.00/month or $30.00/year) and get exclusive features!</p>
<p><a class="btn btn-primary gaClickEvent" data-category="support-buttons" data-action="become-premium" target="_blank" href="https://threadreaderapp.com/account/premium">
<i class="far fa-gem"></i> Become Premium </a></p>
<p>Too expensive? <strong>Make a small donation</strong> by buying us coffee ($5) or help with server cost ($10)</p>
<a class="btn btn-secondary btn-paypal mb-2 gaClickEvent" data-category="support-buttons" data-action="donate-via-paypal" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=donate%40threadreaderapp.com&amp;lc=USD&amp;item_name=Thread%20Reader%20donation&amp;no_note=0&amp;cn=Say%20Hello%20or%20give%20some%20feedback%3a&amp;no_shipping=1&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted"><i class="fab fa-paypal"></i> Donate via Paypal</a>
<a class="btn btn-secondary btn-patreon mb-2 gaClickEvent" data-category="support-buttons" data-action="become-patreon" target="_blank" href="https://www.patreon.com/bePatron?u=8298707"><i class="fab fa-patreon"></i> Become our Patreon</a></p>
<p><span style="color:#cc0066"><i class="fas fa-heart"></i> <i class="fas fa-heart"></i></span> Thank you for your support! <span style="color:#cc0066"><i class="fas fa-heart"></i> <i class="fas fa-heart"></i></span></p>
</div>
</div>
</div>
</div>
</div>
<script type="0eb08f2d879f1d5b0fff5d11-text/javascript">
var base_path = "https://threadreaderapp.com";
var google_ad_client = "ca-pub-3755072543989337";
var google_analytics = "UA-104569155-1";
</script>
<script src="https://threadreaderapp.com/javascript/javascript-v1-min.js?v=408" type="0eb08f2d879f1d5b0fff5d11-text/javascript"></script>
<script type="0eb08f2d879f1d5b0fff5d11-text/javascript">
$.post("https://threadreaderapp.com/stats", {"tweetId": "1034492056968736768"}).done(function(data){
data = JSON.parse(data)
if (data && data.total > 99) {
var viewStr = data.total == 1 ? 'view' : 'views'
var str = data.total.toLocaleString() + " " + viewStr;
$('#viewcount').text(str).show()
}
});
$('.action-force').on('click', function (e) {
e.preventDefault();
$('.force-progress, .force-text').toggle();
setTimeout(function() {
$('#form-force').submit();
}, 300);
});
$('.entity-mention-first, .entity-mention-threadreader').each(function () {
//console.log(this, index);
var $this = $(this);
var action = $this.parent().find('.entity-reveal-action');
$this.hide();
if (action.length > 0) return;
$this.parent().prepend('<span class="entity-reveal-action button">mentions</span>')
// add action button to show element
// hide element
});
$('.entity-reveal-action').on('click', function(e) {
$('.entity-mention-first, .entity-mention-threadreader').show();
$('.entity-reveal-action').remove();
e.preventDefault();
});
// Look for external tweet and check if they are thread to add an internal link
$('.twitter-player a').each(function (index, item) {
var link = $(item);
var matches = item.pathname.match(/\/(\d{8,})/);
if (matches != null && matches[1]) {
$.getJSON("https://threadreaderapp.com/api/v0/ping/REPLACE_ME.json".replace('REPLACE_ME', matches[1]), function (data) {
var parent = link.parents('.twitter-player');
var url = 'https://threadreaderapp.com/thread/REPLACE_ME.html'.replace('REPLACE_ME', data.pong);
parent.prepend('<div class="ribbon-content"><div class="ribbon base"><span><a href="' + url + '">Unroll available on Thread Reader</a></span></div></div>');
})
.fail(function (data) {
// Nothing to do console.log(data);
});
}
});
</script>
<script type="0eb08f2d879f1d5b0fff5d11-text/javascript">
$(function(){
$("[data-toggle=popover]").popover({
html : true,
content: function() {
var content = $(this).attr("data-popover-content");
return $(content).children(".popover-body").html();
}
});
});
</script>
<style>
.footer {
bottom: 50px;
}
.entry-support {
padding-bottom: 3rem;
}
</style>
<script type="text/template" id="meta-template" data-option-hide="true">
<div class="entity-url-preview">
<div class="row no-gutters">
<div class="col-12 col-md-4">
<a target="_blank" href="${url}" class="img-cover b-lazy" data-src="${image}">
<img data-src="${image}" src="/images/1px.png" class="b-lazy" style="width:100%;" />
</a>
</div>
<div class="col-12 col-md-8">
<div class="paragraph">
<a target="_blank" href="${url}">
<strong>${title}</strong>
${description}
<small>${url}</small>
</a>
</div>
</div>
</div>
</div>
</script>
<script src="https://threadreaderapp.com/javascript/meta.js?v=408" type="0eb08f2d879f1d5b0fff5d11-text/javascript"></script>
<script type="0eb08f2d879f1d5b0fff5d11-text/javascript">
meta.start('.content-tweet.allow-preview a[data-preview]');
meta.addEventListener('success', function () { if (blazy) blazy.revalidate(); })
</script>
<div class="modal fade" id="shareModal" tabindex="-1" role="dialog" aria-labelledby="shareModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="shareModalLabel">Share this page!</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="share-modal">
<div class="btn-group btn-share-thread with-txt with-color " role="group" aria-label="Share">
<a class="btn btn-outline-primary share-twitter gaClickEvent" target="_blank" href="https://twitter.com/intent/tweet?text=Thread%20by%20%40colmmacc%3A%20It%27s%20my%20ten%20year%20anniversary%20at%20AWS%2C%20I%20got%20a%20new%20badge%20and%20everything%21%20To%20celebrate%2C%20I%27m%20going%20to%20tweet%20out%20the%20lightnin%20I%20gave%20at%20last%20week%27s%20Amazon%20dev%20con.%20It%27s%20all%20about%20my%20favorite%20thing%20from%20my%20ten%20years%3A%20Shuffle%20Sharding%21%20Ever%E2%80%A6&amp;url=https%3A%2F%2Fthreadreaderapp.com%2Fthread%2F1034492056968736768.html"
data-category="sharebuttons" data-action="share-on-twitter" data-label="modal"><i class="fab fa-twitter"></i> <span class="txt">Tweet</span></a>
<a class="btn btn-outline-primary share-fb gaClickEvent" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fthreadreaderapp.com%2Fthread%2F1034492056968736768.html"
data-category="sharebuttons" data-action="share-on-facebook" data-label="modal"><i class="fab fa-facebook-f"></i> <span class="txt">Share</span></a>
<a class="btn btn-outline-primary share-email gaClickEvent" href="mailto:?subject=Thread%20by%20%40colmmacc%3A%20It%27s%20my%20ten%20year%20anniversary%20at%20AWS%2C%20I%20got%20a%20new%20badge%20and%20everything%21%20To%20celebrate%2C%20I%27m%20going%20to%20tweet%20out%20the%20lightning%20talk%20I%20gave%20at%20las%E2%80%A6&body=Thread%20by%20%40colmmacc%3A%20It%27s%20my%20ten%20year%20anniversary%20at%20AWS%2C%20I%20got%20a%20new%20badge%20and%20everything%21%20To%20celebrate%2C%20I%27m%20going%20to%20tweet%20out%20the%20lightnin%20I%20gave%20at%20last%20week%27s%20Amazon%20dev%20con.%20It%27s%20all%20about%20my%20favorite%20thing%20from%20my%20ten%20years%3A%20Shuffle%20Sharding%21%20Ever%E2%80%A6%0A%0Ahttps%3A%2F%2Fthreadreaderapp.com%2Fthread%2F1034492056968736768.html"
data-category="sharebuttons" data-action="share-by-email" data-label="modal"><i class="far fa-envelope"></i> <span class="txt">Email</span></a>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="button button-cancel" data-dismiss="modal">Done</button>
</div>
</div>
</div>
</div>
<script type="0eb08f2d879f1d5b0fff5d11-text/javascript">
$('.action-share').on('click', function (e) {
$('#shareModal').modal('show');
e.preventDefault();
return false;
});
</script>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8" type="0eb08f2d879f1d5b0fff5d11-text/javascript"></script>
<script type="0eb08f2d879f1d5b0fff5d11-text/javascript">
if (navigator.share) {
$('.action-share-email').hide();
$('.action-share-native').on('click', function(e) {
navigator.share({
title: 'Thread\u0020by\u0020\u0040colmmacc\u003A\u0020It\u0027s\u0020my\u0020ten\u0020year\u0020anniversary\u0020at\u0020AWS,\u0020I\u0020got\u0020a\u0020new\u0020badge\u0020and\u0020everything\u0021\u0020To\u0020celebrate,\u0020I\u0027m\u0020going\u0020to\u0020tweet\u0020out\u0020the\u0020lightning\u0020talk\u0020I\u0020gave\u0020at\u0020las\u2026',
text: 'Thread\u0020by\u0020\u0040colmmacc\u003A\u0020It\u0027s\u0020my\u0020ten\u0020year\u0020anniversary\u0020at\u0020AWS,\u0020I\u0020got\u0020a\u0020new\u0020badge\u0020and\u0020everything\u0021\u0020To\u0020celebrate,\u0020I\u0027m\u0020going\u0020to\u0020tweet\u0020out\u0020the\u0020lightnin\u0020I\u0020gave\u0020at\u0020last\u0020week\u0027s\u0020Amazon\u0020dev\u0020con.\u0020It\u0027s\u0020all\u0020about\u0020my\u0020favorite\u0020thing\u0020from\u0020my\u0020ten\u0020years\u003A\u0020Shuffle\u0020Sharding\u0021\u0020Ever\u2026',
url: 'https://threadreaderapp.com/thread/1034492056968736768.html'
});
e.preventDefault();
});
} else {
$('.action-share-native').hide();
}
</script>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" onload="run();" type="0eb08f2d879f1d5b0fff5d11-text/javascript"></script>
<footer class="footer">
<div class="container">
<div class="row" style="color:white">
<div class="col-5">
<a class="btn btn-default btn-circle" target="_blank" href="mailto:hello@threadreaderapp.com">
<i class="far fa-envelope"></i>
</a>
<a class="btn btn-default btn-circle twitter gaClickEvent" href="https://twitter.com/threadreaderapp" target="_blank" data-category="how-to" data-action="follow-tra" data-label="footer"><i class="fab fa-twitter"></i></a>
</div>
<div class="col-7 text-right" >
<a href="https://threadreaderapp.com/help">Help</a> |
<a href="https://threadreaderapp.com/help/about">About</a> |
<a href="https://threadreaderapp.com/help/terms">TOS</a> |
<a href="https://threadreaderapp.com/help/privacy">Privacy</a>
</div>
</div>
</div>
</footer>
<style>.container .thread-info .count{border-bottom:dotted 1px #999}</style><script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="0eb08f2d879f1d5b0fff5d11-|49" defer></script><script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"134793e017df4a0fb9875ad7e32fbf70","r":1,"spa":2}' crossorigin="anonymous"></script>
</body>
</html>