<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta name = "generator" content = "Asciidoctor 2.0.10" >
< meta name = "description" content = "Architecture instructions" >
< meta name = "keywords" content = "Architecture" >
< meta name = "author" content = "Apostolos rootApostolos@swarmlab.io" >
< title > Architecture!< / title >
< link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700" >
< style >
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
:not(pre)>code.nobreak{word-wrap:normal}
:not(pre)>code.nowrap{white-space:nowrap}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
table.tableblock{max-width:100%;border-collapse:separate}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot,table.frame-ends{border-width:1px 0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
< / style >
< link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" >
< / head >
< body class = "article toc2 toc-right" >
< div id = "header" >
< h1 > Architecture!< / h1 >
< div class = "details" >
< span id = "author" class = "author" > Apostolos rootApostolos@swarmlab.io< / span > < br >
< / div >
< div id = "toc" class = "toc2" >
< div id = "toctitle" > Table of contents< / div >
< ul class = "sectlevel1" >
< li > < a href = "#_deploy_microservices_to_a_swarm_cluster" > 1. Deploy microservices to a Swarm cluster< / a >
< ul class = "sectlevel2" >
< li > < a href = "#_scalability" > 1.1. Scalability< / a > < / li >
< li > < a href = "#_availability" > 1.2. Availability< / a > < / li >
< li > < a href = "#_security" > 1.3. Security< / a > < / li >
< li > < a href = "#_configuration" > 1.4. Configuration< / a > < / li >
< / ul >
< / li >
< li > < a href = "#_some_thoughts_regarding_microservice_based_application" > 2. Some thoughts regarding Microservice-based application< / a >
< ul class = "sectlevel2" >
< li > < a href = "#_this_tools_will_help" > 2.1. this tools will help< / a > < / li >
< li > < a href = "#_and_here_is_the_problem" > 2.2. and here is the problem< / a > < / li >
< li > < a href = "#_suggestion" > 2.3. Suggestion< / a > < / li >
< / ul >
< / li >
< / ul >
< / div >
< / div >
< div id = "content" >
< div id = "preamble" >
< div class = "sectionbody" >
< div class = "sidebarblock" >
< div class = "content" >
< div class = "title" > Architecture< / div >
< div class = "paragraph" >
< p > We will be trying to create a swarm implementation that will allow communication between all of the members/nodes.< / p >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "sect1" >
< h2 id = "_deploy_microservices_to_a_swarm_cluster" > 1. Deploy microservices to a Swarm cluster< / h2 >
< div class = "sectionbody" >
< div class = "openblock float-group" >
< div class = "content" >
< div class = "imageblock right" >
< div class = "content" >
< img src = "data:image/png;base64,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
< / div >
< / div >
< div class = "paragraph" >
< p > < br >
< / p >
< / div >
< div class = "ulist" >
< div class = "title" > microservices architecture< / div >
< ul >
< li >
< p > a microservice performs a simple task< / p >
< div class = "ulist" >
< ul >
< li >
< p > communicates with clients or< / p >
< / li >
< li >
< p > other microservices< / p >
< div class = "ulist" >
< ul >
< li >
< p > communication mechanisms such as REST API requests or Websocket etc< / p >
< / li >
< / ul >
< / div >
< / li >
< / ul >
< / div >
< / li >
< / ul >
< / div >
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
< div class = "ulist" >
< ul >
< li >
< p > Microservices can include any programming language you like< / p >
< div class = "ulist" >
< ul >
< li >
< p > and with the orchestration tools they are easy to deploy and maintain< / p >
< div class = "literalblock" >
< div class = "content" >
< pre > This architecture uses NodeJS and Redis microservices deployed as Docker containers< / pre >
< / div >
< / div >
< / li >
< / ul >
< / div >
< / li >
< / ul >
< / div >
< / td >
< / tr >
< / table >
< / div >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_scalability" > 1.1. Scalability< / h3 >
< div class = "paragraph" >
< p > You can scale your application by updating the number of replica nodes in the swarm cluster< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-yml" data-lang = "yml" > ...
deploy:
replicas: 15
placement:
max_replicas_per_node: 1
constraints:
- node.labels.region==regio1
...< / code > < / pre >
< / div >
< / div >
< div class = "admonitionblock tip" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-tip" title = "Tip" > < / i >
< / td >
< td class = "content" >
< div class = "title" > Segmentation< / div >
Dynamic infrastructure: services can scale up and down without waiting for each other.
< / td >
< / tr >
< / table >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_availability" > 1.2. Availability< / h3 >
< div class = "paragraph" >
< p > No single point of failure.< / p >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_security" > 1.3. Security< / h3 >
< / div >
< div class = "sect2" >
< h3 id = "_configuration" > 1.4. Configuration< / h3 >
< / div >
< / div >
< / div >
< div class = "sect1" >
< h2 id = "_some_thoughts_regarding_microservice_based_application" > 2. Some thoughts regarding Microservice-based application< / h2 >
< div class = "sectionbody" >
< div class = "sidebarblock" >
< div class = "content" >
< div class = "title" > Distributed Service Placement for Microservice-based Applications< / div >
< div class = "paragraph" >
< p > Nowadays whith applications becoming more and more powerfull, users more demanding and IOT devices taking swarming our lives, the need for maximizing < strong > < em > location awarenes< / em > < / strong > and minimizing delay has entered the field.< / p >
< / div >
< div class = "paragraph" >
< p > Thus we cannot relliably trust a signle central data point and have to mingrate to versatile and distributed systems moving the brain of our application ever closer to the user (edge).< / p >
< / div >
< div class = "paragraph" >
< p > < strong > < em > Multi-access Edge (MEC)< / em > < / strong > Computing was born.< / p >
< / div >
< div class = "admonitionblock tip" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-tip" title = "Tip" > < / i >
< / td >
< td class = "content" >
< div class = "paragraph" >
< p > < strong > < em > Location-aware< / em > < / strong > technology is any technology that is able to detect its current location and then analyze this data to control event and information flow. < a href = "https://en.wikipedia.org/wiki/Location_awareness" target = "_blank" rel = "noopener" > Wikipedia< / a > < / p >
< / div >
< div class = "paragraph" >
< p > < strong > < em > MEC< / em > < / strong > can be defined as cloud services running at the edge of a network and performing specific tasks — in real- or near-real-time < a href = "https://en.wikipedia.org/wiki/Edge_computing" > wikipedia< / a > < / p >
< / div >
< / td >
< / tr >
< / table >
< / div >
< div class = "paragraph" >
< p > To adapt to the above we can shift towards:< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > small and scalable data-centers placed closed to the cloud edge< / p >
< / li >
< li >
< p > minimalization of backbone data transmission< / p >
< / li >
< / ul >
< / div >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_this_tools_will_help" > 2.1. this tools will help< / h3 >
< div class = "paragraph" >
< p > < strong > Container technologies< / strong > (Docker), and < strong > orchestration/maintenance tools< / strong > (Kubernetes, DockerSwarm etc), are becoming the mainstream solution for packaging, deploying, maintaining, and healing applications.< / p >
< / div >
< div class = "paragraph" >
< p > Each microservice decoupled from the application can be packaged as a Docker image and each microservice instance is a Docker container.< / p >
< / div >
< div class = "paragraph" >
< p > Kubernetes for example is one of the best examples for creating cloud-native applications and leveraging the benefits of a distributed system.< / p >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_and_here_is_the_problem" > 2.2. and here is the problem< / h3 >
< div class = "paragraph" >
< p > < strong > Problem:< / strong > < / p >
< / div >
< div class = "paragraph" >
< p > When all of the services are placed on one edge site, network congestion is inevitable.< / p >
< / div >
< div class = "paragraph" >
< p > < strong > Solution:< / strong > < / p >
< / div >
< div class = "paragraph" >
< p > With one service deployed on more than one edge site, requests from different end users at different locations can be balanced, so as to ensure the high availability of service and the robustness of the provision platform.< / p >
< / div >
< div class = "paragraph" >
< p > < strong > But< / strong > , most tools used have some hard limits concerning this.< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > It is often treated as a single abstract service with given input and output data size.< / p >
< / li >
< li >
< p > Time series or composition property of services are not fully taken into consideration.< / p >
< / li >
< li >
< p > Due to the heterogeneity of edge sites, such as different CPU cycle frequency and memory footprint, varying background load, transient network interrupts and so on, the service provision platform might face greatly slowdowns or even runtime crash.< / p >
< / li >
< li >
< p > the default assignment, deployment, and management of containers does not fully take the heterogeneity in both physical and virtualized nodes into consideration.< / p >
< / li >
< li >
< p > Besides, the healing capability of Kubernetesis principally monitoring the status of containers, pods, and nodes and timely restarting the failures, which is not enough for high availability.< / p >
< / li >
< li >
< p > in some cases when the pod failure happens, the outage time of the corresponding service could be dozens of seconds.< / p >
< div class = "ulist" >
< ul >
< li >
< p > When node failure happens, the outage time could be dozens of minutes< / p >
< / li >
< / ul >
< / div >
< / li >
< / ul >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_suggestion" > 2.3. Suggestion< / h3 >
< div class = "literalblock" >
< div class = "content" >
< pre > Therefore, we have to create a better maybe even using different tools to better manage the distribution of our system data and eliminate the problems mentioned above.< / pre >
< / div >
< / div >
< div class = "literalblock" >
< div class = "content" >
< pre > This solution will most likely have to be able to utilize multiple edge applications/host at once to balance out the load on one single node.< / pre >
< / div >
< / div >
< div class = "paragraph" >
< p > However,< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Such kind of service requires redundancy and the amount of hosts needed is difficult to agree upon since the network constantly changes.< / p >
< / li >
< li >
< p > Therefore our best bet is to seperate the different cases and try our best to analyze the data and plan our service.< / p >
< / li >
< / ul >
< / div >
< div class = "paragraph" >
< p > Another problem , currenty not tackled by any major providers are unique attributes of each location, like traditional or human behavioural patterns (for example parking in cetral Rome or a Greek island!).< / p >
< / div >
< div class = "paragraph" >
< p > Gathering data from different requests and places we have to design an algorithm to better utilize the location-specific information.< / p >
< / div >
< div class = "paragraph" >
< p > Our target would be to slowly adapt to all locations and various unique details of each of them.< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > better services for the end users always keeping in mind to best distribute our system< / p >
< / li >
< li >
< p > creation of a general microservice based chain-application that works as one, large, redundant, distributed system< / p >
< / li >
< / ul >
< / div >
< / div >
< / div >
< / div >
< / div >
< / body >
< / html >