-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
5826 lines (5826 loc) · 474 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!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.17">
<meta name="author" content="Simon LUCIDO">
<title>Micro-services: Polycode TAD</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 the following line when using as a 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"; */
html{font-family:sans-serif;-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}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{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}
audio,video{display:inline-block}
audio:not([controls]){display:none;height: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]{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{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;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-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%}
.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}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{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}
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{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}
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}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
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:1px solid #dedede;word-wrap:normal}
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{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}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
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;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;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:0 auto;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:flex;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:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.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{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.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)}
.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);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;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{border-radius:4px;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;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,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.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-serif;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;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width: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{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}
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}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
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:flex;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}
td.hdlist2{word-wrap:anywhere}
.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:4px solid #fff;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}
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);border-radius:50%;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,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt,summary{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;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{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]{border-bottom:1px dotted}
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}
#header,#content,#footnotes,#footer{max-width:none}
#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 amzn-kf8,print{#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>
</head>
<body class="book toc2 toc-left">
<div id="header">
<h1>Micro-services: Polycode TAD</h1>
<div class="details">
<span id="author" class="author">Simon LUCIDO</span><br>
<span id="email" class="email"><a href="mailto:[email protected]">[email protected]</a></span><br>
<span id="revnumber">version 1.0,</span>
<span id="revdate">2023-01-22</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel0">
<li><a href="#_introducing_microservices">Introducing microservices</a>
<ul class="sectlevel1">
<li><a href="#_introduction">Introduction</a></li>
<li><a href="#_the_assumptions">The assumptions</a></li>
<li><a href="#_the_existing">The existing</a>
<ul class="sectlevel2">
<li><a href="#_current_limitations">Current limitations</a></li>
</ul>
</li>
<li><a href="#_microservices">Microservices</a>
<ul class="sectlevel2">
<li><a href="#_what_are_microservices">What are microservices</a></li>
<li><a href="#_why_microservices">Why microservices</a></li>
<li><a href="#costOfMicroservices">The cost of microservices</a></li>
</ul>
</li>
<li><a href="#_does_it_really_makes_sense">Does it really makes sense ?</a></li>
<li><a href="#_wrap_up">Wrap up</a></li>
</ul>
</li>
<li><a href="#_from_domains_to_microservices">From domains to microservices</a>
<ul class="sectlevel1">
<li><a href="#_introduction_2">Introduction</a></li>
<li><a href="#_ubiquitous_language">Ubiquitous Language</a></li>
<li><a href="#_user_stories">User stories</a></li>
<li><a href="#_domain_driven_design_ddd">Domain Driven Design (DDD)</a>
<ul class="sectlevel2">
<li><a href="#_the_origin">The origin</a></li>
<li><a href="#_what_is_the_goal">What is the goal</a></li>
<li><a href="#_microsoft">Microsoft</a></li>
</ul>
</li>
<li><a href="#_polycode_domain">Polycode Domain</a></li>
<li><a href="#_bounded_contexts">Bounded Contexts</a></li>
<li><a href="#_tactical_ddd">Tactical DDD</a>
<ul class="sectlevel2">
<li><a href="#_the_user_context">The user context</a></li>
<li><a href="#_the_practice_context">The practice context</a></li>
<li><a href="#_the_assessment_context">The assessment context</a></li>
<li><a href="#_the_content_context">The content context</a></li>
</ul>
</li>
<li><a href="#_microservices_2">Microservices</a>
<ul class="sectlevel2">
<li><a href="#_from_domain_model_to_microservices">From domain model to microservices</a></li>
<li><a href="#_polycode">Polycode</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_how_to_manage_authentication_using_an_oidc">How to manage authentication using an OIDC</a>
<ul class="sectlevel1">
<li><a href="#_introduction_3">Introduction</a>
<ul class="sectlevel2">
<li><a href="#_what_is_authentication">What is authentication?</a></li>
<li><a href="#_what_is_authorization">What is authorization?</a></li>
<li><a href="#_openid_connect">OpenID Connect</a></li>
<li><a href="#_keycloak">Keycloak</a></li>
</ul>
</li>
<li><a href="#_keycloak_and_polycode">Keycloak and Polycode</a>
<ul class="sectlevel2">
<li><a href="#_architecture_diagram">Architecture Diagram</a></li>
<li><a href="#_deployment_diagram">Deployment Diagram</a></li>
<li><a href="#_sequence_diagrams">Sequence Diagrams</a></li>
<li><a href="#_proof_of_concept">Proof of concept</a></li>
</ul>
</li>
<li><a href="#_conclusion">Conclusion</a></li>
</ul>
</li>
<li><a href="#_inter_microservices_communication">Inter microservices communication</a>
<ul class="sectlevel1">
<li><a href="#_introduction_4">Introduction</a></li>
<li><a href="#_what_are_the_goals">What are the goals</a>
<ul class="sectlevel2">
<li><a href="#_latency_and_performance">Latency and performance</a></li>
<li><a href="#_fault_tolerance_and_resiliency">Fault tolerance and resiliency</a></li>
<li><a href="#_decoupling">Decoupling</a></li>
<li><a href="#_security">Security</a></li>
<li><a href="#_system_agnosticism">System agnosticism</a></li>
</ul>
</li>
<li><a href="#_the_options_protocol_layer">The options, protocol layer</a>
<ul class="sectlevel2">
<li><a href="#_graphql">GraphQL</a></li>
<li><a href="#_asynchronous_communications">Asynchronous communications</a></li>
<li><a href="#_rest_api">REST API</a></li>
<li><a href="#_grpc">gRPC</a></li>
</ul>
</li>
<li><a href="#_the_options_operation_layer">The options, operation layer</a>
<ul class="sectlevel2">
<li><a href="#_kubernetes_service_discovery">Kubernetes' service discovery</a></li>
<li><a href="#_service_mesh">Service mesh</a></li>
</ul>
</li>
<li><a href="#_polycode_2">Polycode</a>
<ul class="sectlevel2">
<li><a href="#_my_suggestions">My suggestions</a></li>
<li><a href="#_proof_of_concept_2">Proof of concept</a></li>
</ul>
</li>
<li><a href="#_conclusion_2">Conclusion</a></li>
</ul>
</li>
<li><a href="#_tracing_and_logging">Tracing and logging</a>
<ul class="sectlevel1">
<li><a href="#_introduction_5">Introduction</a></li>
<li><a href="#_tracing">Tracing</a></li>
<li><a href="#_logging">Logging</a></li>
<li><a href="#_opentelemetry">OpenTelemetry</a>
<ul class="sectlevel2">
<li><a href="#_vocabulary">Vocabulary</a></li>
<li><a href="#_logging_with_opentelemetry">Logging with OpenTelemetry</a></li>
<li><a href="#_overview_of_a_typical_opentelemetry_system">Overview of a typical OpenTelemetry system</a></li>
</ul>
</li>
<li><a href="#_tools">Tools</a>
<ul class="sectlevel2">
<li><a href="#_visualization_tools">Visualization tools</a></li>
</ul>
</li>
<li><a href="#_polycode_3">Polycode</a>
<ul class="sectlevel2">
<li><a href="#_deployment">Deployment</a></li>
<li><a href="#_sequence_diagram_2">Sequence diagram</a></li>
</ul>
</li>
<li><a href="#_conclusion_3">Conclusion</a></li>
</ul>
</li>
<li><a href="#_search_engine">Search Engine</a>
<ul class="sectlevel1">
<li><a href="#_introduction_6">Introduction</a>
<ul class="sectlevel2">
<li><a href="#_what_is_a_search_engine">What is a search engine</a></li>
<li><a href="#_why_would_we_want_it_in_polycode">Why would we want it in Polycode</a></li>
</ul>
</li>
<li><a href="#_how_to_implement_a_search_engine">How to implement a search engine ?</a>
<ul class="sectlevel2">
<li><a href="#_mongodb">MongoDB</a></li>
<li><a href="#_elasticsearch">ElasticSearch</a></li>
<li><a href="#_apache_solr">Apache Solr</a></li>
</ul>
</li>
<li><a href="#_polycode_4">Polycode</a>
<ul class="sectlevel2">
<li><a href="#_ui_mockups">UI Mockups</a></li>
<li><a href="#_the_stack">The stack</a></li>
<li><a href="#_sequence_diagrams_2">Sequence diagrams</a></li>
</ul>
</li>
<li><a href="#_conclusion_4">Conclusion</a></li>
</ul>
</li>
<li><a href="#_runner_architecture">Runner architecture</a>
<ul class="sectlevel1">
<li><a href="#_introduction_7">Introduction</a>
<ul class="sectlevel2">
<li><a href="#_what_are_runners">What are runners</a></li>
</ul>
</li>
<li><a href="#_running_code_in_an_isolated_manner">Running code in an isolated manner</a>
<ul class="sectlevel2">
<li><a href="#_containers">Containers</a></li>
<li><a href="#_virtual_machines">Virtual Machines</a></li>
<li><a href="#_serverless">Serverless</a></li>
</ul>
</li>
<li><a href="#_running_code_in_a_scalable_way">Running code in a scalable way</a>
<ul class="sectlevel2">
<li><a href="#_controller_worker_architecture">Controller / worker architecture</a></li>
<li><a href="#_machine_pool">Machine pool</a></li>
<li><a href="#_scaling_infinitely">Scaling infinitely</a></li>
<li><a href="#_caching">Caching</a></li>
<li><a href="#_heating_up_vms">Heating up VMs</a></li>
<li><a href="#_the_complete_picture">The complete picture</a></li>
</ul>
</li>
<li><a href="#_polycode_5">Polycode</a>
<ul class="sectlevel2">
<li><a href="#_architecture_diagram_2">Architecture diagram</a></li>
<li><a href="#_registering_workers_sequence_diagram">Registering workers, sequence diagram</a></li>
</ul>
</li>
<li><a href="#_conclusion_5">Conclusion</a></li>
</ul>
</li>
<li><a href="#_data_architecture">Data architecture</a>
<ul class="sectlevel1">
<li><a href="#_introduction_8">Introduction</a>
<ul class="sectlevel2">
<li><a href="#_data_architecture_in_microservices">Data architecture in microservices</a></li>
<li><a href="#_relation_with_the_microservice_architecture">Relation with the microservice architecture</a></li>
</ul>
</li>
<li><a href="#_different_databases_for_different_needs">Different databases for different needs</a>
<ul class="sectlevel2">
<li><a href="#_relational_databases">Relational databases</a></li>
<li><a href="#_document_databases">Document databases</a></li>
<li><a href="#_in_memory_databases">In-memory databases</a></li>
</ul>
</li>
<li><a href="#_availability_and_performance">Availability and performance</a>
<ul class="sectlevel2">
<li><a href="#_data_replication">Data replication</a></li>
<li><a href="#_data_sharding">Data sharding</a></li>
<li><a href="#_data_caching">Data caching</a></li>
</ul>
</li>
<li><a href="#_architecture_patterns">Architecture patterns</a>
<ul class="sectlevel2">
<li><a href="#_shared_database_pattern">Shared database pattern</a></li>
<li><a href="#_database_per_service_pattern">Database per Service pattern</a></li>
</ul>
</li>
<li><a href="#_polycode_6">Polycode</a>
<ul class="sectlevel2">
<li><a href="#_current_data_architecture">Current data architecture</a></li>
<li><a href="#_target_data_architecture">Target data architecture</a></li>
</ul>
</li>
<li><a href="#_conclusion_6">Conclusion</a></li>
</ul>
</li>
<li><a href="#_adding_a_mobile_app_to_polycode">Adding a mobile app to Polycode</a>
<ul class="sectlevel1">
<li><a href="#_introduction_9">Introduction</a></li>
<li><a href="#_what_is_important">What is important ?</a>
<ul class="sectlevel2">
<li><a href="#_offline">Offline</a></li>
<li><a href="#_short_in_time">Short in time</a></li>
<li><a href="#repetitive">Repetitive</a></li>
</ul>
</li>
<li><a href="#_mobile_only">Mobile only ?</a></li>
<li><a href="#_mobile_functionalities">Mobile functionalities</a>
<ul class="sectlevel2">
<li><a href="#_daily_coding_lessons">Daily coding lessons</a></li>
<li><a href="#_daily_coding_quizzes">Daily coding quizzes</a></li>
<li><a href="#_find_the_bug">Find the bug</a></li>
<li><a href="#_application_flow">Application flow</a></li>
<li><a href="#_api">API</a></li>
</ul>
</li>
<li><a href="#_authentication">Authentication</a>
<ul class="sectlevel2">
<li><a href="#_requirements">Requirements</a></li>
<li><a href="#_how_to_do_it">How to do it ?</a></li>
<li><a href="#_sequence_diagram_3">Sequence diagram</a></li>
</ul>
</li>
<li><a href="#_conclusion_7">Conclusion</a></li>
</ul>
</li>
<li><a href="#_security_2">Security</a>
<ul class="sectlevel1">
<li><a href="#_introduction_10">Introduction</a>
<ul class="sectlevel2">
<li><a href="#_what_even_is_security">What even is security ?</a></li>
<li><a href="#_why_is_security_important">Why is security important ?</a></li>
</ul>
</li>
<li><a href="#_frontend_security">Frontend security</a>
<ul class="sectlevel2">
<li><a href="#_cross_site_scripting_xss_attacks">Cross-site scripting (XSS Attacks)</a></li>
<li><a href="#_cross_site_request_forgery_csrf">Cross-site Request Forgery (CSRF)</a></li>
<li><a href="#_browser_storage_attacks">Browser storage attacks</a></li>
<li><a href="#_man_in_the_middle_attacks">Man-in-the-middle attacks</a></li>
</ul>
</li>
<li><a href="#_backend_security">Backend security</a>
<ul class="sectlevel2">
<li><a href="#_broken_access_control_broken_authentication">Broken access control / broken authentication</a></li>
<li><a href="#_cryptographic_failures">Cryptographic failures</a></li>
<li><a href="#_injection">Injection</a></li>
<li><a href="#_outdated_and_vulnerable_software">Outdated and vulnerable software</a></li>
<li><a href="#_server_side_request_forgery_ssrf">Server-side request forgery (SSRF)</a></li>
<li><a href="#_man_in_the_middle_attacks_2">Man-in-the-middle attacks</a></li>
<li><a href="#_input_validation">Input Validation</a></li>
</ul>
</li>
<li><a href="#_operation_security">Operation security</a>
<ul class="sectlevel2">
<li><a href="#_security_misconfiguration">Security misconfiguration</a></li>
<li><a href="#_outdated_and_vulnerable_software_2">Outdated and vulnerable software</a></li>
<li><a href="#_data_and_system_integrity_failures">Data and system integrity failures</a></li>
<li><a href="#_security_logging_and_monitoring_failures">Security logging and monitoring failures</a></li>
</ul>
</li>
<li><a href="#_security_and_migrating_polycode_to_microservices">Security and migrating Polycode to microservices</a></li>
<li><a href="#_conclusion_8">Conclusion</a></li>
</ul>
</li>
<li><a href="#_ui_integration">UI Integration</a>
<ul class="sectlevel1">
<li><a href="#_introduction_11">Introduction</a>
<ul class="sectlevel2">
<li><a href="#_how_does_the_ui_relates_to_the_backend">How does the UI relates to the backend ?</a></li>
<li><a href="#_the_end_user_experience">The end user experience</a></li>
<li><a href="#_polycode_7">Polycode</a></li>
</ul>
</li>
<li><a href="#_micro_frontends">Micro frontends</a>
<ul class="sectlevel2">
<li><a href="#_server_side_template_composition">Server-side template composition</a></li>
<li><a href="#_run_time_integration">Run-time integration</a></li>
</ul>
</li>
<li><a href="#_conclusion_9">Conclusion</a></li>
</ul>
</li>
<li><a href="#_polycode_tad_conclusion">Polycode TAD: Conclusion</a>
<ul class="sectlevel1">
<li><a href="#_summary">Summary</a></li>
<li><a href="#_end_note">End note</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<h1 id="_introducing_microservices" class="sect0">Introducing microservices</h1>
<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The web development world has evolved from a simple, monolithic, centralized model to resilient, highly scalable and flexible architectures over the past decades. This means that, getting it right, in what may appears as a convoluted and overly complex way of handling simple requests from users, has become complicated. In this paper, we will explore the key concepts and considerations involved in migrating to a microservices architecture. We will begin by defining microservices and discussing their key characteristics and benefits. We will then delve into specific topics, such as authentication, communication between microservices, tracing and logging requests, and handling security. We will also discuss how to integrate a mobile app with a microservices architecture. We will try to dive into what makes sense and what doesn’t for our Polycode application.</p>
</div>
<div class="paragraph">
<p>For those unfamiliar, Polycode is a platform aimed at developers, offering courses and challenges around development. It mainly focuses on learning languages or coding concepts, and provides interactive development session where the user can mess around with its code, trying to match the requirements of the exercise.</p>
</div>
<div class="paragraph">
<p>However, the service has evolved quite rapidly, with new features being requested and added. The architecture and the code must reflect this dynamic, fast-paced constraint. Wide-range of features are being developed and will be developed, and this decoupling must be reflected in the approach taken by the project’s development team.</p>
</div>
<div class="paragraph">
<p>The newest feature currently is development, is a new service that opens Polycode to be a assessment platform. Schools will be able to create tests for candidates, and get summed up scores and results.</p>
</div>
<div class="paragraph">
<p>It is important to note that, although this will all be related to Polycode, not every answers aims at directly solving the problem at the Polycode level. Some suggestions are broader, and can be applied for most microservice architectures.
With the same mindset, most suggestions can be applied with no system already in place, and can be used as foundations for building a microservice architecture, with no existing system.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_the_assumptions">The assumptions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Before continuing, I would like to pause on some assumptions made along this papers. Unless specified, those assumptions will always be taken as true all along this document.</p>
</div>
<div class="paragraph">
<p>First off, this project is maintained by students, in a scholar environments. This is a tool for learning as its core, and monetary aspects will be dampened in the suggestions.
I would suggest that, if it was not, migrating to microservices would be a waste of resources. I will dive more into that later in the paragraph.</p>
</div>
<div class="paragraph">
<p>I will also take the stance that we have limited time resources, since the team is fixed and can’t grow. I will assume that the team will be able to work for a few months specifically on this migration, letting us enough time to implement reasonable solutions. Rewriting a HTTP Proxy from scratch is not reasonable. Setting up a Service Mesh is.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_the_existing">The existing</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We first need to understand the current architecture of Polycode. To do so, I think looking at a (very) simplified diagram of the current architecture will best describes what is currently going on :</p>
</div>
<div id="currentArchitecture" class="paragraph">
<div class="title">Current architecture</div>
<p><span class="image"><img src="00_Introduction/TAD_00_CurrentArchitecture.png" alt="TAD 00 CurrentArchitecture"></span></p>
</div>
<div class="paragraph">
<p>To give some contexts for those unfamiliar with the project, what I call "Polycode Runners", is the API that allow us to run the code that the user typed in.</p>
</div>
<div class="paragraph">
<p>Very quick pass on the stack we have :</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://kubernetes.io/">Kubernetes</a> as our container manager.</p>
</li>
<li>
<p><a href="https://argo-cd.readthedocs.io/en/stable/">ArgoCD</a> as our <a href="https://www.gitops.tech/">GitOps</a> engine</p>
</li>
<li>
<p><a href="https://github.com/kubernetes/ingress-nginx">Nginx Ingress Controller</a> as our Kubernetes <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/">ingress.</a></p>
</li>
<li>
<p>The <a href="https://prometheus.io/docs/visualization/grafana/">Prometheus/Grafana</a> stack for our metrics and monitoring.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>As you may have noticed, the current implementation is halfway between an old monolithic application, with a heavy native application, running on a bare-metal server.
Instead, we are already in a Kubernetes context, which already allows for automatic scaling, if the application is made with the correct architecture decisions.</p>
</div>
<div class="paragraph">
<p>It is also worth noting that the current implementation mostly follows a service-oriented architecture.</p>
</div>
<div class="sect2">
<h3 id="_current_limitations">Current limitations</h3>
<div class="paragraph">
<p>As shown in the diagram <a href="#currentArchitecture">above</a>, except for the runner, everything is still mixed up in one big application, the API. This gives us enough flexibility to scale our application if the user count were to increase, but we would spin up a heavy server every time, although probably only a small portion of our application takes all the load.</p>
</div>
<div id="scalingMonolith" class="paragraph">
<p>For example, we currently handles the authentication within the API. The users routes are hit pretty heavily, since every time the user loads the website, they try to fetch data about themselves. This might take over half of the available resources of the container (totally arbitrary, for the example), and the team routes only taking less than 1 percent of the available resources. This can lead to poor performance in high-traffic environments.</p>
</div>
<div class="paragraph">
<p>Another downside of the current implementation is that the application is getting harder to maintain and update, caused by its growing codebase size and the intricacies and dependencies between each part.
It becomes hard to introduce new features, or update existing ones, without running the risk of breaking other parts of the code, although this problem is softened by our code architecture. Developing new features in parallel has also taken a hit, for the same reasons.
Deploying it is a heavy process, since the API as a whole needs to be recreated in our cluster.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_microservices">Microservices</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Microservices seek to solve those problems. We will try to understand how, and at what cost. But first, let’s define a microservice.</p>
</div>
<div class="sect2">
<h3 id="_what_are_microservices">What are microservices</h3>
<div class="paragraph">
<p>Microservices are a modern architectural approach to building software applications. They involve splitting a large, monolithic application into smaller, independent services that can be developed, deployed, and scaled individually. Each microservice has a specific role and communicates with other microservices through well-defined interfaces, typically using a lightweight messaging protocol.</p>
</div>
</div>
<div class="sect2">
<h3 id="_why_microservices">Why microservices</h3>
<div class="sect3">
<h4 id="_scalability">Scalability</h4>
<div class="paragraph">
<p>One of the key advantages of microservices is that they allow for greater flexibility and scalability. Indeed, because microservices are typically deployed in containers, they can be easily scaled up or down to meet changing demand. This is perfect for our use case, since we are already running a Kubernetes cluster, whose purpose is to provide tools to automate this task.
This resolves the issue mentioned <a href="#scalingMonolith">above</a>. We can now spin up 15 authentication microservices, while only having 3 team microservices.</p>
</div>
</div>
<div class="sect3">
<h4 id="_resiliency_and_decoupling">Resiliency and decoupling</h4>
<div class="paragraph">
<p>Another advantage of microservices is that they are designed to be fault-tolerant and resilient. Because microservices are modular and independent, if one service fails, the others can continue to operate, minimizing the impact of any issues on the overall application. This is not a given feature of microservices, but the architecture sets the groundwork for developers to build systems that are resilient, giving options to exploit the decoupling of microservices to achieve a great resiliency and have fail-over solutions.</p>
</div>
</div>
<div class="sect3">
<h4 id="_reducing_complexity">Reducing complexity</h4>
<div class="paragraph">
<p>Because each microservice is a standalone component that communicates with other microservices through well-defined interfaces, developers can easily add new features or capabilities to the application by building and deploying additional microservices. This makes it possible to rapidly iterate and improve the application without having to make changes to the entire codebase.</p>
</div>
<div class="paragraph">
<p>Finally, microservices can be easier to test and maintain than monolithic applications. Because microservices are modular and self-contained, it is easier to test individual services and ensure that they are functioning correctly. Additionally, because each microservice has a specific role, it is easier to identify and fix issues when they arise, and to make changes to individual microservices without affecting the rest of the application.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="costOfMicroservices">The cost of microservices</h3>
<div class="paragraph">
<p>As you might expect, this doesn’t come without downsides. This is not a perfect fit for every situation. Microservices are a great architectural tool, but like every tool, you need to use them wisely.</p>
</div>
<div class="sect3">
<h4 id="_cost_of_infrastructure">Cost of infrastructure</h4>
<div class="paragraph">
<p>The first thing I would like to touch on, is the cost associated with running a microservice architecture. As you might have realized, running microservices come with a big resource overhead. Running multiple containers, each allocating resources for your language runtime (if applicable), running inside a Kubernetes cluster, that, by itself, will reserve some more resources for services, ingresses, internal DNS, will require more resources.
For a basic, low traffic service, with no requirements or low requirements on uptime, microservices will add significant cost to your infrastructure. Stick to a well-architected monolith, as you will not benefit from a microservice architecture.</p>
</div>
</div>
<div class="sect3">
<h4 id="_time_and_entry_barrier">Time and entry barrier</h4>
<div class="paragraph">
<p>Another aspect to microservices that can be a limiting factor to you, is the added complexity compared to a simple, heavy, monolithic application. You will both need a team architects that have the skill set and the knowledge to actually build a architecture that makes sense (which is not necessarily easy) and a team that can code in a "cloud-native" way, meaning they understand cloud patterns, how to build stateless applications, how to handle failures and how to define stable and sane APIs.
You will also need experts to monitor and identify problem with your infrastructure. Developers don’t typically now how to handle operations properly, you’ll need to hire someone with this knowledge to actually keep an eye on your logs, metrics and traces, giving an helping hand to developers that might need help.</p>
</div>
<div id="educateYourTeam" class="paragraph">
<p>These teams may need to adopt new tools, processes, and ways of working to support the development, deployment, and management of microservices. This can require significant training and organizational changes.</p>
</div>
</div>
<div class="sect3">
<h4 id="_migrating">Migrating</h4>
<div class="paragraph">
<p>The last point I would like to touch on, applies to teams and project which already have an application running, in the form of a monolith. The process of migration is bumpy, and will cause headaches.
Decomposing a monolithic application can be a complex and time-consuming process. It requires a deep understanding of the existing application and its dependencies, as well as careful planning to ensure that the resulting microservices are maintainable and scalable. There are tools you can use to ease this migration, such as the <a href="https://microservices.io/patterns/refactoring/strangler-application.html">strangler pattern</a>, which aims at destructuring your monolith and putting your business logic into microservices step by step, while putting the new features in their own microservice from the beginning.
However, this also requires educating your team, as mentioned <a href="#educateYourTeam">above</a>.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_does_it_really_makes_sense">Does it really makes sense ?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With that being said, we need to take a short time to stop and reconsider if migrating Polycode to microservices is actually worth it. Our current application structure and deployment scheme makes the migration easier than it would be with most of the monolith out there.
But as a company, you might see that this project is getting little to no traction, and would probably try to limit expenditure for a project that is not showing signs of growth. You could flip the problem the other way around, and say that you need to invest more to actually have growth, but this is risky, and adding new features is bad, but not too bad as of right now. The load is next to none, scalability is not a problem, and I would argue that we currently have enough flexibility if the project were to gain traction to scale the application enough to have the time to react and rethink our system.
I would even argue that this project is already too costly to run for what it is right now, architecture wise (although negligible at this scale) and employee wise. You would need developers that know how to build for the cloud, an operation employee to monitor and maintain your stack. Those are very expensive, and are a huge upfront investment that might yield no return.</p>
</div>
<div class="paragraph">
<p>Of course, all those considerations are out the window when you take into account that, we are not a company, but a group of students, working for free, with time to spare, longing for new technologies and complex systems. The downsides for us are negligible, and curiosity and the learning experience is worth it every step of the way.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wrap_up">Wrap up</h2>
<div class="sectionbody">
<div class="paragraph">
<p>With that being said, we will now dive and explore the microservices world. But before getting all technical, and before talking stacks, implementation, we first need to understand what we are working with, and how we can define our microservices in a sensible and maintainable way.</p>
</div>
</div>
</div>
<h1 id="_from_domains_to_microservices" class="sect0">From domains to microservices</h1>
<div class="sect1">
<h2 id="_introduction_2">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>It’s important to recognize the way you design you microservices will be reflected on the quality of your application. Poorly divided microservices will result in poor performance, poor maintainability, poor developer experience, and overall a bad user experience. If your data is poorly isolated, it will span multiple microservices and create an integrity and consistency mess. Make microservices too big and you lose the benefits. Make microservices too small and you begin to overload your network infrastructure, increase costs, decrease maintainability and increase the risk of bugs. Whatever your implementation, a poorly designed infrastructure will cause headaches. Let’s see how we can create a sensible microservice architecture, using Polycode as our use case.</p>
</div>
<div class="paragraph">
<p>The first step in decomposing your application into microservices is to understand the domain that it lives in. To make sure that everybody is on the same page, and to provide a common vocabulary for your engineers, marketing team, executive team, architects and whoever might be working on the project, we need to define the language that is used around your project.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ubiquitous_language">Ubiquitous Language</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The ubiquitous language is a common vocabulary everybody involved in the project should define together and use to communicate. The goal is to make sure that everybody refers to the same concept when talking about the project, reducing confusion and misunderstanding, avoiding conflicts and unnecessary discussion.</p>
</div>
<div class="paragraph">
<p>As the Polycode team, we defined the following vocabulary for the Polycode project. Please take some time to read through it, to make sure your understanding is aligned with mine.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Word</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Definition</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Practice</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A section of Polycode made to train users</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Assessment</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A section of Polycode made to evaluate user</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Admin</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A privileged user that have access and permission to manage all resources in Polycode.</p></td>