-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMSD-Presentation.html
21 lines (21 loc) · 27.4 KB
/
MSD-Presentation.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!doctype html>
<html lang="en" dir="ltr" class="mdx-wrapper mdx-page plugin-pages plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.1">
<title data-rh="true">MSD-CACI Interview Presentation | Tech Blog</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://marksmurphy.github.io/MSD-Presentation"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="MSD-CACI Interview Presentation | Tech Blog"><meta data-rh="true" name="description" content="Solution Architecture"><meta data-rh="true" property="og:description" content="Solution Architecture"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://marksmurphy.github.io/MSD-Presentation"><link data-rh="true" rel="alternate" href="https://marksmurphy.github.io/MSD-Presentation" hreflang="en"><link data-rh="true" rel="alternate" href="https://marksmurphy.github.io/MSD-Presentation" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Tech Blog RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Tech Blog Atom Feed"><link rel="stylesheet" href="/assets/css/styles.603af9ce.css">
<link rel="preload" href="/assets/js/runtime~main.d8e15a5e.js" as="script">
<link rel="preload" href="/assets/js/main.cba81dbf.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logos/transparent-grey-plain.png" alt="Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/logos/transparent-grey-plain.png" alt="Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Home</b></a><a class="navbar__item navbar__link" href="/blog">Blog</a><a class="navbar__item navbar__link" href="/docs/category/npm-packages">NPM Packages</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/markSmurphy" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><main class="container container--fluid margin-vert--lg"><div class="row mdxPageWrapper_j9I6"><div class="col"><article><p><img loading="lazy" alt="logo" src="data:image/png;base64,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" width="240" height="108" class="img_ev3q"></p><h1>Interview Presentation</h1><h2 class="anchor anchorWithStickyNavbar_LWe7" id="overview">Overview<a href="#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview"></a></h2><p>The company, who was a large e-commerce retailer, wanted a new search engine on the site.</p><p>The existing solution was no longer inline with customer expectations, couldn't support international sites, and struggled during peak load.</p><p>A preferred supplier had already been selected, so a project was started to design (and cost) a detailed end-to-end solution.</p><p>The existing solution was on premise, but the technical strategy was to migrate to the cloud, so the project needed to:</p><ul><li>Deploy a new, cloud native, Search solution.</li><li>Integrate the back-end with the new Search SaaS provider.</li><li>Deprecate the current solution.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="requirements">Requirements<a href="#requirements" class="hash-link" aria-label="Direct link to Requirements" title="Direct link to Requirements"></a></h2><p>The new Search solution needed to:</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="functional-requirements">Functional Requirements<a href="#functional-requirements" class="hash-link" aria-label="Direct link to Functional Requirements" title="Direct link to Functional Requirements"></a></h3><ul><li>Support multiple languages.</li><li>Support refinement of Category pages.</li><li>Offer more relevant search results.</li><li>Allow tuned ranking order.</li><li>Support synonyms.</li><li>Include newly added SKUs in Search results in a timely manner (within 30 minutes).</li><li>Support mobile native apps as a first class citizen.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="non-function-requirements">Non-function Requirements<a href="#non-function-requirements" class="hash-link" aria-label="Direct link to Non-function Requirements" title="Direct link to Non-function Requirements"></a></h3><ul><li>Be in accordance with technical strategy (i.e. cloud native).</li><li>Be scalable and future proofed for five years.</li><li>Be highly available.</li><li>Be performant during peak traffic load.</li><li>Support a phased roll-out with the ability to rollback.</li><li>Be secure</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="existing-system-topology">Existing System Topology<a href="#existing-system-topology" class="hash-link" aria-label="Direct link to Existing System Topology" title="Direct link to Existing System Topology"></a></h2><p>A combination of reading documentation, discussions with people who possessed local knowledge, and access to live configuration allowed the creation of an as-is topology.</p><p><a target="_blank" href="/assets/files/01-existing-system-20ad2c88eea83b53b80b9f8bbf26655b.png"><img loading="lazy" alt="Existing System Topology" src="/assets/images/01-existing-system-20ad2c88eea83b53b80b9f8bbf26655b.png" width="768" height="1085" class="img_ev3q"></a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="solution-overview">Solution Overview<a href="#solution-overview" class="hash-link" aria-label="Direct link to Solution Overview" title="Direct link to Solution Overview"></a></h2><p>The solution required three new components:</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-a-data-extraction-and-upload-service">1. A data extraction and upload service.<a href="#1-a-data-extraction-and-upload-service" class="hash-link" aria-label="Direct link to 1. A data extraction and upload service." title="Direct link to 1. A data extraction and upload service."></a></h3><p>This service's function was to extract the product catalogue data, transform it into the required format, and upload it to the new Search Provider. It was to be deployed on-premise because that's where the data source was, and migrating the Product Catalogue into the cloud was out of scope of this project.
It would run every 15 minutes to upload deltas, and once every 24 hours it would upload the entire product catalogue again.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-a-search-api">2. A Search API<a href="#2-a-search-api" class="hash-link" aria-label="Direct link to 2. A Search API" title="Direct link to 2. A Search API"></a></h3><p>The Search API was to be RESTful and offered two endpoints:</p><ul><li>One for auto-complete, where search suggestions are returned, in <code>JSON</code> for each keystroke. This would be called directly be mobile and browser based clients.</li><li>One which returned the full search results for a specified query string in <code>JSON</code>.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-search-ui">3. Search UI<a href="#3-search-ui" class="hash-link" aria-label="Direct link to 3. Search UI" title="Direct link to 3. Search UI"></a></h3><ul><li>A server-side ASP.NET component which called the Search API and rendered the results. This would be called by browser based clients only.</li></ul><p><a target="_blank" href="/assets/files/02-solution-topology-8bc1746a9588242164267b0b4441b67d.png"><img loading="lazy" alt="Existing System Topology" src="/assets/images/02-solution-topology-8bc1746a9588242164267b0b4441b67d.png" width="1594" height="1268" class="img_ev3q"></a></p><p>Other, existing, components need modification:</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="cdn">CDN<a href="#cdn" class="hash-link" aria-label="Direct link to CDN" title="Direct link to CDN"></a></h3><p>The CDN needed new layer-7 routing rules to inspect incoming URL paths and go forward to the respective cloud origins for the new Search URLs.
Caching rules also needed to be applied to the specific responses in order to optimise the offload without serving stale content.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="native-apps">Native Apps<a href="#native-apps" class="hash-link" aria-label="Direct link to Native Apps" title="Direct link to Native Apps"></a></h3><p>The Android and iOS apps needed to be updated to consume the new Search API. This would replace the existing approach of the app hosting a browser and consuming the search page URL.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="feature-flags">Feature Flags<a href="#feature-flags" class="hash-link" aria-label="Direct link to Feature Flags" title="Direct link to Feature Flags"></a></h3><p>Both native apps, and browser based clients would have the new search enabled via feature flags, and these flags could be enabled on a per international site basis.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="performance-optimisations">Performance Optimisations<a href="#performance-optimisations" class="hash-link" aria-label="Direct link to Performance Optimisations" title="Direct link to Performance Optimisations"></a></h2><p>The UI's <code>HTML</code> response, and the API's <code>JSON</code> response were designed to be publicly cacheable (i.e. no user-centric content) and as such can be cached in the CDN making subsequent requests for the same search term a lot faster and cheaper to serve.</p><p>The requests which aren't offloaded need to be processed by the server-side API, which requires a query to be sent to the Search Provider. This takes time, and the provider's charge model is volumetric so it also costs money. A read-through cache was introduced to prevent every Search request from resulting in a chargeable call to the Search Provider.
This meant the solution scaled out a lot better, was more performant and cheaper to run. As long os the cache TTLs were not too high, it also met the requirement of timely delivery of new products.</p><p>There was tuned caching policies across four tiers (client, CDN, server in-memory, Redis distributed cache).</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="testing-scalability">Testing Scalability<a href="#testing-scalability" class="hash-link" aria-label="Direct link to Testing Scalability" title="Direct link to Testing Scalability"></a></h2><p>No two search queries are equal. Some could yield few results quickly, while other would take longer to yield hundreds. Some would be cached (in one of the four tiers) while others wouldn't.
This made a testing strategy difficult, and working with QA essential to help bolster their understanding and capabilities.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="security">Security<a href="#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security"></a></h2><p>The solution had end-to-end encryption over the wire, appropriately restrictive TLS and cipher suite configuration for each ingress point, CORS policies, and a WAF solution at the edge.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="further-discussion-points">Further discussion points<a href="#further-discussion-points" class="hash-link" aria-label="Direct link to Further discussion points" title="Direct link to Further discussion points"></a></h2><ul><li>High Availability with dual cloud regions</li><li>Monitoring and Operations</li></ul><hr></article></div></div></main></div></div>
<script src="/assets/js/runtime~main.d8e15a5e.js"></script>
<script src="/assets/js/main.cba81dbf.js"></script>
</body>
</html>