forked from X-Financial-Technologies/Library
-
Notifications
You must be signed in to change notification settings - Fork 0
/
payments-architecture.html
85 lines (85 loc) · 128 KB
/
payments-architecture.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
<!DOCTYPE html><html><head><meta charSet="utf-8"/><title>How Transaction Banking Implemented an Instant Payment Architecture for High-Throughput, Low-Latency and 24x7 Availability <!-- --> - Goldman Sachs Developer</title><link rel="icon" type="image/png" href="https://cdn.marquee.gs.com/developer/favicons/favicon-16x16.png" sizes="16x16"/><link rel="icon" type="image/png" href="https://cdn.marquee.gs.com/developer/favicons/favicon-32x32.png" sizes="32x32"/><link rel="icon" type="image/png" href="https://cdn.marquee.gs.com/developer/favicons/favicon-96x96.png" sizes="96x96"/><link rel="icon" type="image/png" href="https://cdn.marquee.gs.com/developer/favicons/favicon-128x128.png" sizes="128x128"/><link rel="icon" type="image/png" href="https://cdn.marquee.gs.com/developer/favicons/android-chrome-192x192.png" sizes="192x192"/><link rel="icon" type="image/png" href="https://cdn.marquee.gs.com/developer/favicons/favicon-196x196.png" sizes="196x196"/><link rel="apple-touch-icon" href="https://cdn.marquee.gs.com/developer/favicons/apple-touch-icon-180x180.png"/><meta name="viewport" content="width=device-width, minimum-scale=1.0, user-scalable=no"/><meta property="og:title" content="How Transaction Banking Implemented an Instant Payment Architecture for High-Throughput, Low-Latency and 24x7 Availability "/><meta property="og:url" content="https://developer.gs.com/posts/txb-instant-payments"/><meta property="og:type" content="website"/><meta property="og:description"/><meta property="og:image" content="https://cdn.marquee.gs.com/images/og-default.png"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="How Transaction Banking Implemented an Instant Payment Architecture for High-Throughput, Low-Latency and 24x7 Availability "/><script>window.GS_UX_UITOOLKIT_DISABLE_COMPONENT_ANALYTICS = true</script><script type="text/javascript">window.IE11_DENY = true</script><script src="/resources/browser-check.js" type="text/javascript"></script><meta name="next-head-count" content="20"/><link rel="preload" href="/blog/_next/static/css/533f9dc569514ab2.css" as="style"/><link rel="stylesheet" href="/blog/_next/static/css/533f9dc569514ab2.css" data-n-g=""/><link rel="preload" href="/blog/_next/static/css/0bf41b5e81ebd744.css" as="style"/><link rel="stylesheet" href="/blog/_next/static/css/0bf41b5e81ebd744.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/blog/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script defer="" src="/blog/_next/static/chunks/7b4f52cf.17a5ffc37549d3f1.js"></script><script defer="" src="/blog/_next/static/chunks/3eaf2e03.1994fbd54338a1a5.js"></script><script defer="" src="/blog/_next/static/chunks/468.6334c501cb9fa4cc.js"></script><script defer="" src="/blog/_next/static/chunks/218.5e2631774c37be45.js"></script><script defer="" src="/blog/_next/static/chunks/910.5321021dfd4bd086.js"></script><script defer="" src="/blog/_next/static/chunks/547.f16b877ef661692f.js"></script><script defer="" src="/blog/_next/static/chunks/588.b4005845ecd5318f.js"></script><script defer="" src="/blog/_next/static/chunks/351.24de2dd3d705673f.js"></script><script defer="" src="/blog/_next/static/chunks/424.266411467f763db6.js"></script><script defer="" src="/blog/_next/static/chunks/667.92acf2594d88b2c9.js"></script><script defer="" src="/blog/_next/static/chunks/439.37df03026e1bdf80.js"></script><script defer="" src="/blog/_next/static/chunks/568.0ea0881e48b4cd64.js"></script><script defer="" src="/blog/_next/static/chunks/140.563260a374191d19.js"></script><script defer="" src="/blog/_next/static/chunks/161.235a9be474d73586.js"></script><script defer="" src="/blog/_next/static/chunks/955.b13a4ad13313bc69.js"></script><script src="/blog/_next/static/chunks/webpack-0e15c30353cac20a.js" defer=""></script><script src="/blog/_next/static/chunks/framework-af64bd368ed34feb.js" defer=""></script><script src="/blog/_next/static/chunks/main-3ae76960099ad3d1.js" defer=""></script><script src="/blog/_next/static/chunks/pages/_app-dcdb5273abc13f8f.js" defer=""></script><script src="/blog/_next/static/chunks/699-060294938edc3a02.js" defer=""></script><script src="/blog/_next/static/chunks/pages/%5B...path%5D-697652dd6dba92e4.js" defer=""></script><script src="/blog/_next/static/2myHGwV71eGRI8ikbk0tc/_buildManifest.js" defer=""></script><script src="/blog/_next/static/2myHGwV71eGRI8ikbk0tc/_ssgManifest.js" defer=""></script><style data-emotion="gs-uitk-c 1svs1v0 14yrlwa 10u5nfu 12ixyq8 1a71sqq 17wcgys 61i80n x3u4z7 olhhen d3vjoo 1lha318 j1lscq 1jb2tuj 1obqoxt 1gh3a9x 1mgmlql 8uwjj1 1f55qs2 19b0qw2 6omac3 yw8qh1 16xlevb 1aud6jc 1ofbxu7 9xj45c 15bes5p 1edu59f 11rpxu6 tn142q ndfqmg 77ffgt jy1qjh 6kzp1z 1jlzgpk 6da07o 153owyk lz9316 13fg21n chpt2e 2jya4n--root-grid-root 1sq2860--root-grid-main 17sjox9--root-grid-main-child 1mqafeg--root-grid-last-main-child 1n8lxrm--root-grid-last-child 1hx5lac--grid-root 1ba8zsr--div j8fkow--div rii2qt--div 63ok9w--div 1d74ggx--heading-root--styled 1acod61--link-root--link-anchor--styled gqeuli--text-root--styled 1lj6q4i--link-root--link-anchor--styled 1cql1ps--div 2hbi3n--link-root--link-anchor--styled fwm1jg--text-root igh1yu--div 95dskp--grid-container gt0f15--grid-blog-heading 1jc78um--grid-rich-text 1nqcv7c--grid-container aimxmr--grid-horizontal-rule 147r7z9--grid-rich-text 1drs8qd--header 13ta4f9--header sc93ql--button-root--styled 1wvrdbx--button-button--ge-button m3wk8a 3929de reng5n--icon-content 1puy17n--icon-root--styled 1wr2u9h--h-6 orgmng--h-1 8kf9gl--text-root 1i2jj05--hr it7162--grid-image cw6l1u--div 157278q--img 1dx0648--div 1xj9nee--img--styled l0f0cg--div mlfcpw--grid-container 1xlpbyl--grid-rich-text-1731752237 1dcdpu7--grid-rich-text-756383909 1f5j81u--grid-rich-text-91351254 56jw5s--grid-rich-text-985533298 1990ojq--grid-rich-text-705544169 6kjypx--grid-image-88115746 khcjgj--grid-rich-text-1117754880 1shkbae--grid-image-734419347 b7kwqt--grid-rich-text-1509099583 16rn4ax--grid-rich-text-1581904046 1fmj1hr--grid-rich-text-1845797088 zjbly9--grid-rich-text-1171997878 if21je--grid-rich-text-1486936719">@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-thin.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-thin.woff") format("woff");font-weight:100;font-style:normal;}@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-light.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-light.woff") format("woff");font-weight:300;font-style:normal;}@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-regular.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-regular.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-regular-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-regular-italic.woff") format("woff");font-weight:400;font-style:italic;}@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-medium.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-medium.woff") format("woff");font-weight:500;font-style:normal;}@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-medium-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-medium-italic.woff") format("woff");font-weight:500;font-style:italic;}@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-bold.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-bold.woff") format("woff");font-weight:700;font-style:normal;}@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-bold-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-bold-italic.woff") format("woff");font-weight:700;font-style:italic;}@font-face{font-family:Goldman Sans;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-black.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-black.woff") format("woff");font-weight:900;font-style:normal;}@font-face{font-family:Goldman Sans Variable;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-variable.woff2") format("woff2");font-weight:1 999;font-style:normal;}@font-face{font-family:Goldman Sans Variable Italic;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-variable-italic.woff2") format("woff2");font-weight:1 999;font-style:normal;}@font-face{font-family:Roboto Mono;src:url("https://cdn.gs.com/fonts/roboto-mono/v1/roboto-mono-regular.woff2") format("woff2"),url("https://cdn.gs.com/fonts/roboto-mono/v1/roboto-mono-regular.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Roboto Mono Italic;src:url("https://cdn.gs.com/fonts/roboto-mono/v1/roboto-mono-regular-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/roboto-mono/v1/roboto-mono-regular-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Roboto Mono Medium;src:url("https://cdn.gs.com/fonts/roboto-mono/v1/roboto-mono-medium.woff2") format("woff2"),url("https://cdn.gs.com/fonts/roboto-mono/v1/roboto-mono-medium.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Roboto Mono Medium Italic;src:url("https://cdn.gs.com/fonts/roboto-mono/v1/roboto-mono-medium-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/roboto-mono/v1/roboto-mono-medium-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Sabon;src:url("https://cdn.gs.com/fonts/sabon/v1/sabon.woff2") format("woff2"),url("https://cdn.gs.com/fonts/sabon/v1/sabon.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Sabon Italic;src:url("https://cdn.gs.com/fonts/sabon/v1/sabon-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/sabon/v1/sabon-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Sabon Bold;src:url("https://cdn.gs.com/fonts/sabon/v1/sabon-bold.woff2") format("woff2"),url("https://cdn.gs.com/fonts/sabon/v1/sabon-bold.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Sabon Bold Italic;src:url("https://cdn.gs.com/fonts/sabon/v1/sabon-bold-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/sabon/v1/sabon-bold-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis;src:url("https://cdn.gs.com/fonts/basis/v1/basis-regular.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-regular.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Italic;src:url("https://cdn.gs.com/fonts/basis/v1/basis-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Bold;src:url("https://cdn.gs.com/fonts/basis/v1/basis-bold.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-bold.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Bold Italic;src:url("https://cdn.gs.com/fonts/basis/v1/basis-bold-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-bold-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Light;src:url("https://cdn.gs.com/fonts/basis/v1/basis-light.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-light.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Light Italic;src:url("https://cdn.gs.com/fonts/basis/v1/basis-light-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-light-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Medium;src:url("https://cdn.gs.com/fonts/basis/v1/basis-medium.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-medium.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Medium Italic;src:url("https://cdn.gs.com/fonts/basis/v1/basis-medium-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-medium-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Off White;src:url("https://cdn.gs.com/fonts/basis/v1/basis-off-white.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-off-white.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Off White Italic;src:url("https://cdn.gs.com/fonts/basis/v1/basis-off-white-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-off-white-italic.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Mono Regular;src:url("https://cdn.gs.com/fonts/basis/v1/basis-mono-regular.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-mono-regular.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Basis Mono Medium;src:url("https://cdn.gs.com/fonts/basis/v1/basis-mono-medium.woff2") format("woff2"),url("https://cdn.gs.com/fonts/basis/v1/basis-mono-medium.woff") format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Goldman Sans Thin;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-thin.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-thin.woff") format("woff");font-weight:100;font-style:normal;}@font-face{font-family:Goldman Sans Light;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-light.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-light.woff") format("woff");font-weight:300;font-style:normal;}@font-face{font-family:Goldman Sans Italic;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-regular-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-regular-italic.woff") format("woff");font-weight:400;font-style:italic;}@font-face{font-family:Goldman Sans Medium;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-medium.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-medium.woff") format("woff");font-weight:500;font-style:normal;}@font-face{font-family:Goldman Sans Medium Italic;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-medium-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-medium-italic.woff") format("woff");font-weight:500;font-style:italic;}@font-face{font-family:Goldman Sans Bold;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-bold.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-bold.woff") format("woff");font-weight:700;font-style:normal;}@font-face{font-family:Goldman Sans Bold Italic;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-bold-italic.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-bold-italic.woff") format("woff");font-weight:700;font-style:italic;}@font-face{font-family:Goldman Sans Black;src:url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-black.woff2") format("woff2"),url("https://cdn.gs.com/fonts/goldman-sans/v1/goldman-sans-black.woff") format("woff");font-weight:900;font-style:normal;}.gs-uitk-c-2jya4n--root-grid-root{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;}.gs-uitk-c-1sq2860--root-grid-main{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.gs-uitk-c-17sjox9--root-grid-main-child{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.gs-uitk-c-1mqafeg--root-grid-last-main-child{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.gs-uitk-c-1n8lxrm--root-grid-last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.gs-uitk-c-1hx5lac--grid-root{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;height:100%;background-color:#FFFFFF;}.gs-uitk-c-1ba8zsr--div{background:#000000;width:100%;}.gs-uitk-c-j8fkow--div{margin:0 auto;max-width:1200px;padding:56px 64px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;overflow:hidden;}.gs-uitk-c-rii2qt--div{display:grid;grid-template-columns:1fr 2fr 1fr;}.gs-uitk-c-63ok9w--div{padding:8px;}.gs-uitk-c-1d74ggx--heading-root--styled{margin-top:0px;margin-bottom:0px;display:block;overflow-wrap:break-word;word-break:break-word;min-width:1px;font-family:"Goldman Sans",Helvetica,Arial,sans-serif;font-weight:500;font-size:16px;line-height:24px;letter-spacing:0;color:inherit;opacity:1;font-style:inherit;word-break:initial;overflow-wrap:initial;margin-bottom:16px;color:#ffffff;}.gs-uitk-c-1acod61--link-root--link-anchor--styled{-webkit-text-decoration:none;text-decoration:none;border-radius:1px;font-size:16px;font-family:inherit;}.gs-uitk-c-1acod61--link-root--link-anchor--styled >[data-gs-uitk-component='icon']:first-child:not(:only-child){padding-right:4px;font-size:16px;vertical-align:sub;}.gs-uitk-c-1acod61--link-root--link-anchor--styled >[data-gs-uitk-component='icon']:last-child:not(:only-child){padding-left:4px;font-size:16px;vertical-align:sub;}.gs-uitk-c-1acod61--link-root--link-anchor--styled:focus{color:#186ade;outline:none;box-shadow:0 0 0 1px #186ade,0 0 0 1px #186ade;}.gs-uitk-c-1acod61--link-root--link-anchor--styled:link{color:#186ade;}.gs-uitk-c-1acod61--link-root--link-anchor--styled:hover{color:#0d4ea6;}.gs-uitk-c-1acod61--link-root--link-anchor--styled:active{color:#0d4ea6;}.gs-uitk-c-1acod61--link-root--link-anchor--styled:visited{color:#6b30ab;}.gs-uitk-c-1acod61--link-root--link-anchor--styled:link{color:#ffffff;}.gs-uitk-c-1acod61--link-root--link-anchor--styled:visited{color:#ffffff;}.gs-uitk-c-1acod61--link-root--link-anchor--styled:hover{-webkit-text-decoration:underline;text-decoration:underline;}.gs-uitk-c-gqeuli--text-root--styled{margin-top:0px;margin-bottom:0px;display:inline-block;overflow-wrap:break-word;word-break:break-word;min-width:1px;font-family:"Goldman Sans",Helvetica,Arial,sans-serif;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0;color:inherit;font-style:inherit;opacity:1;typography:body02;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled{-webkit-text-decoration:none;text-decoration:none;border-radius:1px;display:block;margin-bottom:4px;font-size:16px;padding:8px 0px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled >[data-gs-uitk-component='icon']:first-child:not(:only-child){padding-right:4px;font-size:16px;vertical-align:sub;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled >[data-gs-uitk-component='icon']:last-child:not(:only-child){padding-left:4px;font-size:16px;vertical-align:sub;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:focus{color:#186ade;outline:none;box-shadow:0 0 0 1px #186ade,0 0 0 1px #186ade;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:link{color:#186ade;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:hover{color:#0d4ea6;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:active{color:#0d4ea6;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:visited{color:#6b30ab;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:focus{box-shadow:none;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:link{color:#9fb1bd;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:visited{color:#9fb1bd;}.gs-uitk-c-1lj6q4i--link-root--link-anchor--styled:hover{-webkit-text-decoration:underline;text-decoration:underline;}.gs-uitk-c-1cql1ps--div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:24px;margin-top:68px;margin-bottom:2rem;padding-top:12px;border-top:1px solid #7a909e;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled{-webkit-text-decoration:none;text-decoration:none;border-radius:1px;font-size:16px;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled >[data-gs-uitk-component='icon']:first-child:not(:only-child){padding-right:4px;font-size:16px;vertical-align:sub;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled >[data-gs-uitk-component='icon']:last-child:not(:only-child){padding-left:4px;font-size:16px;vertical-align:sub;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled:focus{color:#186ade;outline:none;box-shadow:0 0 0 1px #186ade,0 0 0 1px #186ade;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled:link{color:#186ade;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled:hover{color:#0d4ea6;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled:active{color:#0d4ea6;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled:visited{color:#6b30ab;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled:link{color:#7681fc;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled:visited{color:#7681fc;}.gs-uitk-c-2hbi3n--link-root--link-anchor--styled:hover{-webkit-text-decoration:underline;text-decoration:underline;}.gs-uitk-c-fwm1jg--text-root{margin-top:0px;margin-bottom:0px;display:inline-block;overflow-wrap:break-word;word-break:break-word;min-width:1px;font-family:"Goldman Sans",Helvetica,Arial,sans-serif;font-weight:400;font-size:12px;line-height:16px;letter-spacing:0;color:inherit;font-style:inherit;opacity:1;}.gs-uitk-c-igh1yu--div{font-size:12px;line-height:16px;color:#9fb1bd;margin-top:1rem;}.gs-uitk-c-95dskp--grid-container{width:100%;max-width:1200px;display:grid;-webkit-align-content:start;-ms-flex-line-pack:start;align-content:start;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;}@media (max-width: 767px){.gs-uitk-c-95dskp--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(1, auto);margin:96px 32px 0px 32px;padding:0px;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-95dskp--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(1, auto);margin:128px 64px 0px 64px;padding:0px;}}@media (min-width: 1023px){.gs-uitk-c-95dskp--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(1, auto);margin:128px 64px 0px 64px;padding:0px;}}.gs-uitk-c-gt0f15--grid-blog-heading{display:none;}@media (min-width: 1023px){.gs-uitk-c-gt0f15--grid-blog-heading{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-gt0f15--grid-blog-heading{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-gt0f15--grid-blog-heading{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}.gs-uitk-c-1jc78um--grid-rich-text{display:none;}@media (min-width: 1023px){.gs-uitk-c-1jc78um--grid-rich-text{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-1jc78um--grid-rich-text{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-1jc78um--grid-rich-text{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}.gs-uitk-c-1nqcv7c--grid-container{width:100%;max-width:1200px;display:grid;-webkit-align-content:start;-ms-flex-line-pack:start;align-content:start;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;}@media (max-width: 767px){.gs-uitk-c-1nqcv7c--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(2, auto);margin:0px 32px 32px 32px;padding:0xp;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-1nqcv7c--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(2, auto);margin:0px 64px 64px 64px;padding:0px;}}@media (min-width: 1023px){.gs-uitk-c-1nqcv7c--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(2, auto);margin:0px 64px 64px 64px;padding:0px;}}.gs-uitk-c-aimxmr--grid-horizontal-rule{display:none;}@media (min-width: 1023px){.gs-uitk-c-aimxmr--grid-horizontal-rule{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-aimxmr--grid-horizontal-rule{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-aimxmr--grid-horizontal-rule{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:1;grid-row-end:span 1;width:100%;}}.gs-uitk-c-147r7z9--grid-rich-text{display:none;}@media (min-width: 1023px){.gs-uitk-c-147r7z9--grid-rich-text{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:2;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-147r7z9--grid-rich-text{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:2;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-147r7z9--grid-rich-text{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:2;grid-row-end:span 1;width:100%;}}.gs-uitk-c-1drs8qd--header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.gs-uitk-c-13ta4f9--header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-bottom:24px;}.gs-uitk-c-sc93ql--button-root--styled{display:inline-block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.gs-uitk-c-sc93ql--button-root--styled [data-cy="gs-uitk-button__button"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 10px 14px 10px;}.gs-uitk-c-sc93ql--button-root--styled [data-cy="gs-uitk-button__button"] span{position:relative;bottom:1px;font-size:0.875rem;line-height:0.875rem;}.gs-uitk-c-1wvrdbx--button-button--ge-button{display:inline-block;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;position:relative;box-sizing:border-box;width:100%;height:32px;border-radius:18px;font-family:"Goldman Sans",Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0;background:#186ade;color:#ffffff;padding:6px 0px;border:0px;color:#306AFF;font-family:Basis Off White;font-size:0.875rem;line-height:0.875rem;letter-spacing:0rem;border-radius:30px;padding:14px 30px;height:auto;background:#F2F5F7;}.gs-uitk-c-1wvrdbx--button-button--ge-button:before{border-radius:18px;border:1px solid transparent;top:0;bottom:0;right:0;left:0;content:"";position:absolute;display:block;-webkit-transition:border-color 0.15s ease-in-out,border-radius 0.15s ease-in-out,top 0.15s ease-in-out,right 0.15s ease-in-out,bottom 0.15s ease-in-out,left 0.15s ease-in-out;transition:border-color 0.15s ease-in-out,border-radius 0.15s ease-in-out,top 0.15s ease-in-out,right 0.15s ease-in-out,bottom 0.15s ease-in-out,left 0.15s ease-in-out;}.gs-uitk-c-1wvrdbx--button-button--ge-button:hover:not(:disabled){background:#1660c9;}.gs-uitk-c-1wvrdbx--button-button--ge-button:disabled{opacity:0.3;cursor:not-allowed;}.gs-uitk-c-1wvrdbx--button-button--ge-button:not(:disabled):active{color:#ffffff;background:#1456b4;}.gs-uitk-c-1wvrdbx--button-button--ge-button:not(:disabled):active:focus-visible:before{border-radius:18px;border:1px solid transparent;top:0;bottom:0;right:0;left:0;}.gs-uitk-c-1wvrdbx--button-button--ge-button:focus-visible{background-color:#186ade;color:#ffffff;outline:0;box-shadow:none;}.gs-uitk-c-1wvrdbx--button-button--ge-button:focus-visible:before{border-radius:18px;border-color:#186ade;top:-2px;bottom:-2px;right:-2px;left:-2px;}.gs-uitk-c-1wvrdbx--button-button--ge-button [data-gs-uitk-component="icon"]{font-size:20px;}.gs-uitk-c-1wvrdbx--button-button--ge-button >:only-child:not([data-gs-uitk-component='icon']){padding-left:calc(16px - 0px);padding-right:calc(16px - 0px);}.gs-uitk-c-1wvrdbx--button-button--ge-button >[data-gs-uitk-component='icon']:only-child{padding-left:calc(6px - 0px);padding-right:calc(6px - 0px);}.gs-uitk-c-1wvrdbx--button-button--ge-button >[data-gs-uitk-component='icon']:first-child:not(:only-child){padding-left:8px;padding-right:6px;}.gs-uitk-c-1wvrdbx--button-button--ge-button >:last-child:not(:only-child):not([data-gs-uitk-component='icon']){padding-right:16px;}.gs-uitk-c-1wvrdbx--button-button--ge-button >:not([data-gs-uitk-component='icon']):first-child:not(:only-child){padding-left:16px;}.gs-uitk-c-1wvrdbx--button-button--ge-button >[data-gs-uitk-component='icon']:last-child:not(:only-child){padding-left:6px;padding-right:8px;}.gs-uitk-c-1wvrdbx--button-button--ge-button:focus::before{border-radius:30px;}.gs-uitk-c-1wvrdbx--button-button--ge-button >:only-child:not([data-gs-uitk-component="icon"]){padding:0px!important;}.gs-uitk-c-1wvrdbx--button-button--ge-button:not(:disabled):hover{color:#306AFF;background:#DCE3E8;}.gs-uitk-c-1wvrdbx--button-button--ge-button:not(:disabled):active{color:#306AFF;background:#DCE3E8;}.gs-uitk-c-1wvrdbx--button-button--ge-button:focus{color:#306AFF;background:#F2F5F7;}@font-face{font-family:Material Symbols Outlined;src:url("https://cdn.gs.com/fonts/gs-ux-uitoolkit-icons/v7/material-symbols-outlined/material-symbols-outlined.woff2") format("woff2");font-weight:900;font-style:normal;}@font-face{font-family:CustomIcons;src:url("https://cdn.gs.com/fonts/gs-ux-uitoolkit-icons/v7/custom-icons/custom-icons.woff2") format("woff2"),url("https://cdn.gs.com/fonts/gs-ux-uitoolkit-icons/v7/custom-icons/custom-icons.woff") format("woff");font-weight:900;font-style:normal;}.gs-uitk-c-reng5n--icon-content{display:inline-block;}.gs-uitk-c-1puy17n--icon-root--styled{font-style:normal;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;font-feature-settings:"liga";-webkit-font-feature-settings:"liga";-moz-font-feature-settings:"liga";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Material Symbols Outlined;font-weight:900;font-size:20px;vertical-align:bottom;font-variation-settings:'FILL' 1,'wght' 300,'GRAD' 0,'opsz' 24;width:20px;height:20px;visibility:hidden;color:#000000;font-weight:900;}.gs-uitk-icon-font-loading-material-symbols-outlined .gs-uitk-c-1puy17n--icon-root--styled{visibility:hidden;width:20px;height:20px;}.gs-uitk-c-1wr2u9h--h-6{font-family:Basis Off White;font-size:0.875rem;line-height:1.25rem;color:#3E5463;margin:8px 0;}.gs-uitk-c-orgmng--h-1{font-family:Basis Off White;font-size:3rem;line-height:3.5rem;color:#1C2B36;margin:8px 0;}.gs-uitk-c-8kf9gl--text-root{font-family:Basis Off White;font-size:0.875rem;line-height:1.5rem;color:#1C2B36;}.gs-uitk-c-8kf9gl--text-root .basisOffWhite{font-family:Basis Off White;}.gs-uitk-c-8kf9gl--text-root .basisOffWhiteItalic{font-family:Basis Off White Italic;}.gs-uitk-c-8kf9gl--text-root .basisLight{font-family:Basis Light;}.gs-uitk-c-8kf9gl--text-root .basisLightItalic{font-family:Basis Light Italic;}.gs-uitk-c-8kf9gl--text-root .basisMedium{font-family:Basis Medium;}.gs-uitk-c-8kf9gl--text-root .basisMediumItalic{font-family:Basis Medium Italic;}.gs-uitk-c-8kf9gl--text-root .basisMonoRegular{font-family:Basis Mono Regular;}.gs-uitk-c-8kf9gl--text-root .basisMonoMedium{font-family:Basis Mono Medium;}.gs-uitk-c-8kf9gl--text-root .code{font-family:Basis Mono Regular;font-size:0.875rem;line-height:1.75rem;color:#1C2B36;background-color:#DCE3E8;word-spacing:normal;word-break:break-word;white-space:pre-wrap;padding:0.15rem;}.gs-uitk-c-8kf9gl--text-root .colorPrimaryText{color:#1C2B36;}.gs-uitk-c-8kf9gl--text-root .colorPrimaryText a{text-decoration-color:inherit;}.gs-uitk-c-8kf9gl--text-root .colorPrimaryText a:visited{color:inherit;}.gs-uitk-c-8kf9gl--text-root .colorSecondaryText{color:#3E5463;}.gs-uitk-c-8kf9gl--text-root .colorSecondaryText a{text-decoration-color:inherit;}.gs-uitk-c-8kf9gl--text-root .colorSecondaryText a:visited{color:inherit;}.gs-uitk-c-8kf9gl--text-root .colorTertiaryText{color:#747576;}.gs-uitk-c-8kf9gl--text-root .colorTertiaryText a{text-decoration-color:inherit;}.gs-uitk-c-8kf9gl--text-root .colorTertiaryText a:visited{color:inherit;}.gs-uitk-c-8kf9gl--text-root .noUnderline{-webkit-text-decoration:none;text-decoration:none;}.gs-uitk-c-8kf9gl--text-root .noUnderline a{-webkit-text-decoration:none;text-decoration:none;}.gs-uitk-c-8kf9gl--text-root .underline{-webkit-text-decoration:underline;text-decoration:underline;}.gs-uitk-c-8kf9gl--text-root p{font-family:Basis Off White;font-size:0.875rem;line-height:1.5rem;margin:24px 0;overflow-wrap:break-word;}.gs-uitk-c-8kf9gl--text-root h1{font-family:Basis Off White;font-size:3rem;line-height:3.5rem;margin:8px 0;}.gs-uitk-c-8kf9gl--text-root h2{font-family:Basis Off White;font-size:2.625rem;line-height:2.625rem;margin:8px 0;}.gs-uitk-c-8kf9gl--text-root h3{font-family:Basis Off White;font-size:2.25rem;line-height:2.625rem;margin:8px 0;}.gs-uitk-c-8kf9gl--text-root h4{font-family:Basis Off White;font-size:2rem;line-height:2.5rem;margin:8px 0;}.gs-uitk-c-8kf9gl--text-root h5{font-family:Basis Off White;font-size:1.5rem;line-height:1.75rem;margin:8px 0;}.gs-uitk-c-8kf9gl--text-root h6{font-family:Basis Off White;font-size:0.875rem;line-height:1.25rem;margin:8px 0;}.gs-uitk-c-8kf9gl--text-root pre{font-family:Basis Mono Regular;font-size:0.875rem;line-height:1.5rem;color:#1C2B36;background-color:#DCE3E8;padding:1rem;overflow:auto;}.gs-uitk-c-8kf9gl--text-root i{font-family:Basis Off White Italic;font-style:normal;}.gs-uitk-c-8kf9gl--text-root b{font-family:Basis Medium;font-weight:normal;}.gs-uitk-c-8kf9gl--text-root ol{list-style-type:decimal;}.gs-uitk-c-8kf9gl--text-root ul{list-style-type:disc;}.gs-uitk-c-8kf9gl--text-root a{font-family:Basis Off White;font-size:0.875rem;line-height:1.5rem;color:#306AFF;-webkit-text-decoration:none;text-decoration:none;}.gs-uitk-c-8kf9gl--text-root a a{text-decoration-color:inherit;}.gs-uitk-c-8kf9gl--text-root a a:visited{color:inherit;}.gs-uitk-c-1i2jj05--hr{border:none;height:1px;margin-top:1.5rem;margin-bottom:1.5rem;padding:0px;background-color:#C1CCD6;}.gs-uitk-c-it7162--grid-image{display:none;}@media (min-width: 1023px){.gs-uitk-c-it7162--grid-image{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:4;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-it7162--grid-image{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:4;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-it7162--grid-image{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:4;grid-row-end:span 1;width:100%;}}.gs-uitk-c-cw6l1u--div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;overflow:hidden;}.gs-uitk-c-157278q--img{object-fit:cover;width:100%;height:100%;background-color:transparent;}.gs-uitk-c-1dx0648--div{display:none;z-index:999;top:0;left:0;right:0;bottom:0;padding:1rem;background:rgba(0, 0, 0, 0.925);}.gs-uitk-c-1xj9nee--img--styled{object-fit:cover;width:100%;height:100%;background-color:transparent;object-fit:contain;width:100%;height:100%;background-color:transparent;}.gs-uitk-c-l0f0cg--div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;background:transparent;border-radius:1.25rem;}.gs-uitk-c-mlfcpw--grid-container{width:100%;max-width:1200px;display:grid;-webkit-align-content:start;-ms-flex-line-pack:start;align-content:start;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;}@media (max-width: 767px){.gs-uitk-c-mlfcpw--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(15, auto);margin:0px 32px 0px 32px;padding:0px;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-mlfcpw--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(15, auto);margin:0px 64px 0px 64px;padding:0px;}}@media (min-width: 1023px){.gs-uitk-c-mlfcpw--grid-container{grid-template-columns:repeat(12, 1fr);grid-template-rows:repeat(15, auto);margin:0px 64px 0px 64px;padding:0px;}}.gs-uitk-c-1xlpbyl--grid-rich-text-1731752237{display:none;}@media (min-width: 1023px){.gs-uitk-c-1xlpbyl--grid-rich-text-1731752237{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:2;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-1xlpbyl--grid-rich-text-1731752237{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:2;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-1xlpbyl--grid-rich-text-1731752237{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:2;grid-row-end:span 1;width:100%;}}.gs-uitk-c-1dcdpu7--grid-rich-text-756383909{display:none;}@media (min-width: 1023px){.gs-uitk-c-1dcdpu7--grid-rich-text-756383909{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:3;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-1dcdpu7--grid-rich-text-756383909{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:3;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-1dcdpu7--grid-rich-text-756383909{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:3;grid-row-end:span 1;width:100%;}}.gs-uitk-c-1f5j81u--grid-rich-text-91351254{display:none;}@media (min-width: 1023px){.gs-uitk-c-1f5j81u--grid-rich-text-91351254{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:5;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-1f5j81u--grid-rich-text-91351254{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:5;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-1f5j81u--grid-rich-text-91351254{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:5;grid-row-end:span 1;width:100%;}}.gs-uitk-c-56jw5s--grid-rich-text-985533298{display:none;}@media (min-width: 1023px){.gs-uitk-c-56jw5s--grid-rich-text-985533298{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:6;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-56jw5s--grid-rich-text-985533298{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:6;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-56jw5s--grid-rich-text-985533298{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:6;grid-row-end:span 1;width:100%;}}.gs-uitk-c-1990ojq--grid-rich-text-705544169{display:none;}@media (min-width: 1023px){.gs-uitk-c-1990ojq--grid-rich-text-705544169{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:7;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-1990ojq--grid-rich-text-705544169{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:7;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-1990ojq--grid-rich-text-705544169{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:7;grid-row-end:span 1;width:100%;}}.gs-uitk-c-6kjypx--grid-image-88115746{display:none;}@media (min-width: 1023px){.gs-uitk-c-6kjypx--grid-image-88115746{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:8;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-6kjypx--grid-image-88115746{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:8;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-6kjypx--grid-image-88115746{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:8;grid-row-end:span 1;width:100%;}}.gs-uitk-c-khcjgj--grid-rich-text-1117754880{display:none;}@media (min-width: 1023px){.gs-uitk-c-khcjgj--grid-rich-text-1117754880{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:9;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-khcjgj--grid-rich-text-1117754880{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:9;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-khcjgj--grid-rich-text-1117754880{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:9;grid-row-end:span 1;width:100%;}}.gs-uitk-c-1shkbae--grid-image-734419347{display:none;}@media (min-width: 1023px){.gs-uitk-c-1shkbae--grid-image-734419347{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:10;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-1shkbae--grid-image-734419347{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:10;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-1shkbae--grid-image-734419347{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:10;grid-row-end:span 1;width:100%;}}.gs-uitk-c-b7kwqt--grid-rich-text-1509099583{display:none;}@media (min-width: 1023px){.gs-uitk-c-b7kwqt--grid-rich-text-1509099583{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:11;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-b7kwqt--grid-rich-text-1509099583{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:11;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-b7kwqt--grid-rich-text-1509099583{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:11;grid-row-end:span 1;width:100%;}}.gs-uitk-c-16rn4ax--grid-rich-text-1581904046{display:none;}@media (min-width: 1023px){.gs-uitk-c-16rn4ax--grid-rich-text-1581904046{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:12;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-16rn4ax--grid-rich-text-1581904046{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:12;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-16rn4ax--grid-rich-text-1581904046{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:12;grid-row-end:span 1;width:100%;}}.gs-uitk-c-1fmj1hr--grid-rich-text-1845797088{display:none;}@media (min-width: 1023px){.gs-uitk-c-1fmj1hr--grid-rich-text-1845797088{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:13;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-1fmj1hr--grid-rich-text-1845797088{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:13;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-1fmj1hr--grid-rich-text-1845797088{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:13;grid-row-end:span 1;width:100%;}}.gs-uitk-c-zjbly9--grid-rich-text-1171997878{display:none;}@media (min-width: 1023px){.gs-uitk-c-zjbly9--grid-rich-text-1171997878{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:14;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-zjbly9--grid-rich-text-1171997878{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:14;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-zjbly9--grid-rich-text-1171997878{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:14;grid-row-end:span 1;width:100%;}}.gs-uitk-c-if21je--grid-rich-text-1486936719{display:none;}@media (min-width: 1023px){.gs-uitk-c-if21je--grid-rich-text-1486936719{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:15;grid-row-end:span 1;width:100%;}}@media (min-width: 767px) and (max-width: 1023px){.gs-uitk-c-if21je--grid-rich-text-1486936719{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:15;grid-row-end:span 1;width:100%;}}@media (max-width: 767px){.gs-uitk-c-if21je--grid-rich-text-1486936719{display:block;grid-column-start:1;grid-column-end:span 12;grid-row-start:15;grid-row-end:span 1;width:100%;}}</style></head><body><div id="__next"><!--$--><!--/$--><div class="page-root"><!--$--><div class="gs-uitk-c-2jya4n--root-grid-root"><div class="gs-uitk-c-1sq2860--root-grid-main"><div class="gs-uitk-c-17sjox9--root-grid-main-child"><!--$--><!--/$--></div><div class="gs-uitk-c-17sjox9--root-grid-main-child"><!--$!--><template data-dgst="DYNAMIC_SERVER_USAGE"></template><!--/$--></div><div class="gs-uitk-c-17sjox9--root-grid-main-child"><!--$--><div class="gs-uitk-c-1hx5lac--grid-root"><div class="gs-uitk-c-95dskp--grid-container"><div class="gs-uitk-c-gt0f15--grid-blog-heading"><!--$--><header class="gs-uitk-c-1drs8qd--header"><header class="gs-uitk-c-13ta4f9--header"><a href="/blog/posts" target="_self" tabindex="-1" style="text-decoration:none"><span data-cy="blog-heading-back-button" data-gs-uitk-component="button" data-action-type="primary" data-emphasis="bold" class="gs-button gs-uitk-c-sc93ql--button-root--styled"><button data-cy="gs-uitk-button__button" data-action-type="primary" data-emphasis="bold" data-size="md" data-shape="circle" data-status="none" data-active="false" class="gs-button__button gs-uitk-c-1wvrdbx--button-button--ge-button" type="button" name="" value=""><span role="img" aria-label="Arrow Back" data-gs-uitk-component="icon" data-size="md" data-type="filled" data-spin="false" data-pulse="false" class="gs-icon gs-uitk-c-1puy17n--icon-root--styled"><span data-cy="gs-uitk-icon__content" class="gs-uitk-c-reng5n--icon-content" role="img" aria-hidden="true">arrow_back</span></span><span>Return to Developer Blog</span></button></span></a></header><header class="gs-uitk-c-1drs8qd--header"><h6 data-cy="blog-heading-date" class="gs-uitk-c-1wr2u9h--h-6">July 9, 2024</h6><h1 data-cy="blog-heading-title" class="gs-uitk-c-orgmng--h-1">How Transaction Banking Implemented an Instant Payment Architecture for High-Throughput, Low-Latency and 24x7 Availability </h1><h6 data-cy="blog-heading-authors" class="gs-uitk-c-1wr2u9h--h-6">Shahin M. Shahin, Vice President and Tech Fellow; Krishna Yalamanchi, Vice President</h6></header></header><!--/$--></div></div></div><!--/$--></div><div class="gs-uitk-c-17sjox9--root-grid-main-child"><!--$--><div class="gs-uitk-c-1hx5lac--grid-root"><div class="gs-uitk-c-mlfcpw--grid-container"><div class="gs-uitk-c-1jc78um--grid-rich-text"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4>Introduction</h4>
<p>At Goldman Sachs, payments processing sits at the heart of our <a href="https://developer.gs.com/discover/txb">Transaction Banking (TxB)</a> business. This post will focus on one of TxB’s services that enables instant payments for our corporate clients. First, we will give a high-level overview and present technical challenges associated with instant payments. We will then provide an explanation of the technical architecture, focusing on how TxB utilizes various products and services offered by Amazon Web Services (AWS) to achieve a highly scalable architecture with millisecond latency per transaction and 24x7 availability. </p>
</div><!--/$--></div><div class="gs-uitk-c-1xlpbyl--grid-rich-text-1731752237"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4>What is an Instant Payment?</h4>
<p>An instant payment (also called a real-time payment) is any payment that settles between both the sender and the recipient within a few seconds and enables the near instantaneous transfer of funds between two bank accounts. An example of an instant payment is when one company pays another company immediately upon delivery of a product. The receiving company may release the product only after confirmation that the payment has been received.</p>
<p>An advantage of an instant payment scheme over a batch-based payments scheme (e.g., ACH payments) is that some batch-based payment schemes may take days to settle funds. Instant payments require greater throughput, lower latency, and higher availability of computing systems vs. these other payment schemes and are typically available 24x7x365 and can run across multiple platforms (e.g., mobile devices or traditional computing devices such as computers or laptops).</p>
<p>According to a <a href="https://fedpaymentsimprovement.org/news/blog/study-growing-usage-underscores-business-and-consumer-appetite-for-faster-payment-options/">study from the Federal Reserve</a>, 80% of businesses in the United States are using a method of faster payments. As a result, there is significant demand for advanced technical solutions such as reliable payment processing infrastructure and scalable cloud-based platforms capable of handling high payments volumes. Instant payments create opportunities for innovative services and applications, pushing businesses to adopt advanced technologies to meet corporate demands for fast, secure, and seamless payment transactions.</p>
</div><!--/$--></div><div class="gs-uitk-c-1dcdpu7--grid-rich-text-756383909"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4>High-Level Instant Payments Flow</h4>
<p>There are five main actors involved in a typical instant payment processing scheme:</p>
<ul>
<li>The Sender of the Payment</li>
<li>The Sender’s Bank</li>
<li>The Payment Exchange Network</li>
<li>The Recipient’s Bank</li>
<li>The Receiver of the Payment</li>
</ul>
<p>The high-level diagram below illustrates how an instant payment flows between sender and receiver.</p>
</div><!--/$--></div><div class="gs-uitk-c-it7162--grid-image"><!--$--><div class="gs-uitk-c-cw6l1u--div"><div class="gs-uitk-c-l0f0cg--div"><img data-cy="styled-image" src="/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog3.png" class="gs-uitk-c-157278q--img"/></div><div id="" style="position:fixed" class="gs-uitk-c-1dx0648--div"><img data-cy="lightbox-image" src="/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog3.png" class="gs-uitk-c-1xj9nee--img--styled"/></div></div><!--/$--></div><div class="gs-uitk-c-1f5j81u--grid-rich-text-91351254"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><p>In the illustration above, both the sender and the receiver happen to be corporate entities; however, nothing in the above flow precludes either actor from being individual consumers, government entities or other banks.</p>
<p>Most notably, the sending and receiving banks are where TxB plays the pivotal role of facilitating any instant payment transaction. TxB may act as both a sender and receiver of instant payments. This role is critical for interfacing with the Payment Exchange Network. TxB must ensure latency is minimized, and high throughput and high availability are achieved when payments are settled between these actors.<b></b></p>
</div><!--/$--></div><div class="gs-uitk-c-56jw5s--grid-rich-text-985533298"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4>Technical and Functional Challenges Associated with Instant Payments</h4>
<p>One of the biggest challenges in instant payments processing is that funds are required to move (also called settlement) between sender and receiver through a Payment Exchange Network within seconds. Once the payment is settled, the payment is considered final and irrevocable.</p>
<p>As stated above, the three primary goals of any instant payment technology solution are as follows:</p>
<ul>
<li><u>High Throughput</u>: Instant payment processing typically occurs at peak times. Examples of peak processing times include:<ul>
<li>Certain days during the month, year, or quarter: for example, corporates paying their contractors or employees.</li>
<li>Certain times during the day: for example, corporates managing their liquidity needs by settling funds among their various bank accounts held at other banks intraday.</li>
</ul>
</li>
<li><u>Low Latency</u>: due to the strict settlement requirements of instant payments, any individual payment must be settled in (typically) under 15 seconds. This includes debiting the funds from the sender's account and crediting the funds into the receiver's account. The settlement of funds includes the Sender Bank and the Recipient Bank performing due diligence on the payments to ensure fraud or other such activities are not taking place.</li>
<li><u>High Availability</u>: payments processing should be available 24x7x365 (including holidays and weekends)</li>
</ul>
</div><!--/$--></div><div class="gs-uitk-c-1990ojq--grid-rich-text-705544169"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4>Typical Instant Payments Use Case</h4>
<p>Below is a hypothetical scenario between two fictitious corporations and two fictitious banks where each corporation maintains their respective bank account.</p>
<p>Imagine WidgetTechCo has an Account with SummitPeakBank. WidgetTechCo manufactures widgets for InnovateTechCo. InnovateTechCo has an account at VistaTrustBank. It is the end of the month and InnovateTechCo would like to pay an invoice that is due to WidgetTechCo. This invoice is $2,000. The diagram below illustrates how InnovateTechCo will pay WidgetTechCo the invoice using an instant payments scheme.</p>
</div><!--/$--></div><div class="gs-uitk-c-6kjypx--grid-image-88115746"><!--$--><div class="gs-uitk-c-cw6l1u--div"><div class="gs-uitk-c-l0f0cg--div"><img data-cy="styled-image" src="/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog4.png" class="gs-uitk-c-157278q--img"/></div><div id="" style="position:fixed" class="gs-uitk-c-1dx0648--div"><img data-cy="lightbox-image" src="/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog4.png" class="gs-uitk-c-1xj9nee--img--styled"/></div></div><!--/$--></div><div class="gs-uitk-c-khcjgj--grid-rich-text-1117754880"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><p>VistaTrustBank will send this payment on behalf of InnovateTechCo to the Payment Exchange Network. The Network will identify that WidgetTechCo<i>, </i>who keeps an account at SummitPeakBank, needs to receive a $2,000 payment; hence, the Network instructs SummitPeakBank to deposit $2,000 into WidgetTechCo's Account.</p>
<p>The moment the payment instruction is published to SummitPeakBank by the Network, the Network starts a timer for SummitPeakBank<i>. </i>Within a few seconds (e.g., 10 seconds), SummitPeakBank must perform the following functions (at a minimum):</p>
<ul>
<li>Consume the payment instruction from the Network.</li>
<li>Perform certain security validations to ensure the payment has indeed originated from the Network and not from some other source (i.e., the Network should be the only trusted source of the payment instruction). An example security validation may include a digital signature verification on the payment details.</li>
<li>Perform payment-level validations. These validations include both technical and functional validations, including that the payment message adheres to industry formatting standards (e.g., ISO20022), and the payment message includes the correct currency, or the payment does not exceed a certain amount</li>
<li>Execute certain payment processing rules that may adhere to SummitPeakBank's compliance and other internal payments processing due diligence standards.</li>
<li>Perform any fraud or sanctions checks</li>
</ul>
<p>If SummitPeakBank cannot respond within the given time limit to the Network, the Network will cancel the payment instruction - this effectively "unwinds" the entire payment. The Network will then instruct VistaTrustBank that the $2,000 payment to WidgetTechCo has failed to be completed and therefore the cycle must repeat itself (if needed). There are two scenarios forward after that: 1) VistaTrustBank may retry the payment instruction (it will be a new payment instruction); or 2) VistaTrustBank and SummitPeakBank communicate offline (via email or phone, for example) to investigate why the payment transaction has failed.</p>
<p>What makes this more interesting is that the Network may be sending payments at an extremely high transaction rate (e.g., 300 payments per second or more) during peak times and at any hour of the day, highlighting the need for high throughput, low latency and high availability.</p>
<h4>Technical Architecture</h4>
</div><!--/$--></div><div class="gs-uitk-c-1shkbae--grid-image-734419347"><!--$--><div class="gs-uitk-c-cw6l1u--div"><div class="gs-uitk-c-l0f0cg--div"><img data-cy="styled-image" src="/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog5.png" class="gs-uitk-c-157278q--img"/></div><div id="" style="position:fixed" class="gs-uitk-c-1dx0648--div"><img data-cy="lightbox-image" src="/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog5.png" class="gs-uitk-c-1xj9nee--img--styled"/></div></div><!--/$--></div><div class="gs-uitk-c-b7kwqt--grid-rich-text-1509099583"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><p>The diagram above illustrates TxB's cloud first architecture for processing instant payments. In the following example, SummitPeakBank wants to send TxB a payment transaction; TxB in turn will then ensure that the payment is deposited into one of TxB's client's account.</p>
<ol>
<li>The Payment Exchange Network publishes a payment instruction for TxB</li>
<li>TxB's Payment Gateway will consume this payment transaction from the Network; the Gateway will then perform the required security validations on the payment (for example, did this payment transaction originate from a trusted source, namely the Network itself is the only trusted source)</li>
<li>After successfully validating the payment transaction from a security perspective, the Gateway will execute functional validations on the payment - for example, account, currency and amount validations, among other functional validations.</li>
<li>Once all validations have been successfully executed, a positive acknowledgement (known as an "ACK") is published by the Gateway to the Network</li>
<li>At each step of the above process, the Gateway may write or read payment-related data to/from an Amazon DynamoDB. DynamoDB helps us deal with the challenges associated with both throughput and latency during peak payment processing times at certain days of the day or month.</li>
</ol>
<p>The three technologies chosen by TxB to help us tackle the high throughput, low latency, and high availability challenges discussed previously are as follows:</p>
<ul>
<li>Amazon ECS (Elastic Container Service) running on AWS Fargate as our compute layer for the Payment Gateway</li>
<li>Amazon MSK (Managed Streaming for Apache Kafka) for inter-process communication between the Payment Gateway and other TxB Services</li>
<li>Amazon DynamoDB as our operational datastore</li>
</ul>
</div><!--/$--></div><div class="gs-uitk-c-16rn4ax--grid-rich-text-1581904046"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4>AWS Fargate and Amazon ECS</h4>
<p>To achieve high throughput and high availability for our instant payments architecture, the compute layer needs to scale based on the architecture’s resource demands with no developer intervention. AWS Fargate supports automatic scaling ("auto scaling") that fits our instant payments use case. This feature has the following advantages for our architecture:</p>
<ul>
<li>Reduces maintenance required by our DevOps staff. As the application’s resource demands increase or decrease, we do not need manual intervention to add or remove ECS tasks.</li>
<li>ECS auto scaling allows us to scale based on the application-level (task) metrics (e.g., number of payments per second). We also required more fine-grained control on the auto scaling demands to control costs. Auto scaling on the instance level is too coarse and therefore the auto scaling may add more instances that would be over-kill for our application’s demand.</li>
<li>If DevOps intervention is needed for any reason (e.g., due to urgent security patching of the runtime environment or an urgent bug fix) a simple redeployment of the ECS cluster would take only a few seconds which is vital to maintain overall throughput and availability for instant payment processing.</li>
</ul>
</div><!--/$--></div><div class="gs-uitk-c-1fmj1hr--grid-rich-text-1845797088"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4>Amazon DynamoDB</h4>
<p>DynamoDB is a fully managed service offering NoSQL capabilities and supports regional replication natively. For our instant payments architecture, DynamoDB was an ideal fit for the following reasons:</p>
<ul>
<li><b>Simple Schema: </b>For any instant payment sent or received from the system, there is only one data point we needed to model to ensure we can uniquely identify the payment. This data point is the Payment ID. The rest of the payment’s data points (such as sender, receiver, amount, currency, and so on) are stored as JSON strings. Therefore, our payments data are extremely simple and does not call for a highly normalized schema. And finally, since the JSON strings may have slightly different internal data elements between one payment and another, we required the flexibility to store this data in a schema-less fashion. Moreover, since the payments data are based on the ISO20022 standard, evolution of this standard will not affect our schema where the schema may need to evolve in a traditional RDBMS.</li>
<li><b>Payment Lifecycle Management: </b>Each instant payment’s lifecycle is captured and milestoned. One of our functional requirements is to ensure we can track a payment’s lifecycle as it is progressing in the flow discussed previously. Therefore, this introduces not only a volume-related challenge, but also a “chattiness” challenge between the Payment Gateway and DynamoDB. Although any payment’s complete lifecycle is only a few seconds (e.g., under 10 seconds), over a dozen lifecycle events are generated for each payment over the course of these few seconds. These events must be saved (for regulatory, compliance and other internal reporting purposes). By using the native <i style="font-size:0.8125rem">provisioned capacity</i> feature of DynamoDB, we overcome our throughput challenges. </li>
<li><b>DynamoDB Supports CDC (Change Data Capture) Streaming:</b> Whenever a data item (i.e., a payment lifecycle event) is inserted (or updated) in DynamoDB, this item will be streamed to other downstream consumers (such as data lakes and other historical data stores). We store the bulk of a payment’s lifecycle event as a JSON string. On insert into DynamoDB, the JSON payload is streamed to any downstream system and these consumers may parse the payload for any further processing. By using this native CDC feature, we don’t need to build or deploy additional code to publish these payload data to other consumers, thus further simplifying the architecture.</li>
<li><b>Support for Global Tables:</b> As shown in the architecture diagram above, to achieve high availability, our instant payments stack is deployed on us-east and us-west. DynamoDB natively supports cross-region table replication using its Global Tables feature.</li>
</ul>
</div><!--/$--></div><div class="gs-uitk-c-zjbly9--grid-rich-text-1171997878"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4>Amazon MSK (Kafka)</h4>
<p>When an instant payment is being processed by TxB, some of the primary functions that need to be performed on the payment include security validations, payment-level functional checks including fraud checks, and payment enrichments. These functional checks will be handled by other TxB Services as shown in the diagram.</p>
<p>As discussed in the DynamoDB section, these call-outs to other TxB Services will generate lifecycle events per call. When calls by the Payment Gateway to other TxB Services are being made via Kafka, the request/response latency must be fast (single-digit milliseconds or lower) to ensure high throughput is achieved, especially during bursts of activity. We can achieve these low latency requirements by using Kafka.</p>
<p>When TxB exchanges payments with the Payment Exchange Network, we need to ensure that we are processing these payments exactly once to avoid duplicate payments processing. To achieve exactly once processing on producers, we take advantage of Kafka’s native idempotency feature. Contrasted with other messaging technologies (such as traditional queueing technologies), these messaging schemes do not support producer idempotency natively like Kafka without added engineering effort.</p>
<p>With respect to performance (message latency), in our lab environment we found that Kafka outperforms traditional queuing technologies by about 175% for our instant payments use case. In other words, given the same number of consumers and producers in a multi-threaded environment and the same payment messages load, the time taken (latency) for a message to be consumed by a queue-based consumer was far greater than that of a Kafka consumer.</p>
<p>One final consideration on why Kafka was chosen for our instant processing use case: Kafka’s ecosystem natively supports a Schema Registry. Due to the strict time requirements of processing instant payments and the importance of ensuring that Kafka producers and consumers adhere to the ISO20022 specifications, having native support in Kafka for schema validation is greatly beneficial. Since payments processing is a critical function for TxB, we must ensure that if there are schema (contract) violations between consumers and producers, we fail-fast. In this context, fail-fast means that Kafka producers or consumers reject the payment message before further processing of the payment. For our use case, failing fast on contract violations between consumer and producers is preferable over processing potentially erroneous payments. In addition, since the Schema Registry feature is natively supported by the Kafka ecosystem, no added latency is introduced to payments processing where otherwise we would have had to contend with latency if we had to validate the message contract using other means (such as consumers and producers building their own custom validations). In instant payments processing, validating the contract between producers and consumers using an external system (such as another TxB-built custom service) may introduce more latency. Therefore, the native enforcement of the data contract was a critical deciding factor for us. </p>
</div><!--/$--></div><div class="gs-uitk-c-if21je--grid-rich-text-1486936719"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><h4><b> </b>Conclusion</h4>
<p>Our instant payments architecture using Amazon MSK (Kafka), Amazon DynamoDB and AWS Fargate/Amazon ECS, presents a solution capable of addressing the challenges inherent in high-throughput, low-latency and 24x7 availability requirements. By using these services, our instant payment architecture can scale to larger payment volumes without compromising on throughout, latency or availability.</p>
<p>By using these managed services and their respective scaling automation, we have achieved cost savings in terms of both infrastructure and engineering effort.</p>
</div><!--/$--></div></div></div><!--/$--></div><div class="gs-uitk-c-1mqafeg--root-grid-last-main-child"><!--$--><div class="gs-uitk-c-1hx5lac--grid-root"><div class="gs-uitk-c-1nqcv7c--grid-container"><div class="gs-uitk-c-aimxmr--grid-horizontal-rule"><!--$--><hr color="#C1CCD6" class="gs-uitk-c-1i2jj05--hr"/><!--/$--></div><div class="gs-uitk-c-147r7z9--grid-rich-text"><!--$--><div class="gs-uitk-c-8kf9gl--text-root"><p>See <a href="https://www.gs.com/disclaimer/global_email">https://www.gs.com/disclaimer/global_email</a> for important risk disclosures, conflicts of interest, and other terms and conditions relating to this blog and your reliance on information contained in it.</p>
</div><!--/$--></div></div></div><!--/$--></div></div><div class="gs-uitk-c-1n8lxrm--root-grid-last-child"><!--$--><div data-testid="developer-footer" class="gs-uitk-c-1ba8zsr--div"><div class="gs-uitk-c-j8fkow--div"><div class="gs-uitk-c-rii2qt--div"><div class="gs-uitk-c-63ok9w--div"><h5 data-testid="developer-footer-solutions" data-gs-uitk-component="heading" class="gs-heading gs-uitk-c-1d74ggx--heading-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1acod61--link-root--link-anchor--styled" href="/discover/solutions"><span>Solutions</span></a></h5><span data-gs-uitk-component="text" class="gs-text gs-uitk-c-gqeuli--text-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/curated-data" data-testid="developer-footer-solution-links"><span>Curated Data</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/data-management" data-testid="developer-footer-solution-links"><span>Data Management</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/security-master" data-testid="developer-footer-solution-links"><span> Security Master</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/data-analytics" data-testid="developer-footer-solution-links"><span>Data Analytics</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/plottool-pro" data-testid="developer-footer-solution-links"><span>PlotTool Pro</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/portfolio-analytics" data-testid="developer-footer-solution-links"><span>Portfolio Analytics</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/gs-quant" data-testid="developer-footer-solution-links"><span>GS Quant</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/txb" data-testid="developer-footer-solution-links"><span>Transaction Banking</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/gs-dap" data-testid="developer-footer-solution-links"><span>GS DAP™</span></a></span></div><div class="gs-uitk-c-63ok9w--div"><h5 data-gs-uitk-component="heading" class="gs-heading gs-uitk-c-1d74ggx--heading-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1acod61--link-root--link-anchor--styled" href="/docs/"><span>Docs</span></a></h5><span data-gs-uitk-component="text" class="gs-text gs-uitk-c-gqeuli--text-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/services/data/"><span>Data Services</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/services/risk/"><span>Pricing & Risk Services</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/services/index/"><span>Index Services</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/services/hedge/"><span>Hedging Services</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/services/portfolio/"><span>Portfolio Services</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/services/content/"><span>Content Services</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/services/commission-manager/"><span>Commission Manager</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/docs/services/transaction-banking"><span>Transaction Banking</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/services/select"><span>GS Select</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/docs/gsquant/"><span>GS Quant</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/p/docs/products/plottool/"><span>PlotTool Pro</span></a></span></div><div class="gs-uitk-c-63ok9w--div"><h5 data-gs-uitk-component="heading" class="gs-heading gs-uitk-c-1d74ggx--heading-root--styled">Learn More</h5><span data-gs-uitk-component="text" class="gs-text gs-uitk-c-gqeuli--text-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/blog/posts" target="_blank"><span>Blog</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/open-source" target="_blank"><span>Open Source</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/data-partners" target="_blank"><span>Data Partners</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="/discover/datonomy" target="_blank"><span>datonomy™</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="https://www.goldmansachs.com/careers/index.html" target="_blank"><span>Careers</span></a><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-1lj6q4i--link-root--link-anchor--styled" href="https://www.goldmansachs.com/about-us" target="_blank"><span>About Goldman Sachs</span></a></span></div></div><div class="gs-uitk-c-1cql1ps--div"><span data-gs-uitk-component="text" class="gs-text gs-uitk-c-gqeuli--text-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-2hbi3n--link-root--link-anchor--styled" href="/discover/home" target="_blank"><span>Goldman Sachs Developer</span></a></span><span data-gs-uitk-component="text" class="gs-text gs-uitk-c-gqeuli--text-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-2hbi3n--link-root--link-anchor--styled" href="https://www.goldmansachs.com/privacy-and-cookies/index.html" target="_blank"><span>Privacy and Cookies</span></a></span><span data-gs-uitk-component="text" class="gs-text gs-uitk-c-gqeuli--text-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-2hbi3n--link-root--link-anchor--styled" href="https://www.goldmansachs.com/terms-and-conditions/index.html" target="_blank"><span>GS Terms & Conditions</span></a></span><span data-gs-uitk-component="text" class="gs-text gs-uitk-c-gqeuli--text-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-2hbi3n--link-root--link-anchor--styled" href="https://www.goldmansachs.com/disclosures/index.html" target="_blank"><span>Regulatory Disclosures</span></a></span><span data-gs-uitk-component="text" class="gs-text gs-uitk-c-gqeuli--text-root--styled"><a data-gs-uitk-component="link" class="gs-link gs-uitk-c-2hbi3n--link-root--link-anchor--styled" href="https://www.goldmansachs.com/security/index.html" target="_blank"><span>Security</span></a></span></div><span data-gs-uitk-component="text" class="gs-uitk-c-fwm1jg--text-root gs-text"><div class="gs-uitk-c-igh1yu--div">Certain solutions and Institutional Services described herein are provided via our Marquee platform. The Marquee platform is for institutional and professional clients only. This site is for informational purposes only and does not constitute an offer to provide the Marquee platform services described, nor an offer to sell, or the solicitation of an offer to buy, any security. Some of the services and products described herein may not be available in certain jurisdictions or to certain types of clients. Please contact your Goldman Sachs sales representative with any questions. Any data or market information presented on the site is solely for illustrative purposes. There is no representation that any transaction can or could have been effected on such terms or at such prices. Please see https://www.goldmansachs.com/disclaimer/sec-div-disclaimers-for-electronic-comms.html for additional information.</div><div class="gs-uitk-c-igh1yu--div">Transaction Banking services are offered by Goldman Sachs Bank USA (“GS Bank”). GS Bank is a New York State chartered bank, a member of the Federal Reserve System and a Member FDIC.</div><div class="gs-uitk-c-igh1yu--div">GS DAP™ is owned and operated by Goldman Sachs. This site is for informational purposes only and does not constitute an offer to provide, or the solicitation of an offer to provide access to or use of GS DAP™. Any subsequent commitment by Goldman Sachs to provide access to and / or use of GS DAP™ would be subject to various conditions, including, amongst others, (i) satisfactory determination and legal review of the structure of any potential product or activity, (ii) receipt of all internal and external approvals (including potentially regulatory approvals); (iii) execution of any relevant documentation in a form satisfactory to Goldman Sachs; and (iv) completion of any relevant system / technology / platform build or adaptation required or desired to support the structure of any potential product or activity.</div><div class="gs-uitk-c-igh1yu--div">Mosaic is a service mark of Goldman Sachs & Co. LLC. This service is made available in the United States by Goldman Sachs & Co. LLC and outside of the United States by Goldman Sachs International, or its local affiliates in accordance with applicable law and regulations. Goldman Sachs International and Goldman Sachs & Co. LLC are the distributors of the Goldman Sachs Funds. Depending upon the jurisdiction in which you are located, transactions in non-Goldman Sachs money market funds are affected by either Goldman Sachs & Co. LLC, a member of FINRA, SIPC and NYSE, or Goldman Sachs International. For additional information contact your Goldman Sachs representative. Goldman Sachs & Co. LLC, Goldman Sachs International, Goldman Sachs Liquidity Solutions, Goldman Sachs Asset Management, L.P., and the Goldman Sachs funds available through Goldman Sachs Liquidity Solutions and other affiliated entities, are under the common control of the Goldman Sachs Group, Inc.</div><div class="gs-uitk-c-igh1yu--div">© 2024 Goldman Sachs. All rights reserved.</div></span></div></div><!--/$--></div></div><!--/$--></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"buildProps":{"path":["posts","txb-instant-payments"],"title":"How Transaction Banking Implemented an Instant Payment Architecture for High-Throughput, Low-Latency and 24x7 Availability ","description":null,"templateName":"blog-post-template","thumbnailPath":null,"lastModifiedDate":1720479181784,"env":"prod","hostname":"developer.gs.com","basePath":"/blog"},"cmsPageProps":{},"children":{"id":"root","type":"gs-uitoolkit-responsive-grid","attributes":{"columnCount":12,"layouts":{"default":{"behavior":"none","width":12,"offset":0}},"tags":[],"childLayouts":{"google_analytics":{"default":{"behavior":"none","width":12,"offset":0}},"nav_bar":{"default":{"behavior":"none","width":12,"offset":0}},"gs_uitoolkit_respons":{"default":{"behavior":"none","width":12,"offset":0}},"gs_uitoolkit_respons_1322348534":{"default":{"behavior":"none","width":12,"offset":0}},"gs_uitoolkit_respons_1605462191":{"default":{"behavior":"none","width":12,"offset":0}},"footer":{"default":{"behavior":"none","width":12,"offset":0}}},"properties":{}},"children":[{"id":"google_analytics","type":"google-analytics","attributes":{"jsonProperties":{"debug":"false","googleAnalyticsId":"\"UA-96382331-44\""},"tags":[],"debug":false,"googleAnalyticsId":"UA-96382331-44"},"children":[]},{"id":"nav_bar","type":"nav-bar","attributes":{"jsonProperties":{},"tags":[]},"children":[]},{"id":"gs_uitoolkit_respons","type":"gs-uitoolkit-responsive-grid","attributes":{"columnCount":12,"layouts":{"default":{"behavior":"none","width":12,"offset":0}},"tags":[],"childLayouts":{"blog_heading":{"default":{"behavior":"none","width":12,"offset":0}}},"properties":{"backgroundCss":"","desktopPadding":"0px","contentMaxWidth":"1200px","independentScroll":false,"tabletPadding":"0px","mobilePadding":"0px","backgroundImageType":"Default","desktopMargin":"128px 64px 0px 64px","backgroundColor":"#FFFFFF","backgroundImage":"","mobileMargin":"96px 32px 0px 32px","tabletMargin":"128px 64px 0px 64px"}},"children":[{"id":"blog_heading","type":"blog-heading","attributes":{"jsonProperties":{"publishedDate":"\"July 9, 2024\"","authors":"\"Shahin M. Shahin, Vice President and Tech Fellow; Krishna Yalamanchi, Vice President\"","title":"\"How Transaction Banking Implemented an Instant Payment Architecture for High-Throughput, Low-Latency and 24x7 Availability \""},"tags":[],"publishedDate":"July 9, 2024","authors":"Shahin M. Shahin, Vice President and Tech Fellow; Krishna Yalamanchi, Vice President","title":"How Transaction Banking Implemented an Instant Payment Architecture for High-Throughput, Low-Latency and 24x7 Availability "},"children":[]}]},{"id":"gs_uitoolkit_respons_1322348534","type":"gs-uitoolkit-responsive-grid","attributes":{"columnCount":12,"layouts":{"default":{"behavior":"none","width":12,"offset":0}},"tags":[],"childLayouts":{"rich_text":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_1731752237":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_756383909":{"default":{"behavior":"none","width":12,"offset":0}},"image":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_91351254":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_985533298":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_705544169":{"default":{"behavior":"none","width":12,"offset":0}},"image_88115746":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_1117754880":{"default":{"behavior":"none","width":12,"offset":0}},"image_734419347":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_1509099583":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_1581904046":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_1845797088":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_1171997878":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text_1486936719":{"default":{"behavior":"none","width":12,"offset":0}}},"properties":{"backgroundCss":"","desktopPadding":"0px","contentMaxWidth":"1200px","independentScroll":false,"tabletPadding":"0px","mobilePadding":"0px","backgroundImageType":"Default","desktopMargin":"0px 64px 0px 64px","backgroundColor":"#FFFFFF","backgroundImage":"","mobileMargin":"0px 32px 0px 32px","tabletMargin":"0px 64px 0px 64px"}},"children":[{"id":"rich_text","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003eIntroduction\u003c/h4\u003e\\r\\n\u003cp\u003eAt Goldman Sachs, payments processing sits at the heart of our\u0026nbsp;\u003ca href=\\\"https://developer.gs.com/discover/txb\\\"\u003eTransaction Banking (TxB)\u003c/a\u003e\u0026nbsp;business. This post will focus on one of TxB’s services that enables instant payments for our corporate clients. First, we will give a high-level overview and present technical challenges associated with instant payments. We will then provide an explanation of the technical architecture, focusing on how TxB utilizes various products and services offered by Amazon Web Services (AWS) to achieve a highly scalable architecture with millisecond latency per transaction and 24x7 availability.\u0026nbsp;\u003c/p\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003eIntroduction\u003c/h4\u003e\r\n\u003cp\u003eAt Goldman Sachs, payments processing sits at the heart of our\u0026nbsp;\u003ca href=\"https://developer.gs.com/discover/txb\"\u003eTransaction Banking (TxB)\u003c/a\u003e\u0026nbsp;business. This post will focus on one of TxB’s services that enables instant payments for our corporate clients. First, we will give a high-level overview and present technical challenges associated with instant payments. We will then provide an explanation of the technical architecture, focusing on how TxB utilizes various products and services offered by Amazon Web Services (AWS) to achieve a highly scalable architecture with millisecond latency per transaction and 24x7 availability.\u0026nbsp;\u003c/p\u003e\r\n"},"children":[]},{"id":"rich_text_1731752237","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003eWhat is an Instant Payment?\u003c/h4\u003e\\r\\n\u003cp\u003eAn instant payment (also called a real-time payment) is any payment that settles between both the sender and the recipient within a few seconds and enables the near instantaneous transfer of funds between two bank accounts. An example of an instant payment is when one company pays another company immediately upon delivery of a product. The receiving company may release the product only after confirmation that the payment has been received.\u003c/p\u003e\\r\\n\u003cp\u003eAn advantage of an instant payment scheme over a batch-based payments scheme (e.g., ACH payments) is that some batch-based payment schemes may take days to settle funds. Instant payments require greater throughput, lower latency, and higher availability of computing systems vs. these other payment schemes and are typically available 24x7x365 and can run across multiple platforms (e.g., mobile devices or traditional computing devices such as computers or laptops).\u003c/p\u003e\\r\\n\u003cp\u003eAccording to a \u003ca href=\\\"https://fedpaymentsimprovement.org/news/blog/study-growing-usage-underscores-business-and-consumer-appetite-for-faster-payment-options/\\\"\u003estudy from the Federal Reserve\u003c/a\u003e, 80% of businesses in the United States are using a method of faster payments. As a result, there is significant demand for advanced technical solutions such as reliable payment processing infrastructure and scalable cloud-based platforms capable of handling high payments volumes. Instant payments create opportunities for innovative services and applications, pushing businesses to adopt advanced technologies to meet corporate demands for fast, secure, and seamless payment transactions.\u003c/p\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003eWhat is an Instant Payment?\u003c/h4\u003e\r\n\u003cp\u003eAn instant payment (also called a real-time payment) is any payment that settles between both the sender and the recipient within a few seconds and enables the near instantaneous transfer of funds between two bank accounts. An example of an instant payment is when one company pays another company immediately upon delivery of a product. The receiving company may release the product only after confirmation that the payment has been received.\u003c/p\u003e\r\n\u003cp\u003eAn advantage of an instant payment scheme over a batch-based payments scheme (e.g., ACH payments) is that some batch-based payment schemes may take days to settle funds. Instant payments require greater throughput, lower latency, and higher availability of computing systems vs. these other payment schemes and are typically available 24x7x365 and can run across multiple platforms (e.g., mobile devices or traditional computing devices such as computers or laptops).\u003c/p\u003e\r\n\u003cp\u003eAccording to a \u003ca href=\"https://fedpaymentsimprovement.org/news/blog/study-growing-usage-underscores-business-and-consumer-appetite-for-faster-payment-options/\"\u003estudy from the Federal Reserve\u003c/a\u003e, 80% of businesses in the United States are using a method of faster payments. As a result, there is significant demand for advanced technical solutions such as reliable payment processing infrastructure and scalable cloud-based platforms capable of handling high payments volumes. Instant payments create opportunities for innovative services and applications, pushing businesses to adopt advanced technologies to meet corporate demands for fast, secure, and seamless payment transactions.\u003c/p\u003e\r\n"},"children":[]},{"id":"rich_text_756383909","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003eHigh-Level Instant Payments Flow\u003c/h4\u003e\\r\\n\u003cp\u003eThere are five main actors involved in a typical instant payment processing scheme:\u003c/p\u003e\\r\\n\u003cul\u003e\\r\\n\u003cli\u003eThe Sender of the Payment\u003c/li\u003e\\r\\n\u003cli\u003eThe Sender’s Bank\u003c/li\u003e\\r\\n\u003cli\u003eThe Payment Exchange Network\u003c/li\u003e\\r\\n\u003cli\u003eThe Recipient’s Bank\u003c/li\u003e\\r\\n\u003cli\u003eThe Receiver of the Payment\u003c/li\u003e\\r\\n\u003c/ul\u003e\\r\\n\u003cp\u003eThe high-level diagram below illustrates how an instant payment flows between sender and receiver.\u003c/p\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003eHigh-Level Instant Payments Flow\u003c/h4\u003e\r\n\u003cp\u003eThere are five main actors involved in a typical instant payment processing scheme:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eThe Sender of the Payment\u003c/li\u003e\r\n\u003cli\u003eThe Sender’s Bank\u003c/li\u003e\r\n\u003cli\u003eThe Payment Exchange Network\u003c/li\u003e\r\n\u003cli\u003eThe Recipient’s Bank\u003c/li\u003e\r\n\u003cli\u003eThe Receiver of the Payment\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cp\u003eThe high-level diagram below illustrates how an instant payment flows between sender and receiver.\u003c/p\u003e\r\n"},"children":[]},{"id":"image","type":"image","attributes":{"jsonProperties":{"imagePath":"\"/content/dam/gs/dev-blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog3.png\"","disableBorderRadius":"false"},"tags":[],"imagePath":"/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog3.png","disableBorderRadius":false},"children":[]},{"id":"rich_text_91351254","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003cp\u003eIn the illustration above, both the sender and the receiver happen to be corporate entities; however, nothing in the above flow precludes either actor from being individual consumers, government entities or other banks.\u003c/p\u003e\\r\\n\u003cp\u003eMost notably, the sending and receiving banks are where TxB plays the pivotal role of facilitating any instant payment transaction. TxB may act as both a sender and receiver of instant payments. This role is critical for interfacing with the Payment Exchange Network. TxB must ensure latency is minimized, and high throughput and high availability are achieved when payments are settled between these actors.\u003cb\u003e\u003c/b\u003e\u003c/p\u003e\\r\\n\""},"tags":[],"text":"\u003cp\u003eIn the illustration above, both the sender and the receiver happen to be corporate entities; however, nothing in the above flow precludes either actor from being individual consumers, government entities or other banks.\u003c/p\u003e\r\n\u003cp\u003eMost notably, the sending and receiving banks are where TxB plays the pivotal role of facilitating any instant payment transaction. TxB may act as both a sender and receiver of instant payments. This role is critical for interfacing with the Payment Exchange Network. TxB must ensure latency is minimized, and high throughput and high availability are achieved when payments are settled between these actors.\u003cb\u003e\u003c/b\u003e\u003c/p\u003e\r\n"},"children":[]},{"id":"rich_text_985533298","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003eTechnical and Functional Challenges Associated with Instant Payments\u003c/h4\u003e\\r\\n\u003cp\u003eOne of the biggest challenges in instant payments processing is that funds are required to move (also called settlement) between sender and receiver through a Payment Exchange Network within seconds. Once the payment is settled, the payment is considered final and irrevocable.\u003c/p\u003e\\r\\n\u003cp\u003eAs stated above, the three primary goals of any instant payment technology solution are as follows:\u003c/p\u003e\\r\\n\u003cul\u003e\\r\\n\u003cli\u003e\u003cu\u003eHigh Throughput\u003c/u\u003e: Instant payment processing typically occurs at peak times. Examples of peak processing times include:\u003cul\u003e\\r\\n\u003cli\u003eCertain days during the month, year, or quarter: for example, corporates paying their contractors or employees.\u003c/li\u003e\\r\\n\u003cli\u003eCertain times during the day: for example, corporates managing their liquidity needs by settling funds among their various bank accounts held at other banks intraday.\u003c/li\u003e\\r\\n\u003c/ul\u003e\\r\\n\u003c/li\u003e\\r\\n\u003cli\u003e\u003cu\u003eLow Latency\u003c/u\u003e: due to the strict settlement requirements of instant payments, any individual payment must be settled in (typically) under 15 seconds. This includes debiting the funds from the sender's account and crediting the funds into the receiver's account. The settlement of funds includes the Sender Bank and the Recipient Bank performing due diligence on the payments to ensure fraud or other such activities are not taking place.\u003c/li\u003e\\r\\n\u003cli\u003e\u003cu\u003eHigh Availability\u003c/u\u003e: payments processing should be available 24x7x365 (including holidays and weekends)\u003c/li\u003e\\r\\n\u003c/ul\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003eTechnical and Functional Challenges Associated with Instant Payments\u003c/h4\u003e\r\n\u003cp\u003eOne of the biggest challenges in instant payments processing is that funds are required to move (also called settlement) between sender and receiver through a Payment Exchange Network within seconds. Once the payment is settled, the payment is considered final and irrevocable.\u003c/p\u003e\r\n\u003cp\u003eAs stated above, the three primary goals of any instant payment technology solution are as follows:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cu\u003eHigh Throughput\u003c/u\u003e: Instant payment processing typically occurs at peak times. Examples of peak processing times include:\u003cul\u003e\r\n\u003cli\u003eCertain days during the month, year, or quarter: for example, corporates paying their contractors or employees.\u003c/li\u003e\r\n\u003cli\u003eCertain times during the day: for example, corporates managing their liquidity needs by settling funds among their various bank accounts held at other banks intraday.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\u003cu\u003eLow Latency\u003c/u\u003e: due to the strict settlement requirements of instant payments, any individual payment must be settled in (typically) under 15 seconds. This includes debiting the funds from the sender's account and crediting the funds into the receiver's account. The settlement of funds includes the Sender Bank and the Recipient Bank performing due diligence on the payments to ensure fraud or other such activities are not taking place.\u003c/li\u003e\r\n\u003cli\u003e\u003cu\u003eHigh Availability\u003c/u\u003e: payments processing should be available 24x7x365 (including holidays and weekends)\u003c/li\u003e\r\n\u003c/ul\u003e\r\n"},"children":[]},{"id":"rich_text_705544169","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003eTypical Instant Payments Use Case\u003c/h4\u003e\\r\\n\u003cp\u003eBelow is a hypothetical scenario between two fictitious corporations and two fictitious banks where each corporation maintains their respective bank account.\u003c/p\u003e\\r\\n\u003cp\u003eImagine WidgetTechCo has an Account with SummitPeakBank. WidgetTechCo manufactures widgets for InnovateTechCo. InnovateTechCo has an account at VistaTrustBank. It is the end of the month and InnovateTechCo would like to pay an invoice that is due to WidgetTechCo. This invoice is $2,000. The diagram below illustrates how InnovateTechCo will pay\u0026nbsp;WidgetTechCo\u0026nbsp;the invoice using an instant payments scheme.\u003c/p\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003eTypical Instant Payments Use Case\u003c/h4\u003e\r\n\u003cp\u003eBelow is a hypothetical scenario between two fictitious corporations and two fictitious banks where each corporation maintains their respective bank account.\u003c/p\u003e\r\n\u003cp\u003eImagine WidgetTechCo has an Account with SummitPeakBank. WidgetTechCo manufactures widgets for InnovateTechCo. InnovateTechCo has an account at VistaTrustBank. It is the end of the month and InnovateTechCo would like to pay an invoice that is due to WidgetTechCo. This invoice is $2,000. The diagram below illustrates how InnovateTechCo will pay\u0026nbsp;WidgetTechCo\u0026nbsp;the invoice using an instant payments scheme.\u003c/p\u003e\r\n"},"children":[]},{"id":"image_88115746","type":"image","attributes":{"jsonProperties":{"imagePath":"\"/content/dam/gs/dev-blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog4.png\"","disableBorderRadius":"false"},"tags":[],"imagePath":"/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog4.png","disableBorderRadius":false},"children":[]},{"id":"rich_text_1117754880","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003cp\u003eVistaTrustBank will send this payment on behalf of InnovateTechCo to the Payment Exchange Network. The Network will identify that WidgetTechCo\u003ci\u003e,\u0026nbsp;\u003c/i\u003ewho keeps an account at SummitPeakBank, needs to receive a $2,000 payment; hence, the Network instructs\u0026nbsp;SummitPeakBank to deposit $2,000 into WidgetTechCo's Account.\u003c/p\u003e\\r\\n\u003cp\u003eThe moment the payment instruction is published to SummitPeakBank by the Network, the Network starts a timer for SummitPeakBank\u003ci\u003e. \u003c/i\u003eWithin a few seconds (e.g., 10 seconds), SummitPeakBank must perform the following functions (at a minimum):\u003c/p\u003e\\r\\n\u003cul\u003e\\r\\n\u003cli\u003eConsume the payment instruction from the Network.\u003c/li\u003e\\r\\n\u003cli\u003ePerform certain security validations to ensure the payment has indeed originated from the Network and not from some other source (i.e., the Network should be the only trusted source of the payment instruction). An example security validation may include a digital signature verification on the payment details.\u003c/li\u003e\\r\\n\u003cli\u003ePerform payment-level validations. These validations include both technical and functional validations, including that the payment message adheres to industry formatting standards (e.g., ISO20022), and the payment message includes the correct currency, or the payment does not exceed a certain amount\u003c/li\u003e\\r\\n\u003cli\u003eExecute certain payment processing rules that may adhere to SummitPeakBank's compliance and other internal payments processing due diligence standards.\u003c/li\u003e\\r\\n\u003cli\u003ePerform any fraud or sanctions checks\u003c/li\u003e\\r\\n\u003c/ul\u003e\\r\\n\u003cp\u003eIf SummitPeakBank cannot respond within the given time limit to the Network, the Network will cancel the payment instruction - this effectively \u0026quot;unwinds\u0026quot; the entire payment. The Network will then instruct VistaTrustBank that the $2,000 payment to WidgetTechCo has failed to be completed and therefore the cycle must repeat itself (if needed). There are two scenarios forward after that: 1) VistaTrustBank may retry the payment instruction (it will be a new payment instruction); or 2) VistaTrustBank and SummitPeakBank communicate offline (via email or phone, for example) to investigate why the payment transaction has failed.\u003c/p\u003e\\r\\n\u003cp\u003eWhat makes this more interesting is that the Network may be sending payments at an extremely high transaction rate (e.g., 300 payments per second or more) during peak times and at any hour of the day, highlighting the need for high throughput, low latency and high availability.\u003c/p\u003e\\r\\n\u003ch4\u003eTechnical Architecture\u003c/h4\u003e\\r\\n\""},"tags":[],"text":"\u003cp\u003eVistaTrustBank will send this payment on behalf of InnovateTechCo to the Payment Exchange Network. The Network will identify that WidgetTechCo\u003ci\u003e,\u0026nbsp;\u003c/i\u003ewho keeps an account at SummitPeakBank, needs to receive a $2,000 payment; hence, the Network instructs\u0026nbsp;SummitPeakBank to deposit $2,000 into WidgetTechCo's Account.\u003c/p\u003e\r\n\u003cp\u003eThe moment the payment instruction is published to SummitPeakBank by the Network, the Network starts a timer for SummitPeakBank\u003ci\u003e. \u003c/i\u003eWithin a few seconds (e.g., 10 seconds), SummitPeakBank must perform the following functions (at a minimum):\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eConsume the payment instruction from the Network.\u003c/li\u003e\r\n\u003cli\u003ePerform certain security validations to ensure the payment has indeed originated from the Network and not from some other source (i.e., the Network should be the only trusted source of the payment instruction). An example security validation may include a digital signature verification on the payment details.\u003c/li\u003e\r\n\u003cli\u003ePerform payment-level validations. These validations include both technical and functional validations, including that the payment message adheres to industry formatting standards (e.g., ISO20022), and the payment message includes the correct currency, or the payment does not exceed a certain amount\u003c/li\u003e\r\n\u003cli\u003eExecute certain payment processing rules that may adhere to SummitPeakBank's compliance and other internal payments processing due diligence standards.\u003c/li\u003e\r\n\u003cli\u003ePerform any fraud or sanctions checks\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cp\u003eIf SummitPeakBank cannot respond within the given time limit to the Network, the Network will cancel the payment instruction - this effectively \u0026quot;unwinds\u0026quot; the entire payment. The Network will then instruct VistaTrustBank that the $2,000 payment to WidgetTechCo has failed to be completed and therefore the cycle must repeat itself (if needed). There are two scenarios forward after that: 1) VistaTrustBank may retry the payment instruction (it will be a new payment instruction); or 2) VistaTrustBank and SummitPeakBank communicate offline (via email or phone, for example) to investigate why the payment transaction has failed.\u003c/p\u003e\r\n\u003cp\u003eWhat makes this more interesting is that the Network may be sending payments at an extremely high transaction rate (e.g., 300 payments per second or more) during peak times and at any hour of the day, highlighting the need for high throughput, low latency and high availability.\u003c/p\u003e\r\n\u003ch4\u003eTechnical Architecture\u003c/h4\u003e\r\n"},"children":[]},{"id":"image_734419347","type":"image","attributes":{"jsonProperties":{"imagePath":"\"/content/dam/gs/dev-blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog5.png\"","disableBorderRadius":"false"},"tags":[],"imagePath":"/blog/blog-posts/how-transaction-banking-implemented-an-instant-payment-architecture-for-high-throughput,-low-latency-and-24x7-availability/TxB_blog5.png","disableBorderRadius":false},"children":[]},{"id":"rich_text_1509099583","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003cp\u003eThe diagram above illustrates TxB's cloud first architecture for processing instant payments. In the following example, SummitPeakBank wants to send TxB a payment transaction; TxB in turn will then ensure that the payment is deposited into one of TxB's client's account.\u003c/p\u003e\\r\\n\u003col\u003e\\r\\n\u003cli\u003eThe Payment Exchange Network publishes a payment instruction for TxB\u003c/li\u003e\\r\\n\u003cli\u003eTxB's Payment Gateway will consume this payment transaction from the Network; the Gateway will then perform the required security validations on the payment (for example, did this payment transaction originate from a trusted source, namely the Network itself is the only trusted source)\u003c/li\u003e\\r\\n\u003cli\u003eAfter successfully validating the payment transaction from a security perspective, the Gateway will execute functional validations on the payment - for example, account, currency and amount validations, among other functional validations.\u003c/li\u003e\\r\\n\u003cli\u003eOnce all validations have been successfully executed, a positive acknowledgement (known as an \u0026quot;ACK\u0026quot;) is published by the Gateway to the Network\u003c/li\u003e\\r\\n\u003cli\u003eAt each step of the above process, the Gateway may write or read payment-related data to/from an Amazon DynamoDB. DynamoDB helps us deal with the challenges associated with both throughput and latency during peak payment processing times at certain days of the day or month.\u003c/li\u003e\\r\\n\u003c/ol\u003e\\r\\n\u003cp\u003eThe three technologies chosen by TxB to help us tackle the high throughput, low latency, and high availability challenges discussed previously are as follows:\u003c/p\u003e\\r\\n\u003cul\u003e\\r\\n\u003cli\u003eAmazon ECS (Elastic Container Service) running on AWS Fargate as our compute layer for the Payment Gateway\u003c/li\u003e\\r\\n\u003cli\u003eAmazon MSK (Managed Streaming for Apache Kafka) for inter-process communication between the Payment Gateway and other TxB Services\u003c/li\u003e\\r\\n\u003cli\u003eAmazon DynamoDB as our operational datastore\u003c/li\u003e\\r\\n\u003c/ul\u003e\\r\\n\""},"tags":[],"text":"\u003cp\u003eThe diagram above illustrates TxB's cloud first architecture for processing instant payments. In the following example, SummitPeakBank wants to send TxB a payment transaction; TxB in turn will then ensure that the payment is deposited into one of TxB's client's account.\u003c/p\u003e\r\n\u003col\u003e\r\n\u003cli\u003eThe Payment Exchange Network publishes a payment instruction for TxB\u003c/li\u003e\r\n\u003cli\u003eTxB's Payment Gateway will consume this payment transaction from the Network; the Gateway will then perform the required security validations on the payment (for example, did this payment transaction originate from a trusted source, namely the Network itself is the only trusted source)\u003c/li\u003e\r\n\u003cli\u003eAfter successfully validating the payment transaction from a security perspective, the Gateway will execute functional validations on the payment - for example, account, currency and amount validations, among other functional validations.\u003c/li\u003e\r\n\u003cli\u003eOnce all validations have been successfully executed, a positive acknowledgement (known as an \u0026quot;ACK\u0026quot;) is published by the Gateway to the Network\u003c/li\u003e\r\n\u003cli\u003eAt each step of the above process, the Gateway may write or read payment-related data to/from an Amazon DynamoDB. DynamoDB helps us deal with the challenges associated with both throughput and latency during peak payment processing times at certain days of the day or month.\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cp\u003eThe three technologies chosen by TxB to help us tackle the high throughput, low latency, and high availability challenges discussed previously are as follows:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eAmazon ECS (Elastic Container Service) running on AWS Fargate as our compute layer for the Payment Gateway\u003c/li\u003e\r\n\u003cli\u003eAmazon MSK (Managed Streaming for Apache Kafka) for inter-process communication between the Payment Gateway and other TxB Services\u003c/li\u003e\r\n\u003cli\u003eAmazon DynamoDB as our operational datastore\u003c/li\u003e\r\n\u003c/ul\u003e\r\n"},"children":[]},{"id":"rich_text_1581904046","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003eAWS Fargate and Amazon ECS\u003c/h4\u003e\\r\\n\u003cp\u003eTo achieve high throughput and high availability for our instant payments architecture, the compute layer needs to scale based on the architecture’s resource demands with no developer intervention. AWS Fargate supports automatic scaling (\u0026quot;auto scaling\u0026quot;) that fits our instant payments use case. This feature has the following advantages for our architecture:\u003c/p\u003e\\r\\n\u003cul\u003e\\r\\n\u003cli\u003eReduces maintenance required by our DevOps staff. As the application’s resource demands increase or decrease, we do not need manual intervention to add or remove ECS tasks.\u003c/li\u003e\\r\\n\u003cli\u003eECS auto scaling allows us to scale based on the application-level (task) metrics (e.g., number of payments per second). We also required more fine-grained control on the auto scaling demands to control costs. Auto scaling on the instance level is too coarse and therefore the auto scaling may add more instances that would be over-kill for our application’s demand.\u003c/li\u003e\\r\\n\u003cli\u003eIf DevOps intervention is needed for any reason (e.g., due to urgent security patching of the runtime environment or an urgent bug fix) a simple redeployment of the ECS cluster would take only a few seconds which is vital to maintain overall throughput and availability for instant payment processing.\u003c/li\u003e\\r\\n\u003c/ul\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003eAWS Fargate and Amazon ECS\u003c/h4\u003e\r\n\u003cp\u003eTo achieve high throughput and high availability for our instant payments architecture, the compute layer needs to scale based on the architecture’s resource demands with no developer intervention. AWS Fargate supports automatic scaling (\u0026quot;auto scaling\u0026quot;) that fits our instant payments use case. This feature has the following advantages for our architecture:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eReduces maintenance required by our DevOps staff. As the application’s resource demands increase or decrease, we do not need manual intervention to add or remove ECS tasks.\u003c/li\u003e\r\n\u003cli\u003eECS auto scaling allows us to scale based on the application-level (task) metrics (e.g., number of payments per second). We also required more fine-grained control on the auto scaling demands to control costs. Auto scaling on the instance level is too coarse and therefore the auto scaling may add more instances that would be over-kill for our application’s demand.\u003c/li\u003e\r\n\u003cli\u003eIf DevOps intervention is needed for any reason (e.g., due to urgent security patching of the runtime environment or an urgent bug fix) a simple redeployment of the ECS cluster would take only a few seconds which is vital to maintain overall throughput and availability for instant payment processing.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n"},"children":[]},{"id":"rich_text_1845797088","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003eAmazon DynamoDB\u003c/h4\u003e\\r\\n\u003cp\u003eDynamoDB is a fully managed service offering NoSQL capabilities and supports regional replication natively. For our instant payments architecture, DynamoDB was an ideal fit for the following reasons:\u003c/p\u003e\\r\\n\u003cul\u003e\\r\\n\u003cli\u003e\u003cb\u003eSimple Schema: \u003c/b\u003eFor any instant payment sent or received from the system, there is only one data point we needed to model to ensure we can uniquely identify the payment. This data point is the Payment ID. The rest of the payment’s data points (such as sender, receiver, amount, currency, and so on) are stored as JSON strings. Therefore, our payments data are extremely simple and does not call for a highly normalized schema. And finally, since the JSON strings may have slightly different internal data elements between one payment and another, we required the flexibility to store this data in a schema-less fashion.\u0026nbsp; Moreover, since the payments data are based on the ISO20022 standard, evolution of this standard will not affect our schema where the schema may need to evolve in a traditional RDBMS.\u003c/li\u003e\\r\\n\u003cli\u003e\u003cb\u003ePayment Lifecycle Management: \u003c/b\u003eEach instant payment’s lifecycle is captured and milestoned. One of our functional requirements is to ensure we can track a payment’s lifecycle as it is progressing in the flow discussed previously. Therefore, this introduces not only a volume-related challenge, but also a “chattiness” challenge between the Payment Gateway and DynamoDB. Although any payment’s complete lifecycle is only a few seconds (e.g., under 10 seconds), over a dozen lifecycle events are generated for each payment over the course of these few seconds. These events must be saved (for regulatory, compliance and other internal reporting purposes). By using the native \u003ci style=\\\"font-size: 0.8125rem;\\\"\u003eprovisioned capacity\u003c/i\u003e feature of DynamoDB, we overcome our throughput challenges.\u0026nbsp;\u003c/li\u003e\\r\\n\u003cli\u003e\u003cb\u003eDynamoDB Supports CDC (Change Data Capture) Streaming:\u003c/b\u003e Whenever a data item (i.e., a payment lifecycle event) is inserted (or updated) in DynamoDB, this item will be streamed to other downstream consumers (such as data lakes and other historical data stores). We store the bulk of a payment’s lifecycle event as a JSON string. On insert into DynamoDB, the JSON payload is streamed to any downstream system and these consumers may parse the payload for any further processing. By using this native CDC feature, we don’t need to build or deploy additional code to publish these payload data to other consumers, thus further simplifying the architecture.\u003c/li\u003e\\r\\n\u003cli\u003e\u003cb\u003eSupport for Global Tables:\u003c/b\u003e As shown in the architecture diagram above, to achieve high availability, our instant payments stack is deployed on us-east and us-west. DynamoDB natively supports cross-region table replication using its Global Tables feature.\u003c/li\u003e\\r\\n\u003c/ul\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003eAmazon DynamoDB\u003c/h4\u003e\r\n\u003cp\u003eDynamoDB is a fully managed service offering NoSQL capabilities and supports regional replication natively. For our instant payments architecture, DynamoDB was an ideal fit for the following reasons:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cb\u003eSimple Schema: \u003c/b\u003eFor any instant payment sent or received from the system, there is only one data point we needed to model to ensure we can uniquely identify the payment. This data point is the Payment ID. The rest of the payment’s data points (such as sender, receiver, amount, currency, and so on) are stored as JSON strings. Therefore, our payments data are extremely simple and does not call for a highly normalized schema. And finally, since the JSON strings may have slightly different internal data elements between one payment and another, we required the flexibility to store this data in a schema-less fashion.\u0026nbsp; Moreover, since the payments data are based on the ISO20022 standard, evolution of this standard will not affect our schema where the schema may need to evolve in a traditional RDBMS.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ePayment Lifecycle Management: \u003c/b\u003eEach instant payment’s lifecycle is captured and milestoned. One of our functional requirements is to ensure we can track a payment’s lifecycle as it is progressing in the flow discussed previously. Therefore, this introduces not only a volume-related challenge, but also a “chattiness” challenge between the Payment Gateway and DynamoDB. Although any payment’s complete lifecycle is only a few seconds (e.g., under 10 seconds), over a dozen lifecycle events are generated for each payment over the course of these few seconds. These events must be saved (for regulatory, compliance and other internal reporting purposes). By using the native \u003ci style=\"font-size: 0.8125rem;\"\u003eprovisioned capacity\u003c/i\u003e feature of DynamoDB, we overcome our throughput challenges.\u0026nbsp;\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eDynamoDB Supports CDC (Change Data Capture) Streaming:\u003c/b\u003e Whenever a data item (i.e., a payment lifecycle event) is inserted (or updated) in DynamoDB, this item will be streamed to other downstream consumers (such as data lakes and other historical data stores). We store the bulk of a payment’s lifecycle event as a JSON string. On insert into DynamoDB, the JSON payload is streamed to any downstream system and these consumers may parse the payload for any further processing. By using this native CDC feature, we don’t need to build or deploy additional code to publish these payload data to other consumers, thus further simplifying the architecture.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eSupport for Global Tables:\u003c/b\u003e As shown in the architecture diagram above, to achieve high availability, our instant payments stack is deployed on us-east and us-west. DynamoDB natively supports cross-region table replication using its Global Tables feature.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n"},"children":[]},{"id":"rich_text_1171997878","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003eAmazon MSK (Kafka)\u003c/h4\u003e\\r\\n\u003cp\u003eWhen an instant payment is being processed by TxB, some of the primary functions that need to be performed on the payment include security validations, payment-level functional checks including fraud checks, and payment enrichments. These functional checks will be handled by other TxB Services as shown in the diagram.\u003c/p\u003e\\r\\n\u003cp\u003eAs discussed in the DynamoDB section, these call-outs to other TxB Services will generate lifecycle events per call. When calls by the Payment Gateway to other TxB Services are being made via Kafka, the request/response latency must be fast (single-digit milliseconds or lower) to ensure high throughput is achieved, especially during bursts of activity. We can achieve these low latency requirements by using Kafka.\u003c/p\u003e\\r\\n\u003cp\u003eWhen TxB exchanges payments with the Payment Exchange Network, we need to ensure that we are processing these payments exactly once to avoid duplicate payments processing. To achieve exactly once processing on producers, we take advantage of Kafka’s native idempotency feature. Contrasted with other messaging technologies (such as traditional queueing technologies), these messaging schemes do not support producer idempotency natively like Kafka without added engineering effort.\u003c/p\u003e\\r\\n\u003cp\u003eWith respect to performance (message latency), in our lab environment we found that Kafka outperforms traditional queuing technologies by about 175% for our instant payments use case. In other words, given the same number of consumers and producers in a multi-threaded environment and the same payment messages load, the time taken (latency) for a message to be consumed by a queue-based consumer was far greater than that of a Kafka consumer.\u003c/p\u003e\\r\\n\u003cp\u003eOne final consideration on why Kafka was chosen for our instant processing use case: Kafka’s ecosystem natively supports a Schema Registry. Due to the strict time requirements of processing instant payments and the importance of ensuring that Kafka producers and consumers adhere to the ISO20022 specifications, having native support in Kafka for schema validation is greatly beneficial. Since payments processing is a critical function for TxB, we must ensure that if there are schema (contract) violations between consumers and producers, we fail-fast. In this context, fail-fast means that Kafka producers or consumers reject the payment message before further processing of the payment. For our use case, failing fast on contract violations between consumer and producers is preferable over processing potentially erroneous payments. In addition, since the Schema Registry feature is natively supported by the Kafka ecosystem, no added latency is introduced to payments processing where otherwise we would have had to contend with latency if we had to validate the message contract using other means (such as consumers and producers building their own custom validations). In instant payments processing, validating the contract between producers and consumers using an external system (such as another TxB-built custom service) may introduce more latency. Therefore, the native enforcement of the data contract was a critical deciding factor for us. \u003c/p\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003eAmazon MSK (Kafka)\u003c/h4\u003e\r\n\u003cp\u003eWhen an instant payment is being processed by TxB, some of the primary functions that need to be performed on the payment include security validations, payment-level functional checks including fraud checks, and payment enrichments. These functional checks will be handled by other TxB Services as shown in the diagram.\u003c/p\u003e\r\n\u003cp\u003eAs discussed in the DynamoDB section, these call-outs to other TxB Services will generate lifecycle events per call. When calls by the Payment Gateway to other TxB Services are being made via Kafka, the request/response latency must be fast (single-digit milliseconds or lower) to ensure high throughput is achieved, especially during bursts of activity. We can achieve these low latency requirements by using Kafka.\u003c/p\u003e\r\n\u003cp\u003eWhen TxB exchanges payments with the Payment Exchange Network, we need to ensure that we are processing these payments exactly once to avoid duplicate payments processing. To achieve exactly once processing on producers, we take advantage of Kafka’s native idempotency feature. Contrasted with other messaging technologies (such as traditional queueing technologies), these messaging schemes do not support producer idempotency natively like Kafka without added engineering effort.\u003c/p\u003e\r\n\u003cp\u003eWith respect to performance (message latency), in our lab environment we found that Kafka outperforms traditional queuing technologies by about 175% for our instant payments use case. In other words, given the same number of consumers and producers in a multi-threaded environment and the same payment messages load, the time taken (latency) for a message to be consumed by a queue-based consumer was far greater than that of a Kafka consumer.\u003c/p\u003e\r\n\u003cp\u003eOne final consideration on why Kafka was chosen for our instant processing use case: Kafka’s ecosystem natively supports a Schema Registry. Due to the strict time requirements of processing instant payments and the importance of ensuring that Kafka producers and consumers adhere to the ISO20022 specifications, having native support in Kafka for schema validation is greatly beneficial. Since payments processing is a critical function for TxB, we must ensure that if there are schema (contract) violations between consumers and producers, we fail-fast. In this context, fail-fast means that Kafka producers or consumers reject the payment message before further processing of the payment. For our use case, failing fast on contract violations between consumer and producers is preferable over processing potentially erroneous payments. In addition, since the Schema Registry feature is natively supported by the Kafka ecosystem, no added latency is introduced to payments processing where otherwise we would have had to contend with latency if we had to validate the message contract using other means (such as consumers and producers building their own custom validations). In instant payments processing, validating the contract between producers and consumers using an external system (such as another TxB-built custom service) may introduce more latency. Therefore, the native enforcement of the data contract was a critical deciding factor for us. \u003c/p\u003e\r\n"},"children":[]},{"id":"rich_text_1486936719","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003ch4\u003e\u003cb\u003e\u0026nbsp;\u003c/b\u003eConclusion\u003c/h4\u003e\\r\\n\u003cp\u003eOur instant payments architecture using Amazon MSK (Kafka), Amazon DynamoDB and AWS Fargate/Amazon ECS, presents a solution capable of addressing the challenges inherent in high-throughput, low-latency and 24x7 availability requirements. By using these services, our instant payment architecture can scale to larger payment volumes without compromising on throughout, latency or availability.\u003c/p\u003e\\r\\n\u003cp\u003eBy using these managed services and their respective scaling automation, we have achieved cost savings in terms of both infrastructure and engineering effort.\u003c/p\u003e\\r\\n\""},"tags":[],"text":"\u003ch4\u003e\u003cb\u003e\u0026nbsp;\u003c/b\u003eConclusion\u003c/h4\u003e\r\n\u003cp\u003eOur instant payments architecture using Amazon MSK (Kafka), Amazon DynamoDB and AWS Fargate/Amazon ECS, presents a solution capable of addressing the challenges inherent in high-throughput, low-latency and 24x7 availability requirements. By using these services, our instant payment architecture can scale to larger payment volumes without compromising on throughout, latency or availability.\u003c/p\u003e\r\n\u003cp\u003eBy using these managed services and their respective scaling automation, we have achieved cost savings in terms of both infrastructure and engineering effort.\u003c/p\u003e\r\n"},"children":[]}]},{"id":"gs_uitoolkit_respons_1605462191","type":"gs-uitoolkit-responsive-grid","attributes":{"columnCount":12,"layouts":{"default":{"behavior":"none","width":12,"offset":0}},"tags":[],"childLayouts":{"horizontal_rule":{"default":{"behavior":"none","width":12,"offset":0}},"rich_text":{"default":{"behavior":"none","width":12,"offset":0}}},"properties":{"backgroundCss":"","desktopPadding":"0px","contentMaxWidth":"1200px","independentScroll":false,"tabletPadding":"0px","mobilePadding":"0xp","backgroundImageType":"Default","desktopMargin":"0px 64px 64px 64px","backgroundColor":"#FFFFFF","backgroundImage":"","mobileMargin":"0px 32px 32px 32px","tabletMargin":"0px 64px 64px 64px"}},"children":[{"id":"horizontal_rule","type":"horizontal-rule","attributes":{"jsonProperties":{"color":"\"\""},"tags":[],"color":""},"children":[]},{"id":"rich_text","type":"rich-text","attributes":{"jsonProperties":{"text":"\"\u003cp\u003eSee\u0026nbsp;\u003ca href=\\\"https://www.gs.com/disclaimer/global_email\\\"\u003ehttps://www.gs.com/disclaimer/global_email\u003c/a\u003e\u0026nbsp;for important risk disclosures, conflicts of interest, and other terms and conditions relating to this blog and your reliance on information contained in it.\u003c/p\u003e\\r\\n\""},"tags":[],"text":"\u003cp\u003eSee\u0026nbsp;\u003ca href=\"https://www.gs.com/disclaimer/global_email\"\u003ehttps://www.gs.com/disclaimer/global_email\u003c/a\u003e\u0026nbsp;for important risk disclosures, conflicts of interest, and other terms and conditions relating to this blog and your reliance on information contained in it.\u003c/p\u003e\r\n"},"children":[]}]},{"id":"footer","type":"footer","attributes":{"jsonProperties":{},"tags":[]},"children":[]}]},"documentHeadProps":{"path":["posts","txb-instant-payments"],"title":"How Transaction Banking Implemented an Instant Payment Architecture for High-Throughput, Low-Latency and 24x7 Availability ","description":null,"templateName":"blog-post-template","thumbnailPath":null,"lastModifiedDate":1720479181784,"env":"prod","hostname":"developer.gs.com","basePath":"/blog","faviconSvg":"/gs-favicon.svg","faviconPng":"/gs-favicon-white.png","faviconApple":"/gs-favicon.svg","faviconAppleTouch":"/gs-favicon-apple.png"}},"__N_SSG":true},"page":"/[...path]","query":{"path":["posts","txb-instant-payments"]},"buildId":"2myHGwV71eGRI8ikbk0tc","assetPrefix":"/blog","isFallback":false,"dynamicIds":[662,9588,351,2667,8132,3341,3328,9955],"gsp":true,"scriptLoader":[]}</script></body></html>