[{"data":1,"prerenderedAt":9725},["ShallowReactive",2],{"blog-database-optimization":3,"blog-related-database-optimization":2863,"content-query-ASk06kgMg1":7307},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"slug":10,"date":11,"readTime":12,"category":13,"image":14,"imageCaption":15,"author":16,"tags":25,"body":31,"_type":2857,"_id":2858,"_source":2859,"_file":2860,"_stem":2861,"_extension":2862},"/blog/database-optimization","blog",false,"","Database Performance Optimisation: How We Cut Query Time from 1200ms to 85ms","A deep-dive into the indexing strategies, query rewrites, and caching techniques that tripled throughput for a 50,000+ orders/day e-commerce platform—and the systematic process you can replicate.","database-optimization","2025-01-30","13 min","Backend","https://images.unsplash.com/photo-1544383835-bda2bc66a55d?w=1200&h=600&fit=crop&auto=format","Server infrastructure powering high-throughput database operations",{"name":17,"role":18,"avatar":19,"bio":20,"social":21},"Tobias Lie-Atjam","Founder & Senior Software Engineer at MediaFront","https://images.unsplash.com/photo-1560250097-0b93528c311a?w=400&h=400&fit=crop&auto=format","Tobias is the founder of MediaFront. He specialises in cloud-native architecture, Rust, and .NET—helping businesses build high-performance systems that scale.",{"github":22,"twitter":23,"linkedin":24},"https://github.com/","https://twitter.com/","https://linkedin.com/",[26,27,28,29,30],"Databases","PostgreSQL","Performance","Optimisation","Scalability",{"type":32,"children":33,"toc":2836},"root",[34,43,49,54,60,65,125,350,355,361,368,373,694,699,753,759,764,898,904,909,1197,1203,1208,1214,1219,1264,1269,1295,1301,1306,1485,1505,1511,1516,1600,1605,1611,1616,1743,1748,1754,1759,1765,2318,2323,2329,2334,2598,2609,2615,2620,2721,2726,2732,2737,2825,2830],{"type":35,"tag":36,"props":37,"children":39},"element","h2",{"id":38},"the-problem-no-one-sees-until-its-too-late",[40],{"type":41,"value":42},"text","The Problem No One Sees Until It's Too Late",{"type":35,"tag":44,"props":45,"children":46},"p",{},[47],{"type":41,"value":48},"Database performance rarely degrades all at once. It creeps up gradually: a query that took 80ms at launch takes 300ms after six months of data growth, then 900ms a year later. By the time users notice slowness, the problem is already severe.",{"type":35,"tag":44,"props":50,"children":51},{},[52],{"type":41,"value":53},"We see this pattern repeatedly at MediaFront. The good news: most database performance issues stem from the same handful of root causes, and fixing them systematically delivers dramatic improvements without hardware upgrades.",{"type":35,"tag":36,"props":55,"children":57},{"id":56},"start-with-measurement-not-guesses",[58],{"type":41,"value":59},"Start With Measurement, Not Guesses",{"type":35,"tag":44,"props":61,"children":62},{},[63],{"type":41,"value":64},"Every optimisation project begins the same way: instrument before you optimise. Guessing which query is slow wastes weeks. Your tools:",{"type":35,"tag":66,"props":67,"children":68},"ul",{},[69,89,115],{"type":35,"tag":70,"props":71,"children":72},"li",{},[73,78,80,87],{"type":35,"tag":74,"props":75,"children":76},"strong",{},[77],{"type":41,"value":27},{"type":41,"value":79}," — ",{"type":35,"tag":81,"props":82,"children":84},"code",{"className":83},[],[85],{"type":41,"value":86},"pg_stat_statements",{"type":41,"value":88}," extension tracks cumulative query execution time across all calls",{"type":35,"tag":70,"props":90,"children":91},{},[92,97,99,105,107,113],{"type":35,"tag":74,"props":93,"children":94},{},[95],{"type":41,"value":96},"MySQL",{"type":41,"value":98}," — the ",{"type":35,"tag":81,"props":100,"children":102},{"className":101},[],[103],{"type":41,"value":104},"slow_query_log",{"type":41,"value":106}," with ",{"type":35,"tag":81,"props":108,"children":110},{"className":109},[],[111],{"type":41,"value":112},"long_query_time = 0.1",{"type":41,"value":114}," captures everything above 100ms",{"type":35,"tag":70,"props":116,"children":117},{},[118,123],{"type":35,"tag":74,"props":119,"children":120},{},[121],{"type":41,"value":122},"SQL Server",{"type":41,"value":124}," — Query Store provides a GUI over the same data",{"type":35,"tag":126,"props":127,"children":131},"pre",{"className":128,"code":129,"language":130,"meta":7,"style":7},"language-sql shiki shiki-themes github-light","-- Find your 10 most expensive queries in PostgreSQL\nSELECT\n  query,\n  calls,\n  round(total_exec_time::numeric, 2) AS total_ms,\n  round(mean_exec_time::numeric, 2)  AS avg_ms,\n  round(stddev_exec_time::numeric, 2) AS stddev_ms\nFROM pg_stat_statements\nORDER BY total_exec_time DESC\nLIMIT 10;\n","sql",[132],{"type":35,"tag":81,"props":133,"children":134},{"__ignoreMap":7},[135,147,157,167,176,221,260,298,312,331],{"type":35,"tag":136,"props":137,"children":140},"span",{"class":138,"line":139},"line",1,[141],{"type":35,"tag":136,"props":142,"children":144},{"style":143},"--shiki-default:#6A737D",[145],{"type":41,"value":146},"-- Find your 10 most expensive queries in PostgreSQL\n",{"type":35,"tag":136,"props":148,"children":150},{"class":138,"line":149},2,[151],{"type":35,"tag":136,"props":152,"children":154},{"style":153},"--shiki-default:#D73A49",[155],{"type":41,"value":156},"SELECT\n",{"type":35,"tag":136,"props":158,"children":160},{"class":138,"line":159},3,[161],{"type":35,"tag":136,"props":162,"children":164},{"style":163},"--shiki-default:#24292E",[165],{"type":41,"value":166},"  query,\n",{"type":35,"tag":136,"props":168,"children":170},{"class":138,"line":169},4,[171],{"type":35,"tag":136,"props":172,"children":173},{"style":163},[174],{"type":41,"value":175},"  calls,\n",{"type":35,"tag":136,"props":177,"children":179},{"class":138,"line":178},5,[180,186,191,196,201,206,211,216],{"type":35,"tag":136,"props":181,"children":183},{"style":182},"--shiki-default:#005CC5",[184],{"type":41,"value":185},"  round",{"type":35,"tag":136,"props":187,"children":188},{"style":163},[189],{"type":41,"value":190},"(total_exec_time::",{"type":35,"tag":136,"props":192,"children":193},{"style":153},[194],{"type":41,"value":195},"numeric",{"type":35,"tag":136,"props":197,"children":198},{"style":163},[199],{"type":41,"value":200},", ",{"type":35,"tag":136,"props":202,"children":203},{"style":182},[204],{"type":41,"value":205},"2",{"type":35,"tag":136,"props":207,"children":208},{"style":163},[209],{"type":41,"value":210},") ",{"type":35,"tag":136,"props":212,"children":213},{"style":153},[214],{"type":41,"value":215},"AS",{"type":35,"tag":136,"props":217,"children":218},{"style":163},[219],{"type":41,"value":220}," total_ms,\n",{"type":35,"tag":136,"props":222,"children":224},{"class":138,"line":223},6,[225,229,234,238,242,246,251,255],{"type":35,"tag":136,"props":226,"children":227},{"style":182},[228],{"type":41,"value":185},{"type":35,"tag":136,"props":230,"children":231},{"style":163},[232],{"type":41,"value":233},"(mean_exec_time::",{"type":35,"tag":136,"props":235,"children":236},{"style":153},[237],{"type":41,"value":195},{"type":35,"tag":136,"props":239,"children":240},{"style":163},[241],{"type":41,"value":200},{"type":35,"tag":136,"props":243,"children":244},{"style":182},[245],{"type":41,"value":205},{"type":35,"tag":136,"props":247,"children":248},{"style":163},[249],{"type":41,"value":250},")  ",{"type":35,"tag":136,"props":252,"children":253},{"style":153},[254],{"type":41,"value":215},{"type":35,"tag":136,"props":256,"children":257},{"style":163},[258],{"type":41,"value":259}," avg_ms,\n",{"type":35,"tag":136,"props":261,"children":263},{"class":138,"line":262},7,[264,268,273,277,281,285,289,293],{"type":35,"tag":136,"props":265,"children":266},{"style":182},[267],{"type":41,"value":185},{"type":35,"tag":136,"props":269,"children":270},{"style":163},[271],{"type":41,"value":272},"(stddev_exec_time::",{"type":35,"tag":136,"props":274,"children":275},{"style":153},[276],{"type":41,"value":195},{"type":35,"tag":136,"props":278,"children":279},{"style":163},[280],{"type":41,"value":200},{"type":35,"tag":136,"props":282,"children":283},{"style":182},[284],{"type":41,"value":205},{"type":35,"tag":136,"props":286,"children":287},{"style":163},[288],{"type":41,"value":210},{"type":35,"tag":136,"props":290,"children":291},{"style":153},[292],{"type":41,"value":215},{"type":35,"tag":136,"props":294,"children":295},{"style":163},[296],{"type":41,"value":297}," stddev_ms\n",{"type":35,"tag":136,"props":299,"children":301},{"class":138,"line":300},8,[302,307],{"type":35,"tag":136,"props":303,"children":304},{"style":153},[305],{"type":41,"value":306},"FROM",{"type":35,"tag":136,"props":308,"children":309},{"style":163},[310],{"type":41,"value":311}," pg_stat_statements\n",{"type":35,"tag":136,"props":313,"children":315},{"class":138,"line":314},9,[316,321,326],{"type":35,"tag":136,"props":317,"children":318},{"style":153},[319],{"type":41,"value":320},"ORDER BY",{"type":35,"tag":136,"props":322,"children":323},{"style":163},[324],{"type":41,"value":325}," total_exec_time ",{"type":35,"tag":136,"props":327,"children":328},{"style":153},[329],{"type":41,"value":330},"DESC\n",{"type":35,"tag":136,"props":332,"children":334},{"class":138,"line":333},10,[335,340,345],{"type":35,"tag":136,"props":336,"children":337},{"style":153},[338],{"type":41,"value":339},"LIMIT",{"type":35,"tag":136,"props":341,"children":342},{"style":182},[343],{"type":41,"value":344}," 10",{"type":35,"tag":136,"props":346,"children":347},{"style":163},[348],{"type":41,"value":349},";\n",{"type":35,"tag":44,"props":351,"children":352},{},[353],{"type":41,"value":354},"Fix the queries at the top of this list first. A 10× improvement on a query called 10,000 times per day is worth far more than a 100× improvement on one called 20 times.",{"type":35,"tag":36,"props":356,"children":358},{"id":357},"query-optimisation-the-high-roi-fixes",[359],{"type":41,"value":360},"Query Optimisation: The High-ROI Fixes",{"type":35,"tag":362,"props":363,"children":365},"h3",{"id":364},"always-run-explain-analyze",[366],{"type":41,"value":367},"Always Run EXPLAIN ANALYZE",{"type":35,"tag":44,"props":369,"children":370},{},[371],{"type":41,"value":372},"Before touching an index or schema, understand how the database executes the query:",{"type":35,"tag":126,"props":374,"children":376},{"className":128,"code":375,"language":130,"meta":7,"style":7},"EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)\nSELECT\n    c.customer_id,\n    c.name,\n    COUNT(o.order_id)     AS order_count,\n    SUM(o.total_amount)   AS total_spent\nFROM customers c\nLEFT JOIN orders o ON c.customer_id = o.customer_id\nWHERE c.signup_date > '2024-01-01'\nGROUP BY c.customer_id, c.name\nORDER BY total_spent DESC\nLIMIT 100;\n",[377],{"type":35,"tag":81,"props":378,"children":379},{"__ignoreMap":7},[380,398,405,428,448,489,528,540,590,622,660,677],{"type":35,"tag":136,"props":381,"children":382},{"class":138,"line":139},[383,388,393],{"type":35,"tag":136,"props":384,"children":385},{"style":163},[386],{"type":41,"value":387},"EXPLAIN (ANALYZE, BUFFERS, FORMAT ",{"type":35,"tag":136,"props":389,"children":390},{"style":153},[391],{"type":41,"value":392},"TEXT",{"type":35,"tag":136,"props":394,"children":395},{"style":163},[396],{"type":41,"value":397},")\n",{"type":35,"tag":136,"props":399,"children":400},{"class":138,"line":149},[401],{"type":35,"tag":136,"props":402,"children":403},{"style":153},[404],{"type":41,"value":156},{"type":35,"tag":136,"props":406,"children":407},{"class":138,"line":159},[408,413,418,423],{"type":35,"tag":136,"props":409,"children":410},{"style":182},[411],{"type":41,"value":412},"    c",{"type":35,"tag":136,"props":414,"children":415},{"style":163},[416],{"type":41,"value":417},".",{"type":35,"tag":136,"props":419,"children":420},{"style":182},[421],{"type":41,"value":422},"customer_id",{"type":35,"tag":136,"props":424,"children":425},{"style":163},[426],{"type":41,"value":427},",\n",{"type":35,"tag":136,"props":429,"children":430},{"class":138,"line":169},[431,435,439,444],{"type":35,"tag":136,"props":432,"children":433},{"style":182},[434],{"type":41,"value":412},{"type":35,"tag":136,"props":436,"children":437},{"style":163},[438],{"type":41,"value":417},{"type":35,"tag":136,"props":440,"children":441},{"style":182},[442],{"type":41,"value":443},"name",{"type":35,"tag":136,"props":445,"children":446},{"style":163},[447],{"type":41,"value":427},{"type":35,"tag":136,"props":449,"children":450},{"class":138,"line":178},[451,456,461,466,470,475,480,484],{"type":35,"tag":136,"props":452,"children":453},{"style":182},[454],{"type":41,"value":455},"    COUNT",{"type":35,"tag":136,"props":457,"children":458},{"style":163},[459],{"type":41,"value":460},"(",{"type":35,"tag":136,"props":462,"children":463},{"style":182},[464],{"type":41,"value":465},"o",{"type":35,"tag":136,"props":467,"children":468},{"style":163},[469],{"type":41,"value":417},{"type":35,"tag":136,"props":471,"children":472},{"style":182},[473],{"type":41,"value":474},"order_id",{"type":35,"tag":136,"props":476,"children":477},{"style":163},[478],{"type":41,"value":479},")     ",{"type":35,"tag":136,"props":481,"children":482},{"style":153},[483],{"type":41,"value":215},{"type":35,"tag":136,"props":485,"children":486},{"style":163},[487],{"type":41,"value":488}," order_count,\n",{"type":35,"tag":136,"props":490,"children":491},{"class":138,"line":223},[492,497,501,505,509,514,519,523],{"type":35,"tag":136,"props":493,"children":494},{"style":182},[495],{"type":41,"value":496},"    SUM",{"type":35,"tag":136,"props":498,"children":499},{"style":163},[500],{"type":41,"value":460},{"type":35,"tag":136,"props":502,"children":503},{"style":182},[504],{"type":41,"value":465},{"type":35,"tag":136,"props":506,"children":507},{"style":163},[508],{"type":41,"value":417},{"type":35,"tag":136,"props":510,"children":511},{"style":182},[512],{"type":41,"value":513},"total_amount",{"type":35,"tag":136,"props":515,"children":516},{"style":163},[517],{"type":41,"value":518},")   ",{"type":35,"tag":136,"props":520,"children":521},{"style":153},[522],{"type":41,"value":215},{"type":35,"tag":136,"props":524,"children":525},{"style":163},[526],{"type":41,"value":527}," total_spent\n",{"type":35,"tag":136,"props":529,"children":530},{"class":138,"line":262},[531,535],{"type":35,"tag":136,"props":532,"children":533},{"style":153},[534],{"type":41,"value":306},{"type":35,"tag":136,"props":536,"children":537},{"style":163},[538],{"type":41,"value":539}," customers c\n",{"type":35,"tag":136,"props":541,"children":542},{"class":138,"line":300},[543,548,553,558,563,567,571,576,581,585],{"type":35,"tag":136,"props":544,"children":545},{"style":153},[546],{"type":41,"value":547},"LEFT JOIN",{"type":35,"tag":136,"props":549,"children":550},{"style":163},[551],{"type":41,"value":552}," orders o ",{"type":35,"tag":136,"props":554,"children":555},{"style":153},[556],{"type":41,"value":557},"ON",{"type":35,"tag":136,"props":559,"children":560},{"style":182},[561],{"type":41,"value":562}," c",{"type":35,"tag":136,"props":564,"children":565},{"style":163},[566],{"type":41,"value":417},{"type":35,"tag":136,"props":568,"children":569},{"style":182},[570],{"type":41,"value":422},{"type":35,"tag":136,"props":572,"children":573},{"style":153},[574],{"type":41,"value":575}," =",{"type":35,"tag":136,"props":577,"children":578},{"style":182},[579],{"type":41,"value":580}," o",{"type":35,"tag":136,"props":582,"children":583},{"style":163},[584],{"type":41,"value":417},{"type":35,"tag":136,"props":586,"children":587},{"style":182},[588],{"type":41,"value":589},"customer_id\n",{"type":35,"tag":136,"props":591,"children":592},{"class":138,"line":314},[593,598,602,606,611,616],{"type":35,"tag":136,"props":594,"children":595},{"style":153},[596],{"type":41,"value":597},"WHERE",{"type":35,"tag":136,"props":599,"children":600},{"style":182},[601],{"type":41,"value":562},{"type":35,"tag":136,"props":603,"children":604},{"style":163},[605],{"type":41,"value":417},{"type":35,"tag":136,"props":607,"children":608},{"style":182},[609],{"type":41,"value":610},"signup_date",{"type":35,"tag":136,"props":612,"children":613},{"style":153},[614],{"type":41,"value":615}," >",{"type":35,"tag":136,"props":617,"children":619},{"style":618},"--shiki-default:#032F62",[620],{"type":41,"value":621}," '2024-01-01'\n",{"type":35,"tag":136,"props":623,"children":624},{"class":138,"line":333},[625,630,634,638,642,646,651,655],{"type":35,"tag":136,"props":626,"children":627},{"style":153},[628],{"type":41,"value":629},"GROUP BY",{"type":35,"tag":136,"props":631,"children":632},{"style":182},[633],{"type":41,"value":562},{"type":35,"tag":136,"props":635,"children":636},{"style":163},[637],{"type":41,"value":417},{"type":35,"tag":136,"props":639,"children":640},{"style":182},[641],{"type":41,"value":422},{"type":35,"tag":136,"props":643,"children":644},{"style":163},[645],{"type":41,"value":200},{"type":35,"tag":136,"props":647,"children":648},{"style":182},[649],{"type":41,"value":650},"c",{"type":35,"tag":136,"props":652,"children":653},{"style":163},[654],{"type":41,"value":417},{"type":35,"tag":136,"props":656,"children":657},{"style":182},[658],{"type":41,"value":659},"name\n",{"type":35,"tag":136,"props":661,"children":663},{"class":138,"line":662},11,[664,668,673],{"type":35,"tag":136,"props":665,"children":666},{"style":153},[667],{"type":41,"value":320},{"type":35,"tag":136,"props":669,"children":670},{"style":163},[671],{"type":41,"value":672}," total_spent ",{"type":35,"tag":136,"props":674,"children":675},{"style":153},[676],{"type":41,"value":330},{"type":35,"tag":136,"props":678,"children":680},{"class":138,"line":679},12,[681,685,690],{"type":35,"tag":136,"props":682,"children":683},{"style":153},[684],{"type":41,"value":339},{"type":35,"tag":136,"props":686,"children":687},{"style":182},[688],{"type":41,"value":689}," 100",{"type":35,"tag":136,"props":691,"children":692},{"style":163},[693],{"type":41,"value":349},{"type":35,"tag":44,"props":695,"children":696},{},[697],{"type":41,"value":698},"Red flags in the output:",{"type":35,"tag":66,"props":700,"children":701},{},[702,713,740],{"type":35,"tag":70,"props":703,"children":704},{},[705,711],{"type":35,"tag":81,"props":706,"children":708},{"className":707},[],[709],{"type":41,"value":710},"Seq Scan",{"type":41,"value":712}," on a large table — almost always an index opportunity",{"type":35,"tag":70,"props":714,"children":715},{},[716,722,724,730,732,738],{"type":35,"tag":81,"props":717,"children":719},{"className":718},[],[720],{"type":41,"value":721},"Hash Join",{"type":41,"value":723}," with large ",{"type":35,"tag":81,"props":725,"children":727},{"className":726},[],[728],{"type":41,"value":729},"Batches",{"type":41,"value":731}," — memory pressure, increase ",{"type":35,"tag":81,"props":733,"children":735},{"className":734},[],[736],{"type":41,"value":737},"work_mem",{"type":41,"value":739}," or add an index",{"type":35,"tag":70,"props":741,"children":742},{},[743,745,751],{"type":41,"value":744},"High ",{"type":35,"tag":81,"props":746,"children":748},{"className":747},[],[749],{"type":41,"value":750},"Buffers: shared read",{"type":41,"value":752}," — data not in cache, consider a covering index",{"type":35,"tag":362,"props":754,"children":756},{"id":755},"stop-using-select",[757],{"type":41,"value":758},"Stop Using SELECT *",{"type":35,"tag":44,"props":760,"children":761},{},[762],{"type":41,"value":763},"This single habit kills performance in multiple ways: it fetches columns you'll never use, prevents covering-index optimisation, and bloats network payloads.",{"type":35,"tag":126,"props":765,"children":767},{"className":128,"code":766,"language":130,"meta":7,"style":7},"-- ❌ Fetches all 22 columns including large TEXT fields\nSELECT * FROM products WHERE category_id = 5;\n\n-- ✅ Fetches exactly what the UI renders\nSELECT product_id, name, price, stock_qty\nFROM products\nWHERE category_id = 5;\n",[768],{"type":35,"tag":81,"props":769,"children":770},{"__ignoreMap":7},[771,779,825,834,842,863,875],{"type":35,"tag":136,"props":772,"children":773},{"class":138,"line":139},[774],{"type":35,"tag":136,"props":775,"children":776},{"style":143},[777],{"type":41,"value":778},"-- ❌ Fetches all 22 columns including large TEXT fields\n",{"type":35,"tag":136,"props":780,"children":781},{"class":138,"line":149},[782,787,792,797,802,806,811,816,821],{"type":35,"tag":136,"props":783,"children":784},{"style":153},[785],{"type":41,"value":786},"SELECT",{"type":35,"tag":136,"props":788,"children":789},{"style":153},[790],{"type":41,"value":791}," *",{"type":35,"tag":136,"props":793,"children":794},{"style":153},[795],{"type":41,"value":796}," FROM",{"type":35,"tag":136,"props":798,"children":799},{"style":163},[800],{"type":41,"value":801}," products ",{"type":35,"tag":136,"props":803,"children":804},{"style":153},[805],{"type":41,"value":597},{"type":35,"tag":136,"props":807,"children":808},{"style":163},[809],{"type":41,"value":810}," category_id ",{"type":35,"tag":136,"props":812,"children":813},{"style":153},[814],{"type":41,"value":815},"=",{"type":35,"tag":136,"props":817,"children":818},{"style":182},[819],{"type":41,"value":820}," 5",{"type":35,"tag":136,"props":822,"children":823},{"style":163},[824],{"type":41,"value":349},{"type":35,"tag":136,"props":826,"children":827},{"class":138,"line":159},[828],{"type":35,"tag":136,"props":829,"children":831},{"emptyLinePlaceholder":830},true,[832],{"type":41,"value":833},"\n",{"type":35,"tag":136,"props":835,"children":836},{"class":138,"line":169},[837],{"type":35,"tag":136,"props":838,"children":839},{"style":143},[840],{"type":41,"value":841},"-- ✅ Fetches exactly what the UI renders\n",{"type":35,"tag":136,"props":843,"children":844},{"class":138,"line":178},[845,849,854,858],{"type":35,"tag":136,"props":846,"children":847},{"style":153},[848],{"type":41,"value":786},{"type":35,"tag":136,"props":850,"children":851},{"style":163},[852],{"type":41,"value":853}," product_id, ",{"type":35,"tag":136,"props":855,"children":856},{"style":153},[857],{"type":41,"value":443},{"type":35,"tag":136,"props":859,"children":860},{"style":163},[861],{"type":41,"value":862},", price, stock_qty\n",{"type":35,"tag":136,"props":864,"children":865},{"class":138,"line":223},[866,870],{"type":35,"tag":136,"props":867,"children":868},{"style":153},[869],{"type":41,"value":306},{"type":35,"tag":136,"props":871,"children":872},{"style":163},[873],{"type":41,"value":874}," products\n",{"type":35,"tag":136,"props":876,"children":877},{"class":138,"line":262},[878,882,886,890,894],{"type":35,"tag":136,"props":879,"children":880},{"style":153},[881],{"type":41,"value":597},{"type":35,"tag":136,"props":883,"children":884},{"style":163},[885],{"type":41,"value":810},{"type":35,"tag":136,"props":887,"children":888},{"style":153},[889],{"type":41,"value":815},{"type":35,"tag":136,"props":891,"children":892},{"style":182},[893],{"type":41,"value":820},{"type":35,"tag":136,"props":895,"children":896},{"style":163},[897],{"type":41,"value":349},{"type":35,"tag":362,"props":899,"children":901},{"id":900},"rewrite-correlated-subqueries-as-joins",[902],{"type":41,"value":903},"Rewrite Correlated Subqueries as Joins",{"type":35,"tag":44,"props":905,"children":906},{},[907],{"type":41,"value":908},"Correlated subqueries execute once per row of the outer query. On a table with 500,000 rows, a correlated subquery that takes 0.5ms runs for 250 seconds total.",{"type":35,"tag":126,"props":910,"children":912},{"className":128,"code":911,"language":130,"meta":7,"style":7},"-- ❌ Correlated subquery — O(n) database calls\nSELECT name,\n  (SELECT MAX(order_date) FROM orders WHERE customer_id = c.id) AS last_order\nFROM customers c;\n\n-- ✅ Single-pass join\nSELECT c.name, o.last_order\nFROM customers c\nLEFT JOIN (\n  SELECT customer_id, MAX(order_date) AS last_order\n  FROM orders\n  GROUP BY customer_id\n) o ON c.id = o.customer_id;\n",[913],{"type":35,"tag":81,"props":914,"children":915},{"__ignoreMap":7},[916,924,940,1010,1022,1029,1037,1073,1084,1096,1126,1139,1152],{"type":35,"tag":136,"props":917,"children":918},{"class":138,"line":139},[919],{"type":35,"tag":136,"props":920,"children":921},{"style":143},[922],{"type":41,"value":923},"-- ❌ Correlated subquery — O(n) database calls\n",{"type":35,"tag":136,"props":925,"children":926},{"class":138,"line":149},[927,931,936],{"type":35,"tag":136,"props":928,"children":929},{"style":153},[930],{"type":41,"value":786},{"type":35,"tag":136,"props":932,"children":933},{"style":153},[934],{"type":41,"value":935}," name",{"type":35,"tag":136,"props":937,"children":938},{"style":163},[939],{"type":41,"value":427},{"type":35,"tag":136,"props":941,"children":942},{"class":138,"line":159},[943,948,952,957,962,966,971,975,980,984,988,992,997,1001,1005],{"type":35,"tag":136,"props":944,"children":945},{"style":163},[946],{"type":41,"value":947},"  (",{"type":35,"tag":136,"props":949,"children":950},{"style":153},[951],{"type":41,"value":786},{"type":35,"tag":136,"props":953,"children":954},{"style":182},[955],{"type":41,"value":956}," MAX",{"type":35,"tag":136,"props":958,"children":959},{"style":163},[960],{"type":41,"value":961},"(order_date) ",{"type":35,"tag":136,"props":963,"children":964},{"style":153},[965],{"type":41,"value":306},{"type":35,"tag":136,"props":967,"children":968},{"style":163},[969],{"type":41,"value":970}," orders ",{"type":35,"tag":136,"props":972,"children":973},{"style":153},[974],{"type":41,"value":597},{"type":35,"tag":136,"props":976,"children":977},{"style":163},[978],{"type":41,"value":979}," customer_id ",{"type":35,"tag":136,"props":981,"children":982},{"style":153},[983],{"type":41,"value":815},{"type":35,"tag":136,"props":985,"children":986},{"style":182},[987],{"type":41,"value":562},{"type":35,"tag":136,"props":989,"children":990},{"style":163},[991],{"type":41,"value":417},{"type":35,"tag":136,"props":993,"children":994},{"style":182},[995],{"type":41,"value":996},"id",{"type":35,"tag":136,"props":998,"children":999},{"style":163},[1000],{"type":41,"value":210},{"type":35,"tag":136,"props":1002,"children":1003},{"style":153},[1004],{"type":41,"value":215},{"type":35,"tag":136,"props":1006,"children":1007},{"style":163},[1008],{"type":41,"value":1009}," last_order\n",{"type":35,"tag":136,"props":1011,"children":1012},{"class":138,"line":169},[1013,1017],{"type":35,"tag":136,"props":1014,"children":1015},{"style":153},[1016],{"type":41,"value":306},{"type":35,"tag":136,"props":1018,"children":1019},{"style":163},[1020],{"type":41,"value":1021}," customers c;\n",{"type":35,"tag":136,"props":1023,"children":1024},{"class":138,"line":178},[1025],{"type":35,"tag":136,"props":1026,"children":1027},{"emptyLinePlaceholder":830},[1028],{"type":41,"value":833},{"type":35,"tag":136,"props":1030,"children":1031},{"class":138,"line":223},[1032],{"type":35,"tag":136,"props":1033,"children":1034},{"style":143},[1035],{"type":41,"value":1036},"-- ✅ Single-pass join\n",{"type":35,"tag":136,"props":1038,"children":1039},{"class":138,"line":262},[1040,1044,1048,1052,1056,1060,1064,1068],{"type":35,"tag":136,"props":1041,"children":1042},{"style":153},[1043],{"type":41,"value":786},{"type":35,"tag":136,"props":1045,"children":1046},{"style":182},[1047],{"type":41,"value":562},{"type":35,"tag":136,"props":1049,"children":1050},{"style":163},[1051],{"type":41,"value":417},{"type":35,"tag":136,"props":1053,"children":1054},{"style":182},[1055],{"type":41,"value":443},{"type":35,"tag":136,"props":1057,"children":1058},{"style":163},[1059],{"type":41,"value":200},{"type":35,"tag":136,"props":1061,"children":1062},{"style":182},[1063],{"type":41,"value":465},{"type":35,"tag":136,"props":1065,"children":1066},{"style":163},[1067],{"type":41,"value":417},{"type":35,"tag":136,"props":1069,"children":1070},{"style":182},[1071],{"type":41,"value":1072},"last_order\n",{"type":35,"tag":136,"props":1074,"children":1075},{"class":138,"line":300},[1076,1080],{"type":35,"tag":136,"props":1077,"children":1078},{"style":153},[1079],{"type":41,"value":306},{"type":35,"tag":136,"props":1081,"children":1082},{"style":163},[1083],{"type":41,"value":539},{"type":35,"tag":136,"props":1085,"children":1086},{"class":138,"line":314},[1087,1091],{"type":35,"tag":136,"props":1088,"children":1089},{"style":153},[1090],{"type":41,"value":547},{"type":35,"tag":136,"props":1092,"children":1093},{"style":163},[1094],{"type":41,"value":1095}," (\n",{"type":35,"tag":136,"props":1097,"children":1098},{"class":138,"line":333},[1099,1104,1109,1114,1118,1122],{"type":35,"tag":136,"props":1100,"children":1101},{"style":153},[1102],{"type":41,"value":1103},"  SELECT",{"type":35,"tag":136,"props":1105,"children":1106},{"style":163},[1107],{"type":41,"value":1108}," customer_id, ",{"type":35,"tag":136,"props":1110,"children":1111},{"style":182},[1112],{"type":41,"value":1113},"MAX",{"type":35,"tag":136,"props":1115,"children":1116},{"style":163},[1117],{"type":41,"value":961},{"type":35,"tag":136,"props":1119,"children":1120},{"style":153},[1121],{"type":41,"value":215},{"type":35,"tag":136,"props":1123,"children":1124},{"style":163},[1125],{"type":41,"value":1009},{"type":35,"tag":136,"props":1127,"children":1128},{"class":138,"line":662},[1129,1134],{"type":35,"tag":136,"props":1130,"children":1131},{"style":153},[1132],{"type":41,"value":1133},"  FROM",{"type":35,"tag":136,"props":1135,"children":1136},{"style":163},[1137],{"type":41,"value":1138}," orders\n",{"type":35,"tag":136,"props":1140,"children":1141},{"class":138,"line":679},[1142,1147],{"type":35,"tag":136,"props":1143,"children":1144},{"style":153},[1145],{"type":41,"value":1146},"  GROUP BY",{"type":35,"tag":136,"props":1148,"children":1149},{"style":163},[1150],{"type":41,"value":1151}," customer_id\n",{"type":35,"tag":136,"props":1153,"children":1155},{"class":138,"line":1154},13,[1156,1161,1165,1169,1173,1177,1181,1185,1189,1193],{"type":35,"tag":136,"props":1157,"children":1158},{"style":163},[1159],{"type":41,"value":1160},") o ",{"type":35,"tag":136,"props":1162,"children":1163},{"style":153},[1164],{"type":41,"value":557},{"type":35,"tag":136,"props":1166,"children":1167},{"style":182},[1168],{"type":41,"value":562},{"type":35,"tag":136,"props":1170,"children":1171},{"style":163},[1172],{"type":41,"value":417},{"type":35,"tag":136,"props":1174,"children":1175},{"style":182},[1176],{"type":41,"value":996},{"type":35,"tag":136,"props":1178,"children":1179},{"style":153},[1180],{"type":41,"value":575},{"type":35,"tag":136,"props":1182,"children":1183},{"style":182},[1184],{"type":41,"value":580},{"type":35,"tag":136,"props":1186,"children":1187},{"style":163},[1188],{"type":41,"value":417},{"type":35,"tag":136,"props":1190,"children":1191},{"style":182},[1192],{"type":41,"value":422},{"type":35,"tag":136,"props":1194,"children":1195},{"style":163},[1196],{"type":41,"value":349},{"type":35,"tag":36,"props":1198,"children":1200},{"id":1199},"indexing-strategy",[1201],{"type":41,"value":1202},"Indexing Strategy",{"type":35,"tag":44,"props":1204,"children":1205},{},[1206],{"type":41,"value":1207},"Indexes are the single highest-leverage tool in your optimisation arsenal—but only when used intentionally.",{"type":35,"tag":362,"props":1209,"children":1211},{"id":1210},"the-index-decision-framework",[1212],{"type":41,"value":1213},"The Index Decision Framework",{"type":35,"tag":44,"props":1215,"children":1216},{},[1217],{"type":41,"value":1218},"Create an index when:",{"type":35,"tag":1220,"props":1221,"children":1222},"ol",{},[1223,1249,1254,1259],{"type":35,"tag":70,"props":1224,"children":1225},{},[1226,1228,1233,1234,1240,1242,1247],{"type":41,"value":1227},"The column appears in a ",{"type":35,"tag":81,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":41,"value":597},{"type":41,"value":200},{"type":35,"tag":81,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":41,"value":1239},"JOIN ON",{"type":41,"value":1241},", or ",{"type":35,"tag":81,"props":1243,"children":1245},{"className":1244},[],[1246],{"type":41,"value":320},{"type":41,"value":1248}," clause",{"type":35,"tag":70,"props":1250,"children":1251},{},[1252],{"type":41,"value":1253},"The column has high cardinality (many distinct values)",{"type":35,"tag":70,"props":1255,"children":1256},{},[1257],{"type":41,"value":1258},"The table has more than ~10,000 rows",{"type":35,"tag":70,"props":1260,"children":1261},{},[1262],{"type":41,"value":1263},"The read/write ratio for this table favours reads",{"type":35,"tag":44,"props":1265,"children":1266},{},[1267],{"type":41,"value":1268},"Avoid indexes when:",{"type":35,"tag":66,"props":1270,"children":1271},{},[1272,1277,1290],{"type":35,"tag":70,"props":1273,"children":1274},{},[1275],{"type":41,"value":1276},"The table is write-heavy (each index slows every INSERT/UPDATE/DELETE)",{"type":35,"tag":70,"props":1278,"children":1279},{},[1280,1282,1288],{"type":41,"value":1281},"The column has very low cardinality (e.g., a boolean ",{"type":35,"tag":81,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":41,"value":1287},"is_active",{"type":41,"value":1289},")",{"type":35,"tag":70,"props":1291,"children":1292},{},[1293],{"type":41,"value":1294},"The query planner already uses a more selective index",{"type":35,"tag":362,"props":1296,"children":1298},{"id":1297},"covering-indexes-eliminate-table-lookups",[1299],{"type":41,"value":1300},"Covering Indexes Eliminate Table Lookups",{"type":35,"tag":44,"props":1302,"children":1303},{},[1304],{"type":41,"value":1305},"A covering index includes all columns a query needs, so PostgreSQL never touches the main table:",{"type":35,"tag":126,"props":1307,"children":1309},{"className":128,"code":1308,"language":130,"meta":7,"style":7},"-- Query: find a customer's recent orders by status\nSELECT order_id, order_date, total_amount\nFROM orders\nWHERE customer_id = 12345\n  AND status = 'pending'\nORDER BY order_date DESC;\n\n-- Covering index — all queried columns live in the index\nCREATE INDEX idx_orders_customer_status_date_amount\n  ON orders (customer_id, status, order_date DESC)\n  INCLUDE (total_amount);\n",[1310],{"type":35,"tag":81,"props":1311,"children":1312},{"__ignoreMap":7},[1313,1321,1333,1344,1364,1386,1407,1414,1422,1441,1472],{"type":35,"tag":136,"props":1314,"children":1315},{"class":138,"line":139},[1316],{"type":35,"tag":136,"props":1317,"children":1318},{"style":143},[1319],{"type":41,"value":1320},"-- Query: find a customer's recent orders by status\n",{"type":35,"tag":136,"props":1322,"children":1323},{"class":138,"line":149},[1324,1328],{"type":35,"tag":136,"props":1325,"children":1326},{"style":153},[1327],{"type":41,"value":786},{"type":35,"tag":136,"props":1329,"children":1330},{"style":163},[1331],{"type":41,"value":1332}," order_id, order_date, total_amount\n",{"type":35,"tag":136,"props":1334,"children":1335},{"class":138,"line":159},[1336,1340],{"type":35,"tag":136,"props":1337,"children":1338},{"style":153},[1339],{"type":41,"value":306},{"type":35,"tag":136,"props":1341,"children":1342},{"style":163},[1343],{"type":41,"value":1138},{"type":35,"tag":136,"props":1345,"children":1346},{"class":138,"line":169},[1347,1351,1355,1359],{"type":35,"tag":136,"props":1348,"children":1349},{"style":153},[1350],{"type":41,"value":597},{"type":35,"tag":136,"props":1352,"children":1353},{"style":163},[1354],{"type":41,"value":979},{"type":35,"tag":136,"props":1356,"children":1357},{"style":153},[1358],{"type":41,"value":815},{"type":35,"tag":136,"props":1360,"children":1361},{"style":182},[1362],{"type":41,"value":1363}," 12345\n",{"type":35,"tag":136,"props":1365,"children":1366},{"class":138,"line":178},[1367,1372,1377,1381],{"type":35,"tag":136,"props":1368,"children":1369},{"style":153},[1370],{"type":41,"value":1371},"  AND",{"type":35,"tag":136,"props":1373,"children":1374},{"style":153},[1375],{"type":41,"value":1376}," status",{"type":35,"tag":136,"props":1378,"children":1379},{"style":153},[1380],{"type":41,"value":575},{"type":35,"tag":136,"props":1382,"children":1383},{"style":618},[1384],{"type":41,"value":1385}," 'pending'\n",{"type":35,"tag":136,"props":1387,"children":1388},{"class":138,"line":223},[1389,1393,1398,1403],{"type":35,"tag":136,"props":1390,"children":1391},{"style":153},[1392],{"type":41,"value":320},{"type":35,"tag":136,"props":1394,"children":1395},{"style":163},[1396],{"type":41,"value":1397}," order_date ",{"type":35,"tag":136,"props":1399,"children":1400},{"style":153},[1401],{"type":41,"value":1402},"DESC",{"type":35,"tag":136,"props":1404,"children":1405},{"style":163},[1406],{"type":41,"value":349},{"type":35,"tag":136,"props":1408,"children":1409},{"class":138,"line":262},[1410],{"type":35,"tag":136,"props":1411,"children":1412},{"emptyLinePlaceholder":830},[1413],{"type":41,"value":833},{"type":35,"tag":136,"props":1415,"children":1416},{"class":138,"line":300},[1417],{"type":35,"tag":136,"props":1418,"children":1419},{"style":143},[1420],{"type":41,"value":1421},"-- Covering index — all queried columns live in the index\n",{"type":35,"tag":136,"props":1423,"children":1424},{"class":138,"line":314},[1425,1430,1435],{"type":35,"tag":136,"props":1426,"children":1427},{"style":153},[1428],{"type":41,"value":1429},"CREATE",{"type":35,"tag":136,"props":1431,"children":1432},{"style":153},[1433],{"type":41,"value":1434}," INDEX",{"type":35,"tag":136,"props":1436,"children":1438},{"style":1437},"--shiki-default:#6F42C1",[1439],{"type":41,"value":1440}," idx_orders_customer_status_date_amount\n",{"type":35,"tag":136,"props":1442,"children":1443},{"class":138,"line":333},[1444,1449,1454,1459,1464,1468],{"type":35,"tag":136,"props":1445,"children":1446},{"style":153},[1447],{"type":41,"value":1448},"  ON",{"type":35,"tag":136,"props":1450,"children":1451},{"style":163},[1452],{"type":41,"value":1453}," orders (customer_id, ",{"type":35,"tag":136,"props":1455,"children":1456},{"style":153},[1457],{"type":41,"value":1458},"status",{"type":35,"tag":136,"props":1460,"children":1461},{"style":163},[1462],{"type":41,"value":1463},", order_date ",{"type":35,"tag":136,"props":1465,"children":1466},{"style":153},[1467],{"type":41,"value":1402},{"type":35,"tag":136,"props":1469,"children":1470},{"style":163},[1471],{"type":41,"value":397},{"type":35,"tag":136,"props":1473,"children":1474},{"class":138,"line":662},[1475,1480],{"type":35,"tag":136,"props":1476,"children":1477},{"style":153},[1478],{"type":41,"value":1479},"  INCLUDE",{"type":35,"tag":136,"props":1481,"children":1482},{"style":163},[1483],{"type":41,"value":1484}," (total_amount);\n",{"type":35,"tag":44,"props":1486,"children":1487},{},[1488,1490,1496,1498,1503],{"type":41,"value":1489},"The ",{"type":35,"tag":81,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":41,"value":1495},"INCLUDE",{"type":41,"value":1497}," clause (PostgreSQL 11+) adds ",{"type":35,"tag":81,"props":1499,"children":1501},{"className":1500},[],[1502],{"type":41,"value":513},{"type":41,"value":1504}," to leaf pages without affecting sort order, making this a true zero-heap-access query.",{"type":35,"tag":362,"props":1506,"children":1508},{"id":1507},"partial-indexes-for-selective-conditions",[1509],{"type":41,"value":1510},"Partial Indexes for Selective Conditions",{"type":35,"tag":44,"props":1512,"children":1513},{},[1514],{"type":41,"value":1515},"When you only ever query a subset of rows, index only that subset:",{"type":35,"tag":126,"props":1517,"children":1519},{"className":128,"code":1518,"language":130,"meta":7,"style":7},"-- Only active, unfulfilled orders matter for the operations dashboard\nCREATE INDEX idx_orders_unfulfilled\n  ON orders (customer_id, created_at)\n  WHERE status IN ('pending', 'processing');\n",[1520],{"type":35,"tag":81,"props":1521,"children":1522},{"__ignoreMap":7},[1523,1531,1547,1559],{"type":35,"tag":136,"props":1524,"children":1525},{"class":138,"line":139},[1526],{"type":35,"tag":136,"props":1527,"children":1528},{"style":143},[1529],{"type":41,"value":1530},"-- Only active, unfulfilled orders matter for the operations dashboard\n",{"type":35,"tag":136,"props":1532,"children":1533},{"class":138,"line":149},[1534,1538,1542],{"type":35,"tag":136,"props":1535,"children":1536},{"style":153},[1537],{"type":41,"value":1429},{"type":35,"tag":136,"props":1539,"children":1540},{"style":153},[1541],{"type":41,"value":1434},{"type":35,"tag":136,"props":1543,"children":1544},{"style":1437},[1545],{"type":41,"value":1546}," idx_orders_unfulfilled\n",{"type":35,"tag":136,"props":1548,"children":1549},{"class":138,"line":159},[1550,1554],{"type":35,"tag":136,"props":1551,"children":1552},{"style":153},[1553],{"type":41,"value":1448},{"type":35,"tag":136,"props":1555,"children":1556},{"style":163},[1557],{"type":41,"value":1558}," orders (customer_id, created_at)\n",{"type":35,"tag":136,"props":1560,"children":1561},{"class":138,"line":169},[1562,1567,1571,1576,1581,1586,1590,1595],{"type":35,"tag":136,"props":1563,"children":1564},{"style":153},[1565],{"type":41,"value":1566},"  WHERE",{"type":35,"tag":136,"props":1568,"children":1569},{"style":153},[1570],{"type":41,"value":1376},{"type":35,"tag":136,"props":1572,"children":1573},{"style":153},[1574],{"type":41,"value":1575}," IN",{"type":35,"tag":136,"props":1577,"children":1578},{"style":163},[1579],{"type":41,"value":1580}," (",{"type":35,"tag":136,"props":1582,"children":1583},{"style":618},[1584],{"type":41,"value":1585},"'pending'",{"type":35,"tag":136,"props":1587,"children":1588},{"style":163},[1589],{"type":41,"value":200},{"type":35,"tag":136,"props":1591,"children":1592},{"style":618},[1593],{"type":41,"value":1594},"'processing'",{"type":35,"tag":136,"props":1596,"children":1597},{"style":163},[1598],{"type":41,"value":1599},");\n",{"type":35,"tag":44,"props":1601,"children":1602},{},[1603],{"type":41,"value":1604},"This index is a fraction of the size of a full index on those columns, making it faster to build, cheaper to maintain, and more likely to stay in memory.",{"type":35,"tag":362,"props":1606,"children":1608},{"id":1607},"prune-dead-indexes",[1609],{"type":41,"value":1610},"Prune Dead Indexes",{"type":35,"tag":44,"props":1612,"children":1613},{},[1614],{"type":41,"value":1615},"Unused indexes are pure cost: they consume disk, slow writes, and confuse the planner. Find them:",{"type":35,"tag":126,"props":1617,"children":1619},{"className":128,"code":1618,"language":130,"meta":7,"style":7},"SELECT\n  schemaname,\n  tablename,\n  indexname,\n  idx_scan AS scans_since_restart\nFROM pg_stat_user_indexes\nWHERE idx_scan = 0\n  AND indexrelname NOT LIKE '%_pkey'\nORDER BY schemaname, tablename;\n",[1620],{"type":35,"tag":81,"props":1621,"children":1622},{"__ignoreMap":7},[1623,1630,1638,1646,1654,1671,1683,1704,1731],{"type":35,"tag":136,"props":1624,"children":1625},{"class":138,"line":139},[1626],{"type":35,"tag":136,"props":1627,"children":1628},{"style":153},[1629],{"type":41,"value":156},{"type":35,"tag":136,"props":1631,"children":1632},{"class":138,"line":149},[1633],{"type":35,"tag":136,"props":1634,"children":1635},{"style":163},[1636],{"type":41,"value":1637},"  schemaname,\n",{"type":35,"tag":136,"props":1639,"children":1640},{"class":138,"line":159},[1641],{"type":35,"tag":136,"props":1642,"children":1643},{"style":163},[1644],{"type":41,"value":1645},"  tablename,\n",{"type":35,"tag":136,"props":1647,"children":1648},{"class":138,"line":169},[1649],{"type":35,"tag":136,"props":1650,"children":1651},{"style":163},[1652],{"type":41,"value":1653},"  indexname,\n",{"type":35,"tag":136,"props":1655,"children":1656},{"class":138,"line":178},[1657,1662,1666],{"type":35,"tag":136,"props":1658,"children":1659},{"style":163},[1660],{"type":41,"value":1661},"  idx_scan ",{"type":35,"tag":136,"props":1663,"children":1664},{"style":153},[1665],{"type":41,"value":215},{"type":35,"tag":136,"props":1667,"children":1668},{"style":163},[1669],{"type":41,"value":1670}," scans_since_restart\n",{"type":35,"tag":136,"props":1672,"children":1673},{"class":138,"line":223},[1674,1678],{"type":35,"tag":136,"props":1675,"children":1676},{"style":153},[1677],{"type":41,"value":306},{"type":35,"tag":136,"props":1679,"children":1680},{"style":163},[1681],{"type":41,"value":1682}," pg_stat_user_indexes\n",{"type":35,"tag":136,"props":1684,"children":1685},{"class":138,"line":262},[1686,1690,1695,1699],{"type":35,"tag":136,"props":1687,"children":1688},{"style":153},[1689],{"type":41,"value":597},{"type":35,"tag":136,"props":1691,"children":1692},{"style":163},[1693],{"type":41,"value":1694}," idx_scan ",{"type":35,"tag":136,"props":1696,"children":1697},{"style":153},[1698],{"type":41,"value":815},{"type":35,"tag":136,"props":1700,"children":1701},{"style":182},[1702],{"type":41,"value":1703}," 0\n",{"type":35,"tag":136,"props":1705,"children":1706},{"class":138,"line":300},[1707,1711,1716,1721,1726],{"type":35,"tag":136,"props":1708,"children":1709},{"style":153},[1710],{"type":41,"value":1371},{"type":35,"tag":136,"props":1712,"children":1713},{"style":163},[1714],{"type":41,"value":1715}," indexrelname ",{"type":35,"tag":136,"props":1717,"children":1718},{"style":153},[1719],{"type":41,"value":1720},"NOT",{"type":35,"tag":136,"props":1722,"children":1723},{"style":153},[1724],{"type":41,"value":1725}," LIKE",{"type":35,"tag":136,"props":1727,"children":1728},{"style":618},[1729],{"type":41,"value":1730}," '%_pkey'\n",{"type":35,"tag":136,"props":1732,"children":1733},{"class":138,"line":314},[1734,1738],{"type":35,"tag":136,"props":1735,"children":1736},{"style":153},[1737],{"type":41,"value":320},{"type":35,"tag":136,"props":1739,"children":1740},{"style":163},[1741],{"type":41,"value":1742}," schemaname, tablename;\n",{"type":35,"tag":44,"props":1744,"children":1745},{},[1746],{"type":41,"value":1747},"Drop any index that shows zero scans and wasn't created in the last 24 hours.",{"type":35,"tag":36,"props":1749,"children":1751},{"id":1750},"caching-the-force-multiplier",[1752],{"type":41,"value":1753},"Caching: The Force Multiplier",{"type":35,"tag":44,"props":1755,"children":1756},{},[1757],{"type":41,"value":1758},"Once queries are fast, caching keeps frequently-read data out of the database entirely.",{"type":35,"tag":362,"props":1760,"children":1762},{"id":1761},"application-level-caching-with-redis",[1763],{"type":41,"value":1764},"Application-Level Caching with Redis",{"type":35,"tag":126,"props":1766,"children":1770},{"className":1767,"code":1768,"language":1769,"meta":7,"style":7},"language-csharp shiki shiki-themes github-light","public async Task\u003CProduct> GetProductAsync(int id)\n{\n    var cacheKey = $\"product:{id}\";\n\n    var cached = await _cache.GetStringAsync(cacheKey);\n    if (cached is not null)\n        return JsonSerializer.Deserialize\u003CProduct>(cached)!;\n\n    var product = await _db.Products\n        .AsNoTracking()\n        .Include(p => p.Category)\n        .FirstOrDefaultAsync(p => p.Id == id);\n\n    if (product is not null)\n    {\n        await _cache.SetStringAsync(\n            cacheKey,\n            JsonSerializer.Serialize(product),\n            new DistributedCacheEntryOptions\n            {\n                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15)\n            });\n    }\n\n    return product!;\n}\n","csharp",[1771],{"type":35,"tag":81,"props":1772,"children":1773},{"__ignoreMap":7},[1774,1830,1838,1873,1880,1916,1948,1988,1995,2020,2038,2068,2107,2114,2143,2152,2175,2184,2203,2217,2226,2262,2271,2280,2288,2309],{"type":35,"tag":136,"props":1775,"children":1776},{"class":138,"line":139},[1777,1782,1787,1792,1797,1802,1807,1812,1816,1821,1826],{"type":35,"tag":136,"props":1778,"children":1779},{"style":153},[1780],{"type":41,"value":1781},"public",{"type":35,"tag":136,"props":1783,"children":1784},{"style":153},[1785],{"type":41,"value":1786}," async",{"type":35,"tag":136,"props":1788,"children":1789},{"style":1437},[1790],{"type":41,"value":1791}," Task",{"type":35,"tag":136,"props":1793,"children":1794},{"style":163},[1795],{"type":41,"value":1796},"\u003C",{"type":35,"tag":136,"props":1798,"children":1799},{"style":1437},[1800],{"type":41,"value":1801},"Product",{"type":35,"tag":136,"props":1803,"children":1804},{"style":163},[1805],{"type":41,"value":1806},"> ",{"type":35,"tag":136,"props":1808,"children":1809},{"style":1437},[1810],{"type":41,"value":1811},"GetProductAsync",{"type":35,"tag":136,"props":1813,"children":1814},{"style":163},[1815],{"type":41,"value":460},{"type":35,"tag":136,"props":1817,"children":1818},{"style":153},[1819],{"type":41,"value":1820},"int",{"type":35,"tag":136,"props":1822,"children":1823},{"style":1437},[1824],{"type":41,"value":1825}," id",{"type":35,"tag":136,"props":1827,"children":1828},{"style":163},[1829],{"type":41,"value":397},{"type":35,"tag":136,"props":1831,"children":1832},{"class":138,"line":149},[1833],{"type":35,"tag":136,"props":1834,"children":1835},{"style":163},[1836],{"type":41,"value":1837},"{\n",{"type":35,"tag":136,"props":1839,"children":1840},{"class":138,"line":159},[1841,1846,1851,1855,1860,1864,1869],{"type":35,"tag":136,"props":1842,"children":1843},{"style":153},[1844],{"type":41,"value":1845},"    var",{"type":35,"tag":136,"props":1847,"children":1848},{"style":1437},[1849],{"type":41,"value":1850}," cacheKey",{"type":35,"tag":136,"props":1852,"children":1853},{"style":153},[1854],{"type":41,"value":575},{"type":35,"tag":136,"props":1856,"children":1857},{"style":618},[1858],{"type":41,"value":1859}," $\"product:{",{"type":35,"tag":136,"props":1861,"children":1862},{"style":163},[1863],{"type":41,"value":996},{"type":35,"tag":136,"props":1865,"children":1866},{"style":618},[1867],{"type":41,"value":1868},"}\"",{"type":35,"tag":136,"props":1870,"children":1871},{"style":163},[1872],{"type":41,"value":349},{"type":35,"tag":136,"props":1874,"children":1875},{"class":138,"line":169},[1876],{"type":35,"tag":136,"props":1877,"children":1878},{"emptyLinePlaceholder":830},[1879],{"type":41,"value":833},{"type":35,"tag":136,"props":1881,"children":1882},{"class":138,"line":178},[1883,1887,1892,1896,1901,1906,1911],{"type":35,"tag":136,"props":1884,"children":1885},{"style":153},[1886],{"type":41,"value":1845},{"type":35,"tag":136,"props":1888,"children":1889},{"style":1437},[1890],{"type":41,"value":1891}," cached",{"type":35,"tag":136,"props":1893,"children":1894},{"style":153},[1895],{"type":41,"value":575},{"type":35,"tag":136,"props":1897,"children":1898},{"style":153},[1899],{"type":41,"value":1900}," await",{"type":35,"tag":136,"props":1902,"children":1903},{"style":163},[1904],{"type":41,"value":1905}," _cache.",{"type":35,"tag":136,"props":1907,"children":1908},{"style":1437},[1909],{"type":41,"value":1910},"GetStringAsync",{"type":35,"tag":136,"props":1912,"children":1913},{"style":163},[1914],{"type":41,"value":1915},"(cacheKey);\n",{"type":35,"tag":136,"props":1917,"children":1918},{"class":138,"line":223},[1919,1924,1929,1934,1939,1944],{"type":35,"tag":136,"props":1920,"children":1921},{"style":153},[1922],{"type":41,"value":1923},"    if",{"type":35,"tag":136,"props":1925,"children":1926},{"style":163},[1927],{"type":41,"value":1928}," (cached ",{"type":35,"tag":136,"props":1930,"children":1931},{"style":153},[1932],{"type":41,"value":1933},"is",{"type":35,"tag":136,"props":1935,"children":1936},{"style":153},[1937],{"type":41,"value":1938}," not",{"type":35,"tag":136,"props":1940,"children":1941},{"style":182},[1942],{"type":41,"value":1943}," null",{"type":35,"tag":136,"props":1945,"children":1946},{"style":163},[1947],{"type":41,"value":397},{"type":35,"tag":136,"props":1949,"children":1950},{"class":138,"line":262},[1951,1956,1961,1966,1970,1974,1979,1984],{"type":35,"tag":136,"props":1952,"children":1953},{"style":153},[1954],{"type":41,"value":1955},"        return",{"type":35,"tag":136,"props":1957,"children":1958},{"style":163},[1959],{"type":41,"value":1960}," JsonSerializer.",{"type":35,"tag":136,"props":1962,"children":1963},{"style":1437},[1964],{"type":41,"value":1965},"Deserialize",{"type":35,"tag":136,"props":1967,"children":1968},{"style":163},[1969],{"type":41,"value":1796},{"type":35,"tag":136,"props":1971,"children":1972},{"style":1437},[1973],{"type":41,"value":1801},{"type":35,"tag":136,"props":1975,"children":1976},{"style":163},[1977],{"type":41,"value":1978},">(cached)",{"type":35,"tag":136,"props":1980,"children":1981},{"style":153},[1982],{"type":41,"value":1983},"!",{"type":35,"tag":136,"props":1985,"children":1986},{"style":163},[1987],{"type":41,"value":349},{"type":35,"tag":136,"props":1989,"children":1990},{"class":138,"line":300},[1991],{"type":35,"tag":136,"props":1992,"children":1993},{"emptyLinePlaceholder":830},[1994],{"type":41,"value":833},{"type":35,"tag":136,"props":1996,"children":1997},{"class":138,"line":314},[1998,2002,2007,2011,2015],{"type":35,"tag":136,"props":1999,"children":2000},{"style":153},[2001],{"type":41,"value":1845},{"type":35,"tag":136,"props":2003,"children":2004},{"style":1437},[2005],{"type":41,"value":2006}," product",{"type":35,"tag":136,"props":2008,"children":2009},{"style":153},[2010],{"type":41,"value":575},{"type":35,"tag":136,"props":2012,"children":2013},{"style":153},[2014],{"type":41,"value":1900},{"type":35,"tag":136,"props":2016,"children":2017},{"style":163},[2018],{"type":41,"value":2019}," _db.Products\n",{"type":35,"tag":136,"props":2021,"children":2022},{"class":138,"line":333},[2023,2028,2033],{"type":35,"tag":136,"props":2024,"children":2025},{"style":163},[2026],{"type":41,"value":2027},"        .",{"type":35,"tag":136,"props":2029,"children":2030},{"style":1437},[2031],{"type":41,"value":2032},"AsNoTracking",{"type":35,"tag":136,"props":2034,"children":2035},{"style":163},[2036],{"type":41,"value":2037},"()\n",{"type":35,"tag":136,"props":2039,"children":2040},{"class":138,"line":662},[2041,2045,2050,2054,2058,2063],{"type":35,"tag":136,"props":2042,"children":2043},{"style":163},[2044],{"type":41,"value":2027},{"type":35,"tag":136,"props":2046,"children":2047},{"style":1437},[2048],{"type":41,"value":2049},"Include",{"type":35,"tag":136,"props":2051,"children":2052},{"style":163},[2053],{"type":41,"value":460},{"type":35,"tag":136,"props":2055,"children":2056},{"style":1437},[2057],{"type":41,"value":44},{"type":35,"tag":136,"props":2059,"children":2060},{"style":153},[2061],{"type":41,"value":2062}," =>",{"type":35,"tag":136,"props":2064,"children":2065},{"style":163},[2066],{"type":41,"value":2067}," p.Category)\n",{"type":35,"tag":136,"props":2069,"children":2070},{"class":138,"line":679},[2071,2075,2080,2084,2088,2092,2097,2102],{"type":35,"tag":136,"props":2072,"children":2073},{"style":163},[2074],{"type":41,"value":2027},{"type":35,"tag":136,"props":2076,"children":2077},{"style":1437},[2078],{"type":41,"value":2079},"FirstOrDefaultAsync",{"type":35,"tag":136,"props":2081,"children":2082},{"style":163},[2083],{"type":41,"value":460},{"type":35,"tag":136,"props":2085,"children":2086},{"style":1437},[2087],{"type":41,"value":44},{"type":35,"tag":136,"props":2089,"children":2090},{"style":153},[2091],{"type":41,"value":2062},{"type":35,"tag":136,"props":2093,"children":2094},{"style":163},[2095],{"type":41,"value":2096}," p.Id ",{"type":35,"tag":136,"props":2098,"children":2099},{"style":153},[2100],{"type":41,"value":2101},"==",{"type":35,"tag":136,"props":2103,"children":2104},{"style":163},[2105],{"type":41,"value":2106}," id);\n",{"type":35,"tag":136,"props":2108,"children":2109},{"class":138,"line":1154},[2110],{"type":35,"tag":136,"props":2111,"children":2112},{"emptyLinePlaceholder":830},[2113],{"type":41,"value":833},{"type":35,"tag":136,"props":2115,"children":2117},{"class":138,"line":2116},14,[2118,2122,2127,2131,2135,2139],{"type":35,"tag":136,"props":2119,"children":2120},{"style":153},[2121],{"type":41,"value":1923},{"type":35,"tag":136,"props":2123,"children":2124},{"style":163},[2125],{"type":41,"value":2126}," (product ",{"type":35,"tag":136,"props":2128,"children":2129},{"style":153},[2130],{"type":41,"value":1933},{"type":35,"tag":136,"props":2132,"children":2133},{"style":153},[2134],{"type":41,"value":1938},{"type":35,"tag":136,"props":2136,"children":2137},{"style":182},[2138],{"type":41,"value":1943},{"type":35,"tag":136,"props":2140,"children":2141},{"style":163},[2142],{"type":41,"value":397},{"type":35,"tag":136,"props":2144,"children":2146},{"class":138,"line":2145},15,[2147],{"type":35,"tag":136,"props":2148,"children":2149},{"style":163},[2150],{"type":41,"value":2151},"    {\n",{"type":35,"tag":136,"props":2153,"children":2155},{"class":138,"line":2154},16,[2156,2161,2165,2170],{"type":35,"tag":136,"props":2157,"children":2158},{"style":153},[2159],{"type":41,"value":2160},"        await",{"type":35,"tag":136,"props":2162,"children":2163},{"style":163},[2164],{"type":41,"value":1905},{"type":35,"tag":136,"props":2166,"children":2167},{"style":1437},[2168],{"type":41,"value":2169},"SetStringAsync",{"type":35,"tag":136,"props":2171,"children":2172},{"style":163},[2173],{"type":41,"value":2174},"(\n",{"type":35,"tag":136,"props":2176,"children":2178},{"class":138,"line":2177},17,[2179],{"type":35,"tag":136,"props":2180,"children":2181},{"style":163},[2182],{"type":41,"value":2183},"            cacheKey,\n",{"type":35,"tag":136,"props":2185,"children":2187},{"class":138,"line":2186},18,[2188,2193,2198],{"type":35,"tag":136,"props":2189,"children":2190},{"style":163},[2191],{"type":41,"value":2192},"            JsonSerializer.",{"type":35,"tag":136,"props":2194,"children":2195},{"style":1437},[2196],{"type":41,"value":2197},"Serialize",{"type":35,"tag":136,"props":2199,"children":2200},{"style":163},[2201],{"type":41,"value":2202},"(product),\n",{"type":35,"tag":136,"props":2204,"children":2206},{"class":138,"line":2205},19,[2207,2212],{"type":35,"tag":136,"props":2208,"children":2209},{"style":153},[2210],{"type":41,"value":2211},"            new",{"type":35,"tag":136,"props":2213,"children":2214},{"style":1437},[2215],{"type":41,"value":2216}," DistributedCacheEntryOptions\n",{"type":35,"tag":136,"props":2218,"children":2220},{"class":138,"line":2219},20,[2221],{"type":35,"tag":136,"props":2222,"children":2223},{"style":163},[2224],{"type":41,"value":2225},"            {\n",{"type":35,"tag":136,"props":2227,"children":2229},{"class":138,"line":2228},21,[2230,2235,2239,2244,2249,2253,2258],{"type":35,"tag":136,"props":2231,"children":2232},{"style":163},[2233],{"type":41,"value":2234},"                AbsoluteExpirationRelativeToNow ",{"type":35,"tag":136,"props":2236,"children":2237},{"style":153},[2238],{"type":41,"value":815},{"type":35,"tag":136,"props":2240,"children":2241},{"style":163},[2242],{"type":41,"value":2243}," TimeSpan.",{"type":35,"tag":136,"props":2245,"children":2246},{"style":1437},[2247],{"type":41,"value":2248},"FromMinutes",{"type":35,"tag":136,"props":2250,"children":2251},{"style":163},[2252],{"type":41,"value":460},{"type":35,"tag":136,"props":2254,"children":2255},{"style":182},[2256],{"type":41,"value":2257},"15",{"type":35,"tag":136,"props":2259,"children":2260},{"style":163},[2261],{"type":41,"value":397},{"type":35,"tag":136,"props":2263,"children":2265},{"class":138,"line":2264},22,[2266],{"type":35,"tag":136,"props":2267,"children":2268},{"style":163},[2269],{"type":41,"value":2270},"            });\n",{"type":35,"tag":136,"props":2272,"children":2274},{"class":138,"line":2273},23,[2275],{"type":35,"tag":136,"props":2276,"children":2277},{"style":163},[2278],{"type":41,"value":2279},"    }\n",{"type":35,"tag":136,"props":2281,"children":2283},{"class":138,"line":2282},24,[2284],{"type":35,"tag":136,"props":2285,"children":2286},{"emptyLinePlaceholder":830},[2287],{"type":41,"value":833},{"type":35,"tag":136,"props":2289,"children":2291},{"class":138,"line":2290},25,[2292,2297,2301,2305],{"type":35,"tag":136,"props":2293,"children":2294},{"style":153},[2295],{"type":41,"value":2296},"    return",{"type":35,"tag":136,"props":2298,"children":2299},{"style":163},[2300],{"type":41,"value":2006},{"type":35,"tag":136,"props":2302,"children":2303},{"style":153},[2304],{"type":41,"value":1983},{"type":35,"tag":136,"props":2306,"children":2307},{"style":163},[2308],{"type":41,"value":349},{"type":35,"tag":136,"props":2310,"children":2312},{"class":138,"line":2311},26,[2313],{"type":35,"tag":136,"props":2314,"children":2315},{"style":163},[2316],{"type":41,"value":2317},"}\n",{"type":35,"tag":44,"props":2319,"children":2320},{},[2321],{"type":41,"value":2322},"Cache TTL is the hardest decision. Our rule of thumb: start at half the expected staleness tolerance, then tune based on cache-hit ratio monitoring.",{"type":35,"tag":362,"props":2324,"children":2326},{"id":2325},"materialised-views-for-analytics",[2327],{"type":41,"value":2328},"Materialised Views for Analytics",{"type":35,"tag":44,"props":2330,"children":2331},{},[2332],{"type":41,"value":2333},"Complex analytical queries over large tables should never run live against OLTP data. Materialise the result:",{"type":35,"tag":126,"props":2335,"children":2337},{"className":128,"code":2336,"language":130,"meta":7,"style":7},"CREATE MATERIALIZED VIEW mv_monthly_revenue AS\nSELECT\n    DATE_TRUNC('month', order_date)  AS month,\n    product_category,\n    SUM(amount)                       AS revenue,\n    COUNT(*)                          AS orders\nFROM orders o\nJOIN products p ON o.product_id = p.id\nGROUP BY 1, 2;\n\nCREATE INDEX ON mv_monthly_revenue (month);\n\n-- Refresh nightly (or on-demand after large data loads)\nREFRESH MATERIALIZED VIEW CONCURRENTLY mv_monthly_revenue;\n",[2338],{"type":35,"tag":81,"props":2339,"children":2340},{"__ignoreMap":7},[2341,2358,2365,2396,2404,2425,2454,2466,2514,2538,2545,2575,2582,2590],{"type":35,"tag":136,"props":2342,"children":2343},{"class":138,"line":139},[2344,2348,2353],{"type":35,"tag":136,"props":2345,"children":2346},{"style":153},[2347],{"type":41,"value":1429},{"type":35,"tag":136,"props":2349,"children":2350},{"style":163},[2351],{"type":41,"value":2352}," MATERIALIZED VIEW mv_monthly_revenue ",{"type":35,"tag":136,"props":2354,"children":2355},{"style":153},[2356],{"type":41,"value":2357},"AS\n",{"type":35,"tag":136,"props":2359,"children":2360},{"class":138,"line":149},[2361],{"type":35,"tag":136,"props":2362,"children":2363},{"style":153},[2364],{"type":41,"value":156},{"type":35,"tag":136,"props":2366,"children":2367},{"class":138,"line":159},[2368,2373,2378,2383,2387,2392],{"type":35,"tag":136,"props":2369,"children":2370},{"style":163},[2371],{"type":41,"value":2372},"    DATE_TRUNC(",{"type":35,"tag":136,"props":2374,"children":2375},{"style":618},[2376],{"type":41,"value":2377},"'month'",{"type":35,"tag":136,"props":2379,"children":2380},{"style":163},[2381],{"type":41,"value":2382},", order_date)  ",{"type":35,"tag":136,"props":2384,"children":2385},{"style":153},[2386],{"type":41,"value":215},{"type":35,"tag":136,"props":2388,"children":2389},{"style":153},[2390],{"type":41,"value":2391}," month",{"type":35,"tag":136,"props":2393,"children":2394},{"style":163},[2395],{"type":41,"value":427},{"type":35,"tag":136,"props":2397,"children":2398},{"class":138,"line":169},[2399],{"type":35,"tag":136,"props":2400,"children":2401},{"style":163},[2402],{"type":41,"value":2403},"    product_category,\n",{"type":35,"tag":136,"props":2405,"children":2406},{"class":138,"line":178},[2407,2411,2416,2420],{"type":35,"tag":136,"props":2408,"children":2409},{"style":182},[2410],{"type":41,"value":496},{"type":35,"tag":136,"props":2412,"children":2413},{"style":163},[2414],{"type":41,"value":2415},"(amount)                       ",{"type":35,"tag":136,"props":2417,"children":2418},{"style":153},[2419],{"type":41,"value":215},{"type":35,"tag":136,"props":2421,"children":2422},{"style":163},[2423],{"type":41,"value":2424}," revenue,\n",{"type":35,"tag":136,"props":2426,"children":2427},{"class":138,"line":223},[2428,2432,2436,2441,2446,2450],{"type":35,"tag":136,"props":2429,"children":2430},{"style":182},[2431],{"type":41,"value":455},{"type":35,"tag":136,"props":2433,"children":2434},{"style":163},[2435],{"type":41,"value":460},{"type":35,"tag":136,"props":2437,"children":2438},{"style":153},[2439],{"type":41,"value":2440},"*",{"type":35,"tag":136,"props":2442,"children":2443},{"style":163},[2444],{"type":41,"value":2445},")                          ",{"type":35,"tag":136,"props":2447,"children":2448},{"style":153},[2449],{"type":41,"value":215},{"type":35,"tag":136,"props":2451,"children":2452},{"style":163},[2453],{"type":41,"value":1138},{"type":35,"tag":136,"props":2455,"children":2456},{"class":138,"line":262},[2457,2461],{"type":35,"tag":136,"props":2458,"children":2459},{"style":153},[2460],{"type":41,"value":306},{"type":35,"tag":136,"props":2462,"children":2463},{"style":163},[2464],{"type":41,"value":2465}," orders o\n",{"type":35,"tag":136,"props":2467,"children":2468},{"class":138,"line":300},[2469,2474,2479,2483,2487,2491,2496,2500,2505,2509],{"type":35,"tag":136,"props":2470,"children":2471},{"style":153},[2472],{"type":41,"value":2473},"JOIN",{"type":35,"tag":136,"props":2475,"children":2476},{"style":163},[2477],{"type":41,"value":2478}," products p ",{"type":35,"tag":136,"props":2480,"children":2481},{"style":153},[2482],{"type":41,"value":557},{"type":35,"tag":136,"props":2484,"children":2485},{"style":182},[2486],{"type":41,"value":580},{"type":35,"tag":136,"props":2488,"children":2489},{"style":163},[2490],{"type":41,"value":417},{"type":35,"tag":136,"props":2492,"children":2493},{"style":182},[2494],{"type":41,"value":2495},"product_id",{"type":35,"tag":136,"props":2497,"children":2498},{"style":153},[2499],{"type":41,"value":575},{"type":35,"tag":136,"props":2501,"children":2502},{"style":182},[2503],{"type":41,"value":2504}," p",{"type":35,"tag":136,"props":2506,"children":2507},{"style":163},[2508],{"type":41,"value":417},{"type":35,"tag":136,"props":2510,"children":2511},{"style":182},[2512],{"type":41,"value":2513},"id\n",{"type":35,"tag":136,"props":2515,"children":2516},{"class":138,"line":314},[2517,2521,2526,2530,2534],{"type":35,"tag":136,"props":2518,"children":2519},{"style":153},[2520],{"type":41,"value":629},{"type":35,"tag":136,"props":2522,"children":2523},{"style":182},[2524],{"type":41,"value":2525}," 1",{"type":35,"tag":136,"props":2527,"children":2528},{"style":163},[2529],{"type":41,"value":200},{"type":35,"tag":136,"props":2531,"children":2532},{"style":182},[2533],{"type":41,"value":205},{"type":35,"tag":136,"props":2535,"children":2536},{"style":163},[2537],{"type":41,"value":349},{"type":35,"tag":136,"props":2539,"children":2540},{"class":138,"line":333},[2541],{"type":35,"tag":136,"props":2542,"children":2543},{"emptyLinePlaceholder":830},[2544],{"type":41,"value":833},{"type":35,"tag":136,"props":2546,"children":2547},{"class":138,"line":662},[2548,2552,2556,2561,2566,2571],{"type":35,"tag":136,"props":2549,"children":2550},{"style":153},[2551],{"type":41,"value":1429},{"type":35,"tag":136,"props":2553,"children":2554},{"style":153},[2555],{"type":41,"value":1434},{"type":35,"tag":136,"props":2557,"children":2558},{"style":1437},[2559],{"type":41,"value":2560}," ON",{"type":35,"tag":136,"props":2562,"children":2563},{"style":163},[2564],{"type":41,"value":2565}," mv_monthly_revenue (",{"type":35,"tag":136,"props":2567,"children":2568},{"style":153},[2569],{"type":41,"value":2570},"month",{"type":35,"tag":136,"props":2572,"children":2573},{"style":163},[2574],{"type":41,"value":1599},{"type":35,"tag":136,"props":2576,"children":2577},{"class":138,"line":679},[2578],{"type":35,"tag":136,"props":2579,"children":2580},{"emptyLinePlaceholder":830},[2581],{"type":41,"value":833},{"type":35,"tag":136,"props":2583,"children":2584},{"class":138,"line":1154},[2585],{"type":35,"tag":136,"props":2586,"children":2587},{"style":143},[2588],{"type":41,"value":2589},"-- Refresh nightly (or on-demand after large data loads)\n",{"type":35,"tag":136,"props":2591,"children":2592},{"class":138,"line":2116},[2593],{"type":35,"tag":136,"props":2594,"children":2595},{"style":163},[2596],{"type":41,"value":2597},"REFRESH MATERIALIZED VIEW CONCURRENTLY mv_monthly_revenue;\n",{"type":35,"tag":44,"props":2599,"children":2600},{},[2601,2607],{"type":35,"tag":81,"props":2602,"children":2604},{"className":2603},[],[2605],{"type":41,"value":2606},"CONCURRENTLY",{"type":41,"value":2608}," lets reads continue during the refresh — zero downtime.",{"type":35,"tag":36,"props":2610,"children":2612},{"id":2611},"real-world-results-e-commerce-platform-optimisation",[2613],{"type":41,"value":2614},"Real-World Results: E-Commerce Platform Optimisation",{"type":35,"tag":44,"props":2616,"children":2617},{},[2618],{"type":41,"value":2619},"An e-commerce client came to us handling 50,000+ daily orders with page timeouts during flash sales. Our four-week audit and remediation:",{"type":35,"tag":2621,"props":2622,"children":2623},"table",{},[2624,2643],{"type":35,"tag":2625,"props":2626,"children":2627},"thead",{},[2628],{"type":35,"tag":2629,"props":2630,"children":2631},"tr",{},[2632,2638],{"type":35,"tag":2633,"props":2634,"children":2635},"th",{},[2636],{"type":41,"value":2637},"Action",{"type":35,"tag":2633,"props":2639,"children":2640},{},[2641],{"type":41,"value":2642},"Impact",{"type":35,"tag":2644,"props":2645,"children":2646},"tbody",{},[2647,2661,2674,2687,2700],{"type":35,"tag":2629,"props":2648,"children":2649},{},[2650,2656],{"type":35,"tag":2651,"props":2652,"children":2653},"td",{},[2654],{"type":41,"value":2655},"Rewrote 15 highest-cost queries",{"type":35,"tag":2651,"props":2657,"children":2658},{},[2659],{"type":41,"value":2660},"−60% DB CPU usage",{"type":35,"tag":2629,"props":2662,"children":2663},{},[2664,2669],{"type":35,"tag":2651,"props":2665,"children":2666},{},[2667],{"type":41,"value":2668},"Added 8 strategic covering indexes",{"type":35,"tag":2651,"props":2670,"children":2671},{},[2672],{"type":41,"value":2673},"Avg query time: 1200ms → 85ms",{"type":35,"tag":2629,"props":2675,"children":2676},{},[2677,2682],{"type":35,"tag":2651,"props":2678,"children":2679},{},[2680],{"type":41,"value":2681},"Removed 5 unused indexes",{"type":35,"tag":2651,"props":2683,"children":2684},{},[2685],{"type":41,"value":2686},"Write throughput +18%",{"type":35,"tag":2629,"props":2688,"children":2689},{},[2690,2695],{"type":35,"tag":2651,"props":2691,"children":2692},{},[2693],{"type":41,"value":2694},"Added Redis for product catalogue",{"type":35,"tag":2651,"props":2696,"children":2697},{},[2698],{"type":41,"value":2699},"Cache hit rate 94%",{"type":35,"tag":2629,"props":2701,"children":2702},{},[2703,2716],{"type":35,"tag":2651,"props":2704,"children":2705},{},[2706,2708,2714],{"type":41,"value":2707},"Partitioned ",{"type":35,"tag":81,"props":2709,"children":2711},{"className":2710},[],[2712],{"type":41,"value":2713},"orders",{"type":41,"value":2715}," table by month",{"type":35,"tag":2651,"props":2717,"children":2718},{},[2719],{"type":41,"value":2720},"Flash sale timeouts eliminated",{"type":35,"tag":44,"props":2722,"children":2723},{},[2724],{"type":41,"value":2725},"The business outcome: a 24% increase in conversion rate—driven entirely by improved responsiveness. No new hardware was purchased.",{"type":35,"tag":36,"props":2727,"children":2729},{"id":2728},"schema-design-getting-it-right-upstream",[2730],{"type":41,"value":2731},"Schema Design: Getting It Right Upstream",{"type":35,"tag":44,"props":2733,"children":2734},{},[2735],{"type":41,"value":2736},"Optimising a poorly designed schema is fighting uphill. Principles that pay off long-term:",{"type":35,"tag":66,"props":2738,"children":2739},{},[2740,2750,2760,2785],{"type":35,"tag":70,"props":2741,"children":2742},{},[2743,2748],{"type":35,"tag":74,"props":2744,"children":2745},{},[2746],{"type":41,"value":2747},"Normalise transactional tables",{"type":41,"value":2749}," — eliminating update anomalies is worth the occasional join",{"type":35,"tag":70,"props":2751,"children":2752},{},[2753,2758],{"type":35,"tag":74,"props":2754,"children":2755},{},[2756],{"type":41,"value":2757},"Denormalise for reporting",{"type":41,"value":2759}," — create dedicated summary tables or materialised views rather than forcing complex joins into every report query",{"type":35,"tag":70,"props":2761,"children":2762},{},[2763,2768,2770,2775,2777,2783],{"type":35,"tag":74,"props":2764,"children":2765},{},[2766],{"type":41,"value":2767},"Partition large tables",{"type":41,"value":2769}," — partition ",{"type":35,"tag":81,"props":2771,"children":2773},{"className":2772},[],[2774],{"type":41,"value":2713},{"type":41,"value":2776}," and ",{"type":35,"tag":81,"props":2778,"children":2780},{"className":2779},[],[2781],{"type":41,"value":2782},"events",{"type":41,"value":2784}," tables by date range so old data never slows current queries",{"type":35,"tag":70,"props":2786,"children":2787},{},[2788,2793,2794,2800,2802,2808,2810,2816,2818,2824],{"type":35,"tag":74,"props":2789,"children":2790},{},[2791],{"type":41,"value":2792},"Use appropriate data types",{"type":41,"value":79},{"type":35,"tag":81,"props":2795,"children":2797},{"className":2796},[],[2798],{"type":41,"value":2799},"BIGINT",{"type":41,"value":2801}," for IDs that will exceed 2 billion, ",{"type":35,"tag":81,"props":2803,"children":2805},{"className":2804},[],[2806],{"type":41,"value":2807},"TIMESTAMPTZ",{"type":41,"value":2809}," for timestamps (always store UTC), ",{"type":35,"tag":81,"props":2811,"children":2813},{"className":2812},[],[2814],{"type":41,"value":2815},"NUMERIC(10,2)",{"type":41,"value":2817}," for money (never ",{"type":35,"tag":81,"props":2819,"children":2821},{"className":2820},[],[2822],{"type":41,"value":2823},"FLOAT",{"type":41,"value":1289},{"type":35,"tag":44,"props":2826,"children":2827},{},[2828],{"type":41,"value":2829},"Database performance is a product of schema design, query patterns, and infrastructure working together. Fix all three, and you'll handle 10× the traffic on the same hardware.",{"type":35,"tag":2831,"props":2832,"children":2833},"style",{},[2834],{"type":41,"value":2835},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":159,"depth":159,"links":2837},[2838,2839,2840,2845,2851,2855,2856],{"id":38,"depth":149,"text":42},{"id":56,"depth":149,"text":59},{"id":357,"depth":149,"text":360,"children":2841},[2842,2843,2844],{"id":364,"depth":159,"text":367},{"id":755,"depth":159,"text":758},{"id":900,"depth":159,"text":903},{"id":1199,"depth":149,"text":1202,"children":2846},[2847,2848,2849,2850],{"id":1210,"depth":159,"text":1213},{"id":1297,"depth":159,"text":1300},{"id":1507,"depth":159,"text":1510},{"id":1607,"depth":159,"text":1610},{"id":1750,"depth":149,"text":1753,"children":2852},[2853,2854],{"id":1761,"depth":159,"text":1764},{"id":2325,"depth":159,"text":2328},{"id":2611,"depth":149,"text":2614},{"id":2728,"depth":149,"text":2731},"markdown","content:blog:database-optimization.md","content","blog/database-optimization.md","blog/database-optimization","md",[2864,3521,5647],{"_path":2865,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2866,"description":2867,"slug":2868,"date":2869,"readTime":2870,"category":2871,"image":2872,"imageCaption":2873,"author":2874,"tags":2876,"body":2882,"_type":2857,"_id":3518,"_source":2859,"_file":3519,"_stem":3520,"_extension":2862},"/blog/azure-architecture-patterns","Scalable Azure Architecture Patterns Every Cloud Engineer Should Know in 2025","Explore the proven Azure architecture patterns—from Container Apps microservices to multi-region high availability—that MediaFront uses to build resilient, cost-efficient cloud applications.","azure-architecture-patterns","2025-04-10","10 min","Cloud","https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=1200&h=600&fit=crop&auto=format","Azure cloud infrastructure supporting modern microservices at global scale",{"name":17,"role":18,"avatar":19,"bio":20,"social":2875},{"github":22,"twitter":23,"linkedin":24},[2877,2878,2879,2880,2881],"Azure","Cloud Architecture","Microservices","Containers","DevOps",{"type":32,"children":2883,"toc":3507},[2884,2890,2895,2901,2906,2911,2954,2959,2967,2972,2978,2983,2988,3078,3083,3089,3094,3127,3132,3138,3143,3195,3200,3206,3211,3219,3224,3230,3235,3278,3284,3289,3431,3444,3450,3455,3498,3503],{"type":35,"tag":36,"props":2885,"children":2887},{"id":2886},"why-azure-architecture-decisions-matter-more-than-ever",[2888],{"type":41,"value":2889},"Why Azure Architecture Decisions Matter More Than Ever",{"type":35,"tag":44,"props":2891,"children":2892},{},[2893],{"type":41,"value":2894},"Choosing the wrong architecture pattern on Azure can cost a company thousands of euros per month in wasted compute and dozens of engineering hours untangling bottlenecks. Choose well, and you get an application that scales automatically, stays resilient under pressure, and grows with your business. This guide covers the five patterns we deploy most frequently at MediaFront and why each one earns its place in a modern cloud stack.",{"type":35,"tag":36,"props":2896,"children":2898},{"id":2897},"microservices-with-azure-container-apps",[2899],{"type":41,"value":2900},"Microservices with Azure Container Apps",{"type":35,"tag":44,"props":2902,"children":2903},{},[2904],{"type":41,"value":2905},"Azure Container Apps is the sweet spot between the simplicity of App Service and the raw power of AKS. It runs your containers on a serverless runtime, so you pay only for what you use while gaining all the benefits of orchestration.",{"type":35,"tag":44,"props":2907,"children":2908},{},[2909],{"type":41,"value":2910},"Key capabilities that matter in production:",{"type":35,"tag":66,"props":2912,"children":2913},{},[2914,2924,2934,2944],{"type":35,"tag":70,"props":2915,"children":2916},{},[2917,2922],{"type":35,"tag":74,"props":2918,"children":2919},{},[2920],{"type":41,"value":2921},"HTTP and event-driven scaling",{"type":41,"value":2923}," — scale a service to zero when idle, spike to hundreds of replicas during peak load without a single YAML manifest change",{"type":35,"tag":70,"props":2925,"children":2926},{},[2927,2932],{"type":35,"tag":74,"props":2928,"children":2929},{},[2930],{"type":41,"value":2931},"Revision management",{"type":41,"value":2933}," — deploy a new version, split traffic 90/10 between old and new, then cut over once telemetry confirms stability",{"type":35,"tag":70,"props":2935,"children":2936},{},[2937,2942],{"type":35,"tag":74,"props":2938,"children":2939},{},[2940],{"type":41,"value":2941},"Built-in service-to-service communication",{"type":41,"value":2943}," via Dapr sidecars, removing the networking boilerplate you'd otherwise write by hand",{"type":35,"tag":70,"props":2945,"children":2946},{},[2947,2952],{"type":35,"tag":74,"props":2948,"children":2949},{},[2950],{"type":41,"value":2951},"gRPC and WebSocket support",{"type":41,"value":2953}," — not just REST",{"type":35,"tag":44,"props":2955,"children":2956},{},[2957],{"type":41,"value":2958},"A typical three-tier architecture we ship looks like this:",{"type":35,"tag":126,"props":2960,"children":2962},{"code":2961},"Azure API Management\n  ├── Auth Service        (Container App — scales to 0 at night)\n  ├── Catalogue Service   (Container App — scales 1–20 replicas)\n  │     └── Azure Cosmos DB (multi-region writes)\n  ├── Order Service       (Container App)\n  │     └── Azure SQL     (zone-redundant)\n  └── Notification Service (Container App)\n        └── Azure Service Bus (Standard tier)\n",[2963],{"type":35,"tag":81,"props":2964,"children":2965},{"__ignoreMap":7},[2966],{"type":41,"value":2961},{"type":35,"tag":44,"props":2968,"children":2969},{},[2970],{"type":41,"value":2971},"Each service owns its data store and communicates through well-defined contracts. Teams can deploy independently, and a failure in the Notification Service never cascades into the Order Service.",{"type":35,"tag":36,"props":2973,"children":2975},{"id":2974},"event-driven-architecture-with-event-grid-and-functions",[2976],{"type":41,"value":2977},"Event-Driven Architecture with Event Grid and Functions",{"type":35,"tag":44,"props":2979,"children":2980},{},[2981],{"type":41,"value":2982},"When your system needs to react to things that happen — a file upload, a payment completing, a sensor reading arriving — an event-driven backbone beats tight REST coupling every time.",{"type":35,"tag":44,"props":2984,"children":2985},{},[2986],{"type":41,"value":2987},"Azure gives you three complementary messaging primitives:",{"type":35,"tag":2621,"props":2989,"children":2990},{},[2991,3012],{"type":35,"tag":2625,"props":2992,"children":2993},{},[2994],{"type":35,"tag":2629,"props":2995,"children":2996},{},[2997,3002,3007],{"type":35,"tag":2633,"props":2998,"children":2999},{},[3000],{"type":41,"value":3001},"Service",{"type":35,"tag":2633,"props":3003,"children":3004},{},[3005],{"type":41,"value":3006},"Best For",{"type":35,"tag":2633,"props":3008,"children":3009},{},[3010],{"type":41,"value":3011},"Throughput",{"type":35,"tag":2644,"props":3013,"children":3014},{},[3015,3036,3057],{"type":35,"tag":2629,"props":3016,"children":3017},{},[3018,3026,3031],{"type":35,"tag":2651,"props":3019,"children":3020},{},[3021],{"type":35,"tag":74,"props":3022,"children":3023},{},[3024],{"type":41,"value":3025},"Event Grid",{"type":35,"tag":2651,"props":3027,"children":3028},{},[3029],{"type":41,"value":3030},"Reactive routing of discrete events",{"type":35,"tag":2651,"props":3032,"children":3033},{},[3034],{"type":41,"value":3035},"Millions/sec",{"type":35,"tag":2629,"props":3037,"children":3038},{},[3039,3047,3052],{"type":35,"tag":2651,"props":3040,"children":3041},{},[3042],{"type":35,"tag":74,"props":3043,"children":3044},{},[3045],{"type":41,"value":3046},"Event Hubs",{"type":35,"tag":2651,"props":3048,"children":3049},{},[3050],{"type":41,"value":3051},"High-volume data streaming and ingestion",{"type":35,"tag":2651,"props":3053,"children":3054},{},[3055],{"type":41,"value":3056},"Petabyte-scale",{"type":35,"tag":2629,"props":3058,"children":3059},{},[3060,3068,3073],{"type":35,"tag":2651,"props":3061,"children":3062},{},[3063],{"type":35,"tag":74,"props":3064,"children":3065},{},[3066],{"type":41,"value":3067},"Service Bus",{"type":35,"tag":2651,"props":3069,"children":3070},{},[3071],{"type":41,"value":3072},"Reliable ordered message delivery",{"type":35,"tag":2651,"props":3074,"children":3075},{},[3076],{"type":41,"value":3077},"Enterprise-grade",{"type":35,"tag":44,"props":3079,"children":3080},{},[3081],{"type":41,"value":3082},"The pattern we reach for most: Event Grid as the central event router, Service Bus queues for per-service processing, and Azure Functions as lightweight consumers. The result is a system where adding a new feature means wiring up a new Function—not modifying existing services.",{"type":35,"tag":36,"props":3084,"children":3086},{"id":3085},"global-static-web-apps-edge-functions",[3087],{"type":41,"value":3088},"Global Static Web Apps + Edge Functions",{"type":35,"tag":44,"props":3090,"children":3091},{},[3092],{"type":41,"value":3093},"For marketing sites, SaaS dashboards, and content-heavy applications, the combination of Azure Static Web Apps with Azure Functions delivers exceptional performance at minimal cost:",{"type":35,"tag":66,"props":3095,"children":3096},{},[3097,3107,3117],{"type":35,"tag":70,"props":3098,"children":3099},{},[3100,3105],{"type":35,"tag":74,"props":3101,"children":3102},{},[3103],{"type":41,"value":3104},"Static Web Apps",{"type":41,"value":3106}," serve pre-rendered HTML, CSS, and JS from Azure's global CDN — Lighthouse scores of 95+ become routine",{"type":35,"tag":70,"props":3108,"children":3109},{},[3110,3115],{"type":35,"tag":74,"props":3111,"children":3112},{},[3113],{"type":41,"value":3114},"Integrated API",{"type":41,"value":3116}," routes live alongside your frontend in the same repository; Azure handles routing automatically",{"type":35,"tag":70,"props":3118,"children":3119},{},[3120,3125],{"type":35,"tag":74,"props":3121,"children":3122},{},[3123],{"type":41,"value":3124},"Azure Front Door",{"type":41,"value":3126}," sits in front as a global entry point, providing WAF, DDoS protection, and sub-10ms SSL termination",{"type":35,"tag":44,"props":3128,"children":3129},{},[3130],{"type":41,"value":3131},"When workloads outgrow Functions, we migrate the API layer to Azure Container Apps without touching the frontend infrastructure.",{"type":35,"tag":36,"props":3133,"children":3135},{"id":3134},"multi-region-high-availability",[3136],{"type":41,"value":3137},"Multi-Region High Availability",{"type":35,"tag":44,"props":3139,"children":3140},{},[3141],{"type":41,"value":3142},"For clients with SLA commitments above 99.9%, a single-region deployment simply isn't enough. Our multi-region blueprint:",{"type":35,"tag":1220,"props":3144,"children":3145},{},[3146,3155,3165,3175,3185],{"type":35,"tag":70,"props":3147,"children":3148},{},[3149,3153],{"type":35,"tag":74,"props":3150,"children":3151},{},[3152],{"type":41,"value":3124},{"type":41,"value":3154}," routes users to the closest healthy region via anycast",{"type":35,"tag":70,"props":3156,"children":3157},{},[3158,3163],{"type":35,"tag":74,"props":3159,"children":3160},{},[3161],{"type":41,"value":3162},"Identical application stacks",{"type":41,"value":3164}," in at least two Azure regions (paired regions where possible)",{"type":35,"tag":70,"props":3166,"children":3167},{},[3168,3173],{"type":35,"tag":74,"props":3169,"children":3170},{},[3171],{"type":41,"value":3172},"Cosmos DB multi-region writes",{"type":41,"value":3174}," — data is always written to the user's nearest region",{"type":35,"tag":70,"props":3176,"children":3177},{},[3178,3183],{"type":35,"tag":74,"props":3179,"children":3180},{},[3181],{"type":41,"value":3182},"Azure SQL Geo-Replication",{"type":41,"value":3184}," for relational workloads that need ACID guarantees",{"type":35,"tag":70,"props":3186,"children":3187},{},[3188,3193],{"type":35,"tag":74,"props":3189,"children":3190},{},[3191],{"type":41,"value":3192},"Regular chaos engineering",{"type":41,"value":3194}," — we inject failures in staging to prove the failover actually works",{"type":35,"tag":44,"props":3196,"children":3197},{},[3198],{"type":41,"value":3199},"Active-active for stateless services, active-passive with fast failover for stateful ones. The distinction matters: active-active everywhere sounds great until you need to reconcile conflicting writes.",{"type":35,"tag":36,"props":3201,"children":3203},{"id":3202},"cost-effective-data-processing-with-data-factory-and-synapse",[3204],{"type":41,"value":3205},"Cost-Effective Data Processing with Data Factory and Synapse",{"type":35,"tag":44,"props":3207,"children":3208},{},[3209],{"type":41,"value":3210},"Analytics pipelines don't need to run on expensive always-on compute. Our serverless data architecture:",{"type":35,"tag":126,"props":3212,"children":3214},{"code":3213},"Raw Data Sources → Azure Data Factory (orchestration)\n                       ↓\n                 Azure Blob Storage (cold storage, \u003C €0.02/GB)\n                       ↓\n              Azure Synapse Serverless SQL (query on demand)\n                       ↓\n                    Power BI (embedded reports)\n",[3215],{"type":35,"tag":81,"props":3216,"children":3217},{"__ignoreMap":7},[3218],{"type":41,"value":3213},{"type":35,"tag":44,"props":3220,"children":3221},{},[3222],{"type":41,"value":3223},"Data Factory handles scheduling and movement. Synapse runs complex queries against Parquet files without a warehouse to provision. Power BI surfaces the results to stakeholders. The entire stack scales from zero and costs a fraction of a dedicated data warehouse for most SME use cases.",{"type":35,"tag":36,"props":3225,"children":3227},{"id":3226},"security-zero-trust-from-day-one",[3228],{"type":41,"value":3229},"Security: Zero-Trust from Day One",{"type":35,"tag":44,"props":3231,"children":3232},{},[3233],{"type":41,"value":3234},"Across every architecture pattern above, we apply the same security baseline:",{"type":35,"tag":66,"props":3236,"children":3237},{},[3238,3248,3258,3268],{"type":35,"tag":70,"props":3239,"children":3240},{},[3241,3246],{"type":35,"tag":74,"props":3242,"children":3243},{},[3244],{"type":41,"value":3245},"Managed Identities",{"type":41,"value":3247}," everywhere — no secrets stored in environment variables or Key Vault references in app settings that could be read by anyone with Contributor access",{"type":35,"tag":70,"props":3249,"children":3250},{},[3251,3256],{"type":35,"tag":74,"props":3252,"children":3253},{},[3254],{"type":41,"value":3255},"Private Endpoints",{"type":41,"value":3257}," for all PaaS services — your Cosmos DB, Service Bus, and Storage accounts should never be reachable from the public internet",{"type":35,"tag":70,"props":3259,"children":3260},{},[3261,3266],{"type":35,"tag":74,"props":3262,"children":3263},{},[3264],{"type":41,"value":3265},"Azure Defender for Cloud",{"type":41,"value":3267}," continuously scanning for misconfiguration",{"type":35,"tag":70,"props":3269,"children":3270},{},[3271,3276],{"type":35,"tag":74,"props":3272,"children":3273},{},[3274],{"type":41,"value":3275},"Key Vault references",{"type":41,"value":3277}," in App Configuration so secrets rotate without redeployment",{"type":35,"tag":36,"props":3279,"children":3281},{"id":3280},"infrastructure-as-code-azure-bicep",[3282],{"type":41,"value":3283},"Infrastructure as Code: Azure Bicep",{"type":35,"tag":44,"props":3285,"children":3286},{},[3287],{"type":41,"value":3288},"Every pattern above is deployed through code, not the portal. We use Azure Bicep for its native Azure integration and superior readability compared to ARM templates:",{"type":35,"tag":126,"props":3290,"children":3294},{"code":3291,"language":3292,"meta":7,"className":3293,"style":7},"resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {\n  name: 'order-service'\n  location: location\n  properties: {\n    configuration: {\n      ingress: { external: false, targetPort: 8080 }\n    }\n    template: {\n      containers: [{\n        name: 'order-service'\n        image: '${acr.name}.azurecr.io/order-service:${imageTag}'\n        resources: { cpu: '0.5', memory: '1Gi' }\n      }]\n      scale: { minReplicas: 1, maxReplicas: 20 }\n    }\n  }\n}\n","bicep","language-bicep shiki shiki-themes github-light",[3295],{"type":35,"tag":81,"props":3296,"children":3297},{"__ignoreMap":7},[3298,3306,3314,3322,3330,3338,3346,3353,3361,3369,3377,3385,3393,3401,3409,3416,3424],{"type":35,"tag":136,"props":3299,"children":3300},{"class":138,"line":139},[3301],{"type":35,"tag":136,"props":3302,"children":3303},{},[3304],{"type":41,"value":3305},"resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {\n",{"type":35,"tag":136,"props":3307,"children":3308},{"class":138,"line":149},[3309],{"type":35,"tag":136,"props":3310,"children":3311},{},[3312],{"type":41,"value":3313},"  name: 'order-service'\n",{"type":35,"tag":136,"props":3315,"children":3316},{"class":138,"line":159},[3317],{"type":35,"tag":136,"props":3318,"children":3319},{},[3320],{"type":41,"value":3321},"  location: location\n",{"type":35,"tag":136,"props":3323,"children":3324},{"class":138,"line":169},[3325],{"type":35,"tag":136,"props":3326,"children":3327},{},[3328],{"type":41,"value":3329},"  properties: {\n",{"type":35,"tag":136,"props":3331,"children":3332},{"class":138,"line":178},[3333],{"type":35,"tag":136,"props":3334,"children":3335},{},[3336],{"type":41,"value":3337},"    configuration: {\n",{"type":35,"tag":136,"props":3339,"children":3340},{"class":138,"line":223},[3341],{"type":35,"tag":136,"props":3342,"children":3343},{},[3344],{"type":41,"value":3345},"      ingress: { external: false, targetPort: 8080 }\n",{"type":35,"tag":136,"props":3347,"children":3348},{"class":138,"line":262},[3349],{"type":35,"tag":136,"props":3350,"children":3351},{},[3352],{"type":41,"value":2279},{"type":35,"tag":136,"props":3354,"children":3355},{"class":138,"line":300},[3356],{"type":35,"tag":136,"props":3357,"children":3358},{},[3359],{"type":41,"value":3360},"    template: {\n",{"type":35,"tag":136,"props":3362,"children":3363},{"class":138,"line":314},[3364],{"type":35,"tag":136,"props":3365,"children":3366},{},[3367],{"type":41,"value":3368},"      containers: [{\n",{"type":35,"tag":136,"props":3370,"children":3371},{"class":138,"line":333},[3372],{"type":35,"tag":136,"props":3373,"children":3374},{},[3375],{"type":41,"value":3376},"        name: 'order-service'\n",{"type":35,"tag":136,"props":3378,"children":3379},{"class":138,"line":662},[3380],{"type":35,"tag":136,"props":3381,"children":3382},{},[3383],{"type":41,"value":3384},"        image: '${acr.name}.azurecr.io/order-service:${imageTag}'\n",{"type":35,"tag":136,"props":3386,"children":3387},{"class":138,"line":679},[3388],{"type":35,"tag":136,"props":3389,"children":3390},{},[3391],{"type":41,"value":3392},"        resources: { cpu: '0.5', memory: '1Gi' }\n",{"type":35,"tag":136,"props":3394,"children":3395},{"class":138,"line":1154},[3396],{"type":35,"tag":136,"props":3397,"children":3398},{},[3399],{"type":41,"value":3400},"      }]\n",{"type":35,"tag":136,"props":3402,"children":3403},{"class":138,"line":2116},[3404],{"type":35,"tag":136,"props":3405,"children":3406},{},[3407],{"type":41,"value":3408},"      scale: { minReplicas: 1, maxReplicas: 20 }\n",{"type":35,"tag":136,"props":3410,"children":3411},{"class":138,"line":2145},[3412],{"type":35,"tag":136,"props":3413,"children":3414},{},[3415],{"type":41,"value":2279},{"type":35,"tag":136,"props":3417,"children":3418},{"class":138,"line":2154},[3419],{"type":35,"tag":136,"props":3420,"children":3421},{},[3422],{"type":41,"value":3423},"  }\n",{"type":35,"tag":136,"props":3425,"children":3426},{"class":138,"line":2177},[3427],{"type":35,"tag":136,"props":3428,"children":3429},{},[3430],{"type":41,"value":2317},{"type":35,"tag":44,"props":3432,"children":3433},{},[3434,3436,3442],{"type":41,"value":3435},"Version-controlled infrastructure means every environment is reproducible, every change is auditable, and rollbacks are a ",{"type":35,"tag":81,"props":3437,"children":3439},{"className":3438},[],[3440],{"type":41,"value":3441},"git revert",{"type":41,"value":3443}," away.",{"type":35,"tag":36,"props":3445,"children":3447},{"id":3446},"choosing-the-right-pattern",[3448],{"type":41,"value":3449},"Choosing the Right Pattern",{"type":35,"tag":44,"props":3451,"children":3452},{},[3453],{"type":41,"value":3454},"No single pattern fits every project. Use this as a quick guide:",{"type":35,"tag":66,"props":3456,"children":3457},{},[3458,3468,3478,3488],{"type":35,"tag":70,"props":3459,"children":3460},{},[3461,3466],{"type":35,"tag":74,"props":3462,"children":3463},{},[3464],{"type":41,"value":3465},"Greenfield SaaS product",{"type":41,"value":3467},": Container Apps + Event Grid + Cosmos DB",{"type":35,"tag":70,"props":3469,"children":3470},{},[3471,3476],{"type":35,"tag":74,"props":3472,"children":3473},{},[3474],{"type":41,"value":3475},"Marketing site with dynamic API",{"type":41,"value":3477},": Static Web Apps + Functions + Azure SQL",{"type":35,"tag":70,"props":3479,"children":3480},{},[3481,3486],{"type":35,"tag":74,"props":3482,"children":3483},{},[3484],{"type":41,"value":3485},"Mission-critical transactional system",{"type":41,"value":3487},": Multi-region + Service Bus + SQL Geo-Replication",{"type":35,"tag":70,"props":3489,"children":3490},{},[3491,3496],{"type":35,"tag":74,"props":3492,"children":3493},{},[3494],{"type":41,"value":3495},"Analytics-heavy application",{"type":41,"value":3497},": Data Factory + Synapse Serverless + Power BI",{"type":35,"tag":44,"props":3499,"children":3500},{},[3501],{"type":41,"value":3502},"The best Azure architecture is the one that matches your load profile, your team's operational maturity, and your cost envelope — not the most sophisticated one you can build.",{"type":35,"tag":2831,"props":3504,"children":3505},{},[3506],{"type":41,"value":2835},{"title":7,"searchDepth":159,"depth":159,"links":3508},[3509,3510,3511,3512,3513,3514,3515,3516,3517],{"id":2886,"depth":149,"text":2889},{"id":2897,"depth":149,"text":2900},{"id":2974,"depth":149,"text":2977},{"id":3085,"depth":149,"text":3088},{"id":3134,"depth":149,"text":3137},{"id":3202,"depth":149,"text":3205},{"id":3226,"depth":149,"text":3229},{"id":3280,"depth":149,"text":3283},{"id":3446,"depth":149,"text":3449},"content:blog:azure-architecture-patterns.md","blog/azure-architecture-patterns.md","blog/azure-architecture-patterns",{"_path":3522,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3523,"description":3524,"slug":3525,"date":3526,"readTime":3527,"category":2881,"image":3528,"imageCaption":3529,"author":3530,"tags":3532,"body":3536,"_type":2857,"_id":5644,"_source":2859,"_file":5645,"_stem":5646,"_extension":2862},"/blog/containerization-guide","Docker & Kubernetes: A Complete Containerization Guide for Production-Ready Apps","From writing your first Dockerfile to orchestrating workloads with Kubernetes—a practical containerization guide covering image optimisation, security, and a real-world case study that cut deployment time from hours to minutes.","containerization-guide","2025-03-28","12 min","https://images.unsplash.com/photo-1605745341112-85968b19335b?w=1200&h=600&fit=crop&auto=format","Container infrastructure running microservices in a production Kubernetes cluster",{"name":17,"role":18,"avatar":19,"bio":20,"social":3531},{"github":22,"twitter":23,"linkedin":24},[3533,3534,2880,2881,3535],"Docker","Kubernetes","Cloud Native",{"type":32,"children":3537,"toc":5629},[3538,3544,3564,3569,3575,3580,3623,3628,3634,3639,3645,3650,3800,3806,3811,3893,4014,4020,4025,4594,4614,4620,4625,4631,4732,4738,5436,5456,5462,5467,5566,5571,5577,5582,5615,5620,5625],{"type":35,"tag":36,"props":3539,"children":3541},{"id":3540},"the-promise-and-the-reality-of-containerisation",[3542],{"type":41,"value":3543},"The Promise (and the Reality) of Containerisation",{"type":35,"tag":44,"props":3545,"children":3546},{},[3547,3549,3555,3557,3563],{"type":41,"value":3548},"Containers solve a problem every developer knows well: ",{"type":35,"tag":3550,"props":3551,"children":3552},"em",{},[3553],{"type":41,"value":3554},"\"it works on my machine.\"",{"type":41,"value":3556}," By packaging an application alongside all its runtime dependencies into a portable, reproducible unit, containers eliminate the friction between development, staging, and production environments. But getting from a working Dockerfile to a resilient, production-ready container strategy requires more than just running ",{"type":35,"tag":81,"props":3558,"children":3560},{"className":3559},[],[3561],{"type":41,"value":3562},"docker build",{"type":41,"value":417},{"type":35,"tag":44,"props":3565,"children":3566},{},[3567],{"type":41,"value":3568},"This guide walks through the full journey—from container fundamentals to Kubernetes orchestration—drawing on patterns we've refined across dozens of client projects at MediaFront.",{"type":35,"tag":36,"props":3570,"children":3572},{"id":3571},"what-containers-actually-are",[3573],{"type":41,"value":3574},"What Containers Actually Are",{"type":35,"tag":44,"props":3576,"children":3577},{},[3578],{"type":41,"value":3579},"Unlike virtual machines, containers don't virtualise hardware. They share the host operating system kernel while running in isolated user-space processes. The practical result:",{"type":35,"tag":66,"props":3581,"children":3582},{},[3583,3593,3603,3613],{"type":35,"tag":70,"props":3584,"children":3585},{},[3586,3591],{"type":35,"tag":74,"props":3587,"children":3588},{},[3589],{"type":41,"value":3590},"Startup in milliseconds",{"type":41,"value":3592},", not minutes",{"type":35,"tag":70,"props":3594,"children":3595},{},[3596,3601],{"type":35,"tag":74,"props":3597,"children":3598},{},[3599],{"type":41,"value":3600},"Image sizes in megabytes",{"type":41,"value":3602},", not gigabytes",{"type":35,"tag":70,"props":3604,"children":3605},{},[3606,3611],{"type":35,"tag":74,"props":3607,"children":3608},{},[3609],{"type":41,"value":3610},"Predictable resource usage",{"type":41,"value":3612}," — you can set hard CPU and memory limits",{"type":35,"tag":70,"props":3614,"children":3615},{},[3616,3621],{"type":35,"tag":74,"props":3617,"children":3618},{},[3619],{"type":41,"value":3620},"Immutable deployments",{"type":41,"value":3622}," — every release is a new image tag, making rollbacks trivial",{"type":35,"tag":44,"props":3624,"children":3625},{},[3626],{"type":41,"value":3627},"The trade-off: containers on the same host share the kernel, which has security implications we'll address below.",{"type":35,"tag":36,"props":3629,"children":3631},{"id":3630},"writing-production-grade-dockerfiles",[3632],{"type":41,"value":3633},"Writing Production-Grade Dockerfiles",{"type":35,"tag":44,"props":3635,"children":3636},{},[3637],{"type":41,"value":3638},"A Dockerfile is infrastructure as code for your runtime environment. Small choices here have outsized consequences in production.",{"type":35,"tag":362,"props":3640,"children":3642},{"id":3641},"use-multi-stage-builds",[3643],{"type":41,"value":3644},"Use Multi-Stage Builds",{"type":35,"tag":44,"props":3646,"children":3647},{},[3648],{"type":41,"value":3649},"Multi-stage builds separate the build toolchain from the runtime image, dramatically reducing final image size and attack surface:",{"type":35,"tag":126,"props":3651,"children":3655},{"className":3652,"code":3653,"language":3654,"meta":7,"style":7},"language-dockerfile shiki shiki-themes github-light","# Stage 1: Build\nFROM mcr.microsoft.com/dotnet/sdk:8.0 AS build\nWORKDIR /src\nCOPY [\"OrderService.csproj\", \"./\"]\nRUN dotnet restore\nCOPY . .\nRUN dotnet publish -c Release -o /app/publish\n\n# Stage 2: Runtime-only image (~100MB vs ~800MB SDK image)\nFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime\nWORKDIR /app\nEXPOSE 8080\nCOPY --from=build /app/publish .\n\n# Never run as root in production\nUSER app\n\nENTRYPOINT [\"dotnet\", \"OrderService.dll\"]\n","dockerfile",[3656],{"type":35,"tag":81,"props":3657,"children":3658},{"__ignoreMap":7},[3659,3667,3675,3683,3691,3699,3707,3715,3722,3730,3738,3746,3754,3762,3769,3777,3785,3792],{"type":35,"tag":136,"props":3660,"children":3661},{"class":138,"line":139},[3662],{"type":35,"tag":136,"props":3663,"children":3664},{},[3665],{"type":41,"value":3666},"# Stage 1: Build\n",{"type":35,"tag":136,"props":3668,"children":3669},{"class":138,"line":149},[3670],{"type":35,"tag":136,"props":3671,"children":3672},{},[3673],{"type":41,"value":3674},"FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build\n",{"type":35,"tag":136,"props":3676,"children":3677},{"class":138,"line":159},[3678],{"type":35,"tag":136,"props":3679,"children":3680},{},[3681],{"type":41,"value":3682},"WORKDIR /src\n",{"type":35,"tag":136,"props":3684,"children":3685},{"class":138,"line":169},[3686],{"type":35,"tag":136,"props":3687,"children":3688},{},[3689],{"type":41,"value":3690},"COPY [\"OrderService.csproj\", \"./\"]\n",{"type":35,"tag":136,"props":3692,"children":3693},{"class":138,"line":178},[3694],{"type":35,"tag":136,"props":3695,"children":3696},{},[3697],{"type":41,"value":3698},"RUN dotnet restore\n",{"type":35,"tag":136,"props":3700,"children":3701},{"class":138,"line":223},[3702],{"type":35,"tag":136,"props":3703,"children":3704},{},[3705],{"type":41,"value":3706},"COPY . .\n",{"type":35,"tag":136,"props":3708,"children":3709},{"class":138,"line":262},[3710],{"type":35,"tag":136,"props":3711,"children":3712},{},[3713],{"type":41,"value":3714},"RUN dotnet publish -c Release -o /app/publish\n",{"type":35,"tag":136,"props":3716,"children":3717},{"class":138,"line":300},[3718],{"type":35,"tag":136,"props":3719,"children":3720},{"emptyLinePlaceholder":830},[3721],{"type":41,"value":833},{"type":35,"tag":136,"props":3723,"children":3724},{"class":138,"line":314},[3725],{"type":35,"tag":136,"props":3726,"children":3727},{},[3728],{"type":41,"value":3729},"# Stage 2: Runtime-only image (~100MB vs ~800MB SDK image)\n",{"type":35,"tag":136,"props":3731,"children":3732},{"class":138,"line":333},[3733],{"type":35,"tag":136,"props":3734,"children":3735},{},[3736],{"type":41,"value":3737},"FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime\n",{"type":35,"tag":136,"props":3739,"children":3740},{"class":138,"line":662},[3741],{"type":35,"tag":136,"props":3742,"children":3743},{},[3744],{"type":41,"value":3745},"WORKDIR /app\n",{"type":35,"tag":136,"props":3747,"children":3748},{"class":138,"line":679},[3749],{"type":35,"tag":136,"props":3750,"children":3751},{},[3752],{"type":41,"value":3753},"EXPOSE 8080\n",{"type":35,"tag":136,"props":3755,"children":3756},{"class":138,"line":1154},[3757],{"type":35,"tag":136,"props":3758,"children":3759},{},[3760],{"type":41,"value":3761},"COPY --from=build /app/publish .\n",{"type":35,"tag":136,"props":3763,"children":3764},{"class":138,"line":2116},[3765],{"type":35,"tag":136,"props":3766,"children":3767},{"emptyLinePlaceholder":830},[3768],{"type":41,"value":833},{"type":35,"tag":136,"props":3770,"children":3771},{"class":138,"line":2145},[3772],{"type":35,"tag":136,"props":3773,"children":3774},{},[3775],{"type":41,"value":3776},"# Never run as root in production\n",{"type":35,"tag":136,"props":3778,"children":3779},{"class":138,"line":2154},[3780],{"type":35,"tag":136,"props":3781,"children":3782},{},[3783],{"type":41,"value":3784},"USER app\n",{"type":35,"tag":136,"props":3786,"children":3787},{"class":138,"line":2177},[3788],{"type":35,"tag":136,"props":3789,"children":3790},{"emptyLinePlaceholder":830},[3791],{"type":41,"value":833},{"type":35,"tag":136,"props":3793,"children":3794},{"class":138,"line":2186},[3795],{"type":35,"tag":136,"props":3796,"children":3797},{},[3798],{"type":41,"value":3799},"ENTRYPOINT [\"dotnet\", \"OrderService.dll\"]\n",{"type":35,"tag":362,"props":3801,"children":3803},{"id":3802},"security-hardening-checklist",[3804],{"type":41,"value":3805},"Security Hardening Checklist",{"type":35,"tag":44,"props":3807,"children":3808},{},[3809],{"type":41,"value":3810},"Before any image goes to production, verify:",{"type":35,"tag":66,"props":3812,"children":3813},{},[3814,3832,3842,3858,3883],{"type":35,"tag":70,"props":3815,"children":3816},{},[3817,3822,3824,3830],{"type":35,"tag":74,"props":3818,"children":3819},{},[3820],{"type":41,"value":3821},"Non-root user",{"type":41,"value":3823}," — add ",{"type":35,"tag":81,"props":3825,"children":3827},{"className":3826},[],[3828],{"type":41,"value":3829},"USER app",{"type":41,"value":3831}," (or create a dedicated user) so a compromised container doesn't have root access to the host",{"type":35,"tag":70,"props":3833,"children":3834},{},[3835,3840],{"type":35,"tag":74,"props":3836,"children":3837},{},[3838],{"type":41,"value":3839},"Read-only filesystem",{"type":41,"value":3841}," — mount volumes only where writes are genuinely needed",{"type":35,"tag":70,"props":3843,"children":3844},{},[3845,3850,3852],{"type":35,"tag":74,"props":3846,"children":3847},{},[3848],{"type":41,"value":3849},"No secrets in image layers",{"type":41,"value":3851}," — use build secrets or runtime environment injection, never ",{"type":35,"tag":81,"props":3853,"children":3855},{"className":3854},[],[3856],{"type":41,"value":3857},"COPY .env .",{"type":35,"tag":70,"props":3859,"children":3860},{},[3861,3866,3867,3873,3875,3881],{"type":35,"tag":74,"props":3862,"children":3863},{},[3864],{"type":41,"value":3865},"Pinned base image tags",{"type":41,"value":79},{"type":35,"tag":81,"props":3868,"children":3870},{"className":3869},[],[3871],{"type":41,"value":3872},"FROM node:20.14.0-alpine3.20",{"type":41,"value":3874}," is reproducible; ",{"type":35,"tag":81,"props":3876,"children":3878},{"className":3877},[],[3879],{"type":41,"value":3880},"FROM node:latest",{"type":41,"value":3882}," is a reliability hazard",{"type":35,"tag":70,"props":3884,"children":3885},{},[3886,3891],{"type":35,"tag":74,"props":3887,"children":3888},{},[3889],{"type":41,"value":3890},"Vulnerability scanning",{"type":41,"value":3892}," — integrate Trivy or Grype into your CI pipeline; fail the build on HIGH or CRITICAL findings",{"type":35,"tag":126,"props":3894,"children":3898},{"className":3895,"code":3896,"language":3897,"meta":7,"style":7},"language-yaml shiki shiki-themes github-light","# GitHub Actions step — fails PR if critical CVEs found\n- name: Scan image for vulnerabilities\n  uses: aquasecurity/trivy-action@master\n  with:\n    image-ref: ${{ env.IMAGE }}\n    exit-code: '1'\n    severity: 'CRITICAL,HIGH'\n","yaml",[3899],{"type":35,"tag":81,"props":3900,"children":3901},{"__ignoreMap":7},[3902,3910,3933,3950,3963,3980,3997],{"type":35,"tag":136,"props":3903,"children":3904},{"class":138,"line":139},[3905],{"type":35,"tag":136,"props":3906,"children":3907},{"style":143},[3908],{"type":41,"value":3909},"# GitHub Actions step — fails PR if critical CVEs found\n",{"type":35,"tag":136,"props":3911,"children":3912},{"class":138,"line":149},[3913,3918,3923,3928],{"type":35,"tag":136,"props":3914,"children":3915},{"style":163},[3916],{"type":41,"value":3917},"- ",{"type":35,"tag":136,"props":3919,"children":3921},{"style":3920},"--shiki-default:#22863A",[3922],{"type":41,"value":443},{"type":35,"tag":136,"props":3924,"children":3925},{"style":163},[3926],{"type":41,"value":3927},": ",{"type":35,"tag":136,"props":3929,"children":3930},{"style":618},[3931],{"type":41,"value":3932},"Scan image for vulnerabilities\n",{"type":35,"tag":136,"props":3934,"children":3935},{"class":138,"line":159},[3936,3941,3945],{"type":35,"tag":136,"props":3937,"children":3938},{"style":3920},[3939],{"type":41,"value":3940},"  uses",{"type":35,"tag":136,"props":3942,"children":3943},{"style":163},[3944],{"type":41,"value":3927},{"type":35,"tag":136,"props":3946,"children":3947},{"style":618},[3948],{"type":41,"value":3949},"aquasecurity/trivy-action@master\n",{"type":35,"tag":136,"props":3951,"children":3952},{"class":138,"line":169},[3953,3958],{"type":35,"tag":136,"props":3954,"children":3955},{"style":3920},[3956],{"type":41,"value":3957},"  with",{"type":35,"tag":136,"props":3959,"children":3960},{"style":163},[3961],{"type":41,"value":3962},":\n",{"type":35,"tag":136,"props":3964,"children":3965},{"class":138,"line":178},[3966,3971,3975],{"type":35,"tag":136,"props":3967,"children":3968},{"style":3920},[3969],{"type":41,"value":3970},"    image-ref",{"type":35,"tag":136,"props":3972,"children":3973},{"style":163},[3974],{"type":41,"value":3927},{"type":35,"tag":136,"props":3976,"children":3977},{"style":618},[3978],{"type":41,"value":3979},"${{ env.IMAGE }}\n",{"type":35,"tag":136,"props":3981,"children":3982},{"class":138,"line":223},[3983,3988,3992],{"type":35,"tag":136,"props":3984,"children":3985},{"style":3920},[3986],{"type":41,"value":3987},"    exit-code",{"type":35,"tag":136,"props":3989,"children":3990},{"style":163},[3991],{"type":41,"value":3927},{"type":35,"tag":136,"props":3993,"children":3994},{"style":618},[3995],{"type":41,"value":3996},"'1'\n",{"type":35,"tag":136,"props":3998,"children":3999},{"class":138,"line":262},[4000,4005,4009],{"type":35,"tag":136,"props":4001,"children":4002},{"style":3920},[4003],{"type":41,"value":4004},"    severity",{"type":35,"tag":136,"props":4006,"children":4007},{"style":163},[4008],{"type":41,"value":3927},{"type":35,"tag":136,"props":4010,"children":4011},{"style":618},[4012],{"type":41,"value":4013},"'CRITICAL,HIGH'\n",{"type":35,"tag":36,"props":4015,"children":4017},{"id":4016},"composing-services-locally-with-docker-compose",[4018],{"type":41,"value":4019},"Composing Services Locally with Docker Compose",{"type":35,"tag":44,"props":4021,"children":4022},{},[4023],{"type":41,"value":4024},"Docker Compose is the right tool for local development and integration testing. Here's a production-mirroring setup with secrets management:",{"type":35,"tag":126,"props":4026,"children":4028},{"className":3895,"code":4027,"language":3897,"meta":7,"style":7},"services:\n  api:\n    build: ./api\n    ports: [\"8080:8080\"]\n    environment:\n      DB_HOST: db\n      DB_PASSWORD_FILE: /run/secrets/db_password\n    depends_on:\n      db:\n        condition: service_healthy\n    secrets: [db_password]\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8080/health\"]\n      interval: 30s\n      timeout: 5s\n      retries: 3\n      start_period: 10s\n\n  db:\n    image: postgres:16-alpine\n    volumes: [db_data:/var/lib/postgresql/data]\n    environment:\n      POSTGRES_PASSWORD_FILE: /run/secrets/db_password\n    secrets: [db_password]\n    healthcheck:\n      test: [\"CMD\", \"pg_isready\", \"-U\", \"postgres\"]\n      interval: 10s\n\nvolumes:\n  db_data:\n\nsecrets:\n  db_password:\n    file: ./secrets/db_password.txt\n",[4029],{"type":35,"tag":81,"props":4030,"children":4031},{"__ignoreMap":7},[4032,4044,4056,4073,4096,4108,4125,4142,4154,4166,4183,4204,4216,4264,4281,4298,4315,4332,4339,4351,4368,4389,4400,4416,4435,4446,4492,4508,4516,4529,4542,4550,4563,4576],{"type":35,"tag":136,"props":4033,"children":4034},{"class":138,"line":139},[4035,4040],{"type":35,"tag":136,"props":4036,"children":4037},{"style":3920},[4038],{"type":41,"value":4039},"services",{"type":35,"tag":136,"props":4041,"children":4042},{"style":163},[4043],{"type":41,"value":3962},{"type":35,"tag":136,"props":4045,"children":4046},{"class":138,"line":149},[4047,4052],{"type":35,"tag":136,"props":4048,"children":4049},{"style":3920},[4050],{"type":41,"value":4051},"  api",{"type":35,"tag":136,"props":4053,"children":4054},{"style":163},[4055],{"type":41,"value":3962},{"type":35,"tag":136,"props":4057,"children":4058},{"class":138,"line":159},[4059,4064,4068],{"type":35,"tag":136,"props":4060,"children":4061},{"style":3920},[4062],{"type":41,"value":4063},"    build",{"type":35,"tag":136,"props":4065,"children":4066},{"style":163},[4067],{"type":41,"value":3927},{"type":35,"tag":136,"props":4069,"children":4070},{"style":618},[4071],{"type":41,"value":4072},"./api\n",{"type":35,"tag":136,"props":4074,"children":4075},{"class":138,"line":169},[4076,4081,4086,4091],{"type":35,"tag":136,"props":4077,"children":4078},{"style":3920},[4079],{"type":41,"value":4080},"    ports",{"type":35,"tag":136,"props":4082,"children":4083},{"style":163},[4084],{"type":41,"value":4085},": [",{"type":35,"tag":136,"props":4087,"children":4088},{"style":618},[4089],{"type":41,"value":4090},"\"8080:8080\"",{"type":35,"tag":136,"props":4092,"children":4093},{"style":163},[4094],{"type":41,"value":4095},"]\n",{"type":35,"tag":136,"props":4097,"children":4098},{"class":138,"line":178},[4099,4104],{"type":35,"tag":136,"props":4100,"children":4101},{"style":3920},[4102],{"type":41,"value":4103},"    environment",{"type":35,"tag":136,"props":4105,"children":4106},{"style":163},[4107],{"type":41,"value":3962},{"type":35,"tag":136,"props":4109,"children":4110},{"class":138,"line":223},[4111,4116,4120],{"type":35,"tag":136,"props":4112,"children":4113},{"style":3920},[4114],{"type":41,"value":4115},"      DB_HOST",{"type":35,"tag":136,"props":4117,"children":4118},{"style":163},[4119],{"type":41,"value":3927},{"type":35,"tag":136,"props":4121,"children":4122},{"style":618},[4123],{"type":41,"value":4124},"db\n",{"type":35,"tag":136,"props":4126,"children":4127},{"class":138,"line":262},[4128,4133,4137],{"type":35,"tag":136,"props":4129,"children":4130},{"style":3920},[4131],{"type":41,"value":4132},"      DB_PASSWORD_FILE",{"type":35,"tag":136,"props":4134,"children":4135},{"style":163},[4136],{"type":41,"value":3927},{"type":35,"tag":136,"props":4138,"children":4139},{"style":618},[4140],{"type":41,"value":4141},"/run/secrets/db_password\n",{"type":35,"tag":136,"props":4143,"children":4144},{"class":138,"line":300},[4145,4150],{"type":35,"tag":136,"props":4146,"children":4147},{"style":3920},[4148],{"type":41,"value":4149},"    depends_on",{"type":35,"tag":136,"props":4151,"children":4152},{"style":163},[4153],{"type":41,"value":3962},{"type":35,"tag":136,"props":4155,"children":4156},{"class":138,"line":314},[4157,4162],{"type":35,"tag":136,"props":4158,"children":4159},{"style":3920},[4160],{"type":41,"value":4161},"      db",{"type":35,"tag":136,"props":4163,"children":4164},{"style":163},[4165],{"type":41,"value":3962},{"type":35,"tag":136,"props":4167,"children":4168},{"class":138,"line":333},[4169,4174,4178],{"type":35,"tag":136,"props":4170,"children":4171},{"style":3920},[4172],{"type":41,"value":4173},"        condition",{"type":35,"tag":136,"props":4175,"children":4176},{"style":163},[4177],{"type":41,"value":3927},{"type":35,"tag":136,"props":4179,"children":4180},{"style":618},[4181],{"type":41,"value":4182},"service_healthy\n",{"type":35,"tag":136,"props":4184,"children":4185},{"class":138,"line":662},[4186,4191,4195,4200],{"type":35,"tag":136,"props":4187,"children":4188},{"style":3920},[4189],{"type":41,"value":4190},"    secrets",{"type":35,"tag":136,"props":4192,"children":4193},{"style":163},[4194],{"type":41,"value":4085},{"type":35,"tag":136,"props":4196,"children":4197},{"style":618},[4198],{"type":41,"value":4199},"db_password",{"type":35,"tag":136,"props":4201,"children":4202},{"style":163},[4203],{"type":41,"value":4095},{"type":35,"tag":136,"props":4205,"children":4206},{"class":138,"line":679},[4207,4212],{"type":35,"tag":136,"props":4208,"children":4209},{"style":3920},[4210],{"type":41,"value":4211},"    healthcheck",{"type":35,"tag":136,"props":4213,"children":4214},{"style":163},[4215],{"type":41,"value":3962},{"type":35,"tag":136,"props":4217,"children":4218},{"class":138,"line":1154},[4219,4224,4228,4233,4237,4242,4246,4251,4255,4260],{"type":35,"tag":136,"props":4220,"children":4221},{"style":3920},[4222],{"type":41,"value":4223},"      test",{"type":35,"tag":136,"props":4225,"children":4226},{"style":163},[4227],{"type":41,"value":4085},{"type":35,"tag":136,"props":4229,"children":4230},{"style":618},[4231],{"type":41,"value":4232},"\"CMD\"",{"type":35,"tag":136,"props":4234,"children":4235},{"style":163},[4236],{"type":41,"value":200},{"type":35,"tag":136,"props":4238,"children":4239},{"style":618},[4240],{"type":41,"value":4241},"\"curl\"",{"type":35,"tag":136,"props":4243,"children":4244},{"style":163},[4245],{"type":41,"value":200},{"type":35,"tag":136,"props":4247,"children":4248},{"style":618},[4249],{"type":41,"value":4250},"\"-f\"",{"type":35,"tag":136,"props":4252,"children":4253},{"style":163},[4254],{"type":41,"value":200},{"type":35,"tag":136,"props":4256,"children":4257},{"style":618},[4258],{"type":41,"value":4259},"\"http://localhost:8080/health\"",{"type":35,"tag":136,"props":4261,"children":4262},{"style":163},[4263],{"type":41,"value":4095},{"type":35,"tag":136,"props":4265,"children":4266},{"class":138,"line":2116},[4267,4272,4276],{"type":35,"tag":136,"props":4268,"children":4269},{"style":3920},[4270],{"type":41,"value":4271},"      interval",{"type":35,"tag":136,"props":4273,"children":4274},{"style":163},[4275],{"type":41,"value":3927},{"type":35,"tag":136,"props":4277,"children":4278},{"style":618},[4279],{"type":41,"value":4280},"30s\n",{"type":35,"tag":136,"props":4282,"children":4283},{"class":138,"line":2145},[4284,4289,4293],{"type":35,"tag":136,"props":4285,"children":4286},{"style":3920},[4287],{"type":41,"value":4288},"      timeout",{"type":35,"tag":136,"props":4290,"children":4291},{"style":163},[4292],{"type":41,"value":3927},{"type":35,"tag":136,"props":4294,"children":4295},{"style":618},[4296],{"type":41,"value":4297},"5s\n",{"type":35,"tag":136,"props":4299,"children":4300},{"class":138,"line":2154},[4301,4306,4310],{"type":35,"tag":136,"props":4302,"children":4303},{"style":3920},[4304],{"type":41,"value":4305},"      retries",{"type":35,"tag":136,"props":4307,"children":4308},{"style":163},[4309],{"type":41,"value":3927},{"type":35,"tag":136,"props":4311,"children":4312},{"style":182},[4313],{"type":41,"value":4314},"3\n",{"type":35,"tag":136,"props":4316,"children":4317},{"class":138,"line":2177},[4318,4323,4327],{"type":35,"tag":136,"props":4319,"children":4320},{"style":3920},[4321],{"type":41,"value":4322},"      start_period",{"type":35,"tag":136,"props":4324,"children":4325},{"style":163},[4326],{"type":41,"value":3927},{"type":35,"tag":136,"props":4328,"children":4329},{"style":618},[4330],{"type":41,"value":4331},"10s\n",{"type":35,"tag":136,"props":4333,"children":4334},{"class":138,"line":2186},[4335],{"type":35,"tag":136,"props":4336,"children":4337},{"emptyLinePlaceholder":830},[4338],{"type":41,"value":833},{"type":35,"tag":136,"props":4340,"children":4341},{"class":138,"line":2205},[4342,4347],{"type":35,"tag":136,"props":4343,"children":4344},{"style":3920},[4345],{"type":41,"value":4346},"  db",{"type":35,"tag":136,"props":4348,"children":4349},{"style":163},[4350],{"type":41,"value":3962},{"type":35,"tag":136,"props":4352,"children":4353},{"class":138,"line":2219},[4354,4359,4363],{"type":35,"tag":136,"props":4355,"children":4356},{"style":3920},[4357],{"type":41,"value":4358},"    image",{"type":35,"tag":136,"props":4360,"children":4361},{"style":163},[4362],{"type":41,"value":3927},{"type":35,"tag":136,"props":4364,"children":4365},{"style":618},[4366],{"type":41,"value":4367},"postgres:16-alpine\n",{"type":35,"tag":136,"props":4369,"children":4370},{"class":138,"line":2228},[4371,4376,4380,4385],{"type":35,"tag":136,"props":4372,"children":4373},{"style":3920},[4374],{"type":41,"value":4375},"    volumes",{"type":35,"tag":136,"props":4377,"children":4378},{"style":163},[4379],{"type":41,"value":4085},{"type":35,"tag":136,"props":4381,"children":4382},{"style":618},[4383],{"type":41,"value":4384},"db_data:/var/lib/postgresql/data",{"type":35,"tag":136,"props":4386,"children":4387},{"style":163},[4388],{"type":41,"value":4095},{"type":35,"tag":136,"props":4390,"children":4391},{"class":138,"line":2264},[4392,4396],{"type":35,"tag":136,"props":4393,"children":4394},{"style":3920},[4395],{"type":41,"value":4103},{"type":35,"tag":136,"props":4397,"children":4398},{"style":163},[4399],{"type":41,"value":3962},{"type":35,"tag":136,"props":4401,"children":4402},{"class":138,"line":2273},[4403,4408,4412],{"type":35,"tag":136,"props":4404,"children":4405},{"style":3920},[4406],{"type":41,"value":4407},"      POSTGRES_PASSWORD_FILE",{"type":35,"tag":136,"props":4409,"children":4410},{"style":163},[4411],{"type":41,"value":3927},{"type":35,"tag":136,"props":4413,"children":4414},{"style":618},[4415],{"type":41,"value":4141},{"type":35,"tag":136,"props":4417,"children":4418},{"class":138,"line":2282},[4419,4423,4427,4431],{"type":35,"tag":136,"props":4420,"children":4421},{"style":3920},[4422],{"type":41,"value":4190},{"type":35,"tag":136,"props":4424,"children":4425},{"style":163},[4426],{"type":41,"value":4085},{"type":35,"tag":136,"props":4428,"children":4429},{"style":618},[4430],{"type":41,"value":4199},{"type":35,"tag":136,"props":4432,"children":4433},{"style":163},[4434],{"type":41,"value":4095},{"type":35,"tag":136,"props":4436,"children":4437},{"class":138,"line":2290},[4438,4442],{"type":35,"tag":136,"props":4439,"children":4440},{"style":3920},[4441],{"type":41,"value":4211},{"type":35,"tag":136,"props":4443,"children":4444},{"style":163},[4445],{"type":41,"value":3962},{"type":35,"tag":136,"props":4447,"children":4448},{"class":138,"line":2311},[4449,4453,4457,4461,4465,4470,4474,4479,4483,4488],{"type":35,"tag":136,"props":4450,"children":4451},{"style":3920},[4452],{"type":41,"value":4223},{"type":35,"tag":136,"props":4454,"children":4455},{"style":163},[4456],{"type":41,"value":4085},{"type":35,"tag":136,"props":4458,"children":4459},{"style":618},[4460],{"type":41,"value":4232},{"type":35,"tag":136,"props":4462,"children":4463},{"style":163},[4464],{"type":41,"value":200},{"type":35,"tag":136,"props":4466,"children":4467},{"style":618},[4468],{"type":41,"value":4469},"\"pg_isready\"",{"type":35,"tag":136,"props":4471,"children":4472},{"style":163},[4473],{"type":41,"value":200},{"type":35,"tag":136,"props":4475,"children":4476},{"style":618},[4477],{"type":41,"value":4478},"\"-U\"",{"type":35,"tag":136,"props":4480,"children":4481},{"style":163},[4482],{"type":41,"value":200},{"type":35,"tag":136,"props":4484,"children":4485},{"style":618},[4486],{"type":41,"value":4487},"\"postgres\"",{"type":35,"tag":136,"props":4489,"children":4490},{"style":163},[4491],{"type":41,"value":4095},{"type":35,"tag":136,"props":4493,"children":4495},{"class":138,"line":4494},27,[4496,4500,4504],{"type":35,"tag":136,"props":4497,"children":4498},{"style":3920},[4499],{"type":41,"value":4271},{"type":35,"tag":136,"props":4501,"children":4502},{"style":163},[4503],{"type":41,"value":3927},{"type":35,"tag":136,"props":4505,"children":4506},{"style":618},[4507],{"type":41,"value":4331},{"type":35,"tag":136,"props":4509,"children":4511},{"class":138,"line":4510},28,[4512],{"type":35,"tag":136,"props":4513,"children":4514},{"emptyLinePlaceholder":830},[4515],{"type":41,"value":833},{"type":35,"tag":136,"props":4517,"children":4519},{"class":138,"line":4518},29,[4520,4525],{"type":35,"tag":136,"props":4521,"children":4522},{"style":3920},[4523],{"type":41,"value":4524},"volumes",{"type":35,"tag":136,"props":4526,"children":4527},{"style":163},[4528],{"type":41,"value":3962},{"type":35,"tag":136,"props":4530,"children":4532},{"class":138,"line":4531},30,[4533,4538],{"type":35,"tag":136,"props":4534,"children":4535},{"style":3920},[4536],{"type":41,"value":4537},"  db_data",{"type":35,"tag":136,"props":4539,"children":4540},{"style":163},[4541],{"type":41,"value":3962},{"type":35,"tag":136,"props":4543,"children":4545},{"class":138,"line":4544},31,[4546],{"type":35,"tag":136,"props":4547,"children":4548},{"emptyLinePlaceholder":830},[4549],{"type":41,"value":833},{"type":35,"tag":136,"props":4551,"children":4553},{"class":138,"line":4552},32,[4554,4559],{"type":35,"tag":136,"props":4555,"children":4556},{"style":3920},[4557],{"type":41,"value":4558},"secrets",{"type":35,"tag":136,"props":4560,"children":4561},{"style":163},[4562],{"type":41,"value":3962},{"type":35,"tag":136,"props":4564,"children":4566},{"class":138,"line":4565},33,[4567,4572],{"type":35,"tag":136,"props":4568,"children":4569},{"style":3920},[4570],{"type":41,"value":4571},"  db_password",{"type":35,"tag":136,"props":4573,"children":4574},{"style":163},[4575],{"type":41,"value":3962},{"type":35,"tag":136,"props":4577,"children":4579},{"class":138,"line":4578},34,[4580,4585,4589],{"type":35,"tag":136,"props":4581,"children":4582},{"style":3920},[4583],{"type":41,"value":4584},"    file",{"type":35,"tag":136,"props":4586,"children":4587},{"style":163},[4588],{"type":41,"value":3927},{"type":35,"tag":136,"props":4590,"children":4591},{"style":618},[4592],{"type":41,"value":4593},"./secrets/db_password.txt\n",{"type":35,"tag":44,"props":4595,"children":4596},{},[4597,4599,4605,4606,4612],{"type":41,"value":4598},"Two things worth highlighting here: ",{"type":35,"tag":81,"props":4600,"children":4602},{"className":4601},[],[4603],{"type":41,"value":4604},"depends_on",{"type":41,"value":106},{"type":35,"tag":81,"props":4607,"children":4609},{"className":4608},[],[4610],{"type":41,"value":4611},"condition: service_healthy",{"type":41,"value":4613}," ensures the API only starts once the database is truly ready (not just the container process), and secrets are mounted as files rather than plain environment variables—reducing the risk of accidental exposure in logs.",{"type":35,"tag":36,"props":4615,"children":4617},{"id":4616},"kubernetes-orchestration-that-scales",[4618],{"type":41,"value":4619},"Kubernetes: Orchestration That Scales",{"type":35,"tag":44,"props":4621,"children":4622},{},[4623],{"type":41,"value":4624},"Kubernetes (K8s) takes over where Docker Compose leaves off. When you need automatic self-healing, zero-downtime deploys, and the ability to run hundreds of container replicas across a cluster, Kubernetes is the answer.",{"type":35,"tag":362,"props":4626,"children":4628},{"id":4627},"core-kubernetes-primitives",[4629],{"type":41,"value":4630},"Core Kubernetes Primitives",{"type":35,"tag":2621,"props":4632,"children":4633},{},[4634,4650],{"type":35,"tag":2625,"props":4635,"children":4636},{},[4637],{"type":35,"tag":2629,"props":4638,"children":4639},{},[4640,4645],{"type":35,"tag":2633,"props":4641,"children":4642},{},[4643],{"type":41,"value":4644},"Object",{"type":35,"tag":2633,"props":4646,"children":4647},{},[4648],{"type":41,"value":4649},"Purpose",{"type":35,"tag":2644,"props":4651,"children":4652},{},[4653,4669,4685,4700,4716],{"type":35,"tag":2629,"props":4654,"children":4655},{},[4656,4664],{"type":35,"tag":2651,"props":4657,"children":4658},{},[4659],{"type":35,"tag":74,"props":4660,"children":4661},{},[4662],{"type":41,"value":4663},"Pod",{"type":35,"tag":2651,"props":4665,"children":4666},{},[4667],{"type":41,"value":4668},"Smallest deployable unit; one or more containers sharing networking and storage",{"type":35,"tag":2629,"props":4670,"children":4671},{},[4672,4680],{"type":35,"tag":2651,"props":4673,"children":4674},{},[4675],{"type":35,"tag":74,"props":4676,"children":4677},{},[4678],{"type":41,"value":4679},"Deployment",{"type":35,"tag":2651,"props":4681,"children":4682},{},[4683],{"type":41,"value":4684},"Declares desired state; manages rolling updates and rollbacks",{"type":35,"tag":2629,"props":4686,"children":4687},{},[4688,4695],{"type":35,"tag":2651,"props":4689,"children":4690},{},[4691],{"type":35,"tag":74,"props":4692,"children":4693},{},[4694],{"type":41,"value":3001},{"type":35,"tag":2651,"props":4696,"children":4697},{},[4698],{"type":41,"value":4699},"Stable network endpoint in front of a set of pods",{"type":35,"tag":2629,"props":4701,"children":4702},{},[4703,4711],{"type":35,"tag":2651,"props":4704,"children":4705},{},[4706],{"type":35,"tag":74,"props":4707,"children":4708},{},[4709],{"type":41,"value":4710},"ConfigMap / Secret",{"type":35,"tag":2651,"props":4712,"children":4713},{},[4714],{"type":41,"value":4715},"Externalise configuration and credentials from images",{"type":35,"tag":2629,"props":4717,"children":4718},{},[4719,4727],{"type":35,"tag":2651,"props":4720,"children":4721},{},[4722],{"type":35,"tag":74,"props":4723,"children":4724},{},[4725],{"type":41,"value":4726},"HorizontalPodAutoscaler",{"type":35,"tag":2651,"props":4728,"children":4729},{},[4730],{"type":41,"value":4731},"Automatically scales replica count based on CPU, memory, or custom metrics",{"type":35,"tag":362,"props":4733,"children":4735},{"id":4734},"a-production-deployment-manifest",[4736],{"type":41,"value":4737},"A Production Deployment Manifest",{"type":35,"tag":126,"props":4739,"children":4741},{"className":3895,"code":4740,"language":3897,"meta":7,"style":7},"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: order-service\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: order-service\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxUnavailable: 0       # Never take a pod down before a new one is ready\n      maxSurge: 1\n  template:\n    metadata:\n      labels:\n        app: order-service\n    spec:\n      containers:\n      - name: order-service\n        image: registry.example.com/order-service:v2.4.1\n        ports: [{containerPort: 8080}]\n        resources:\n          requests:\n            cpu: \"250m\"\n            memory: \"256Mi\"\n          limits:\n            cpu: \"500m\"\n            memory: \"512Mi\"\n        livenessProbe:\n          httpGet:\n            path: /health/live\n            port: 8080\n          initialDelaySeconds: 10\n          periodSeconds: 15\n        readinessProbe:\n          httpGet:\n            path: /health/ready\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 10\n        securityContext:\n          runAsNonRoot: true\n          readOnlyRootFilesystem: true\n",[4742],{"type":35,"tag":81,"props":4743,"children":4744},{"__ignoreMap":7},[4745,4762,4779,4791,4808,4820,4836,4848,4860,4876,4888,4905,4917,4939,4956,4968,4980,4992,5008,5020,5032,5052,5069,5101,5113,5125,5142,5159,5171,5187,5203,5215,5227,5244,5261,5279,5297,5310,5322,5339,5355,5372,5388,5401,5419],{"type":35,"tag":136,"props":4746,"children":4747},{"class":138,"line":139},[4748,4753,4757],{"type":35,"tag":136,"props":4749,"children":4750},{"style":3920},[4751],{"type":41,"value":4752},"apiVersion",{"type":35,"tag":136,"props":4754,"children":4755},{"style":163},[4756],{"type":41,"value":3927},{"type":35,"tag":136,"props":4758,"children":4759},{"style":618},[4760],{"type":41,"value":4761},"apps/v1\n",{"type":35,"tag":136,"props":4763,"children":4764},{"class":138,"line":149},[4765,4770,4774],{"type":35,"tag":136,"props":4766,"children":4767},{"style":3920},[4768],{"type":41,"value":4769},"kind",{"type":35,"tag":136,"props":4771,"children":4772},{"style":163},[4773],{"type":41,"value":3927},{"type":35,"tag":136,"props":4775,"children":4776},{"style":618},[4777],{"type":41,"value":4778},"Deployment\n",{"type":35,"tag":136,"props":4780,"children":4781},{"class":138,"line":159},[4782,4787],{"type":35,"tag":136,"props":4783,"children":4784},{"style":3920},[4785],{"type":41,"value":4786},"metadata",{"type":35,"tag":136,"props":4788,"children":4789},{"style":163},[4790],{"type":41,"value":3962},{"type":35,"tag":136,"props":4792,"children":4793},{"class":138,"line":169},[4794,4799,4803],{"type":35,"tag":136,"props":4795,"children":4796},{"style":3920},[4797],{"type":41,"value":4798},"  name",{"type":35,"tag":136,"props":4800,"children":4801},{"style":163},[4802],{"type":41,"value":3927},{"type":35,"tag":136,"props":4804,"children":4805},{"style":618},[4806],{"type":41,"value":4807},"order-service\n",{"type":35,"tag":136,"props":4809,"children":4810},{"class":138,"line":178},[4811,4816],{"type":35,"tag":136,"props":4812,"children":4813},{"style":3920},[4814],{"type":41,"value":4815},"spec",{"type":35,"tag":136,"props":4817,"children":4818},{"style":163},[4819],{"type":41,"value":3962},{"type":35,"tag":136,"props":4821,"children":4822},{"class":138,"line":223},[4823,4828,4832],{"type":35,"tag":136,"props":4824,"children":4825},{"style":3920},[4826],{"type":41,"value":4827},"  replicas",{"type":35,"tag":136,"props":4829,"children":4830},{"style":163},[4831],{"type":41,"value":3927},{"type":35,"tag":136,"props":4833,"children":4834},{"style":182},[4835],{"type":41,"value":4314},{"type":35,"tag":136,"props":4837,"children":4838},{"class":138,"line":262},[4839,4844],{"type":35,"tag":136,"props":4840,"children":4841},{"style":3920},[4842],{"type":41,"value":4843},"  selector",{"type":35,"tag":136,"props":4845,"children":4846},{"style":163},[4847],{"type":41,"value":3962},{"type":35,"tag":136,"props":4849,"children":4850},{"class":138,"line":300},[4851,4856],{"type":35,"tag":136,"props":4852,"children":4853},{"style":3920},[4854],{"type":41,"value":4855},"    matchLabels",{"type":35,"tag":136,"props":4857,"children":4858},{"style":163},[4859],{"type":41,"value":3962},{"type":35,"tag":136,"props":4861,"children":4862},{"class":138,"line":314},[4863,4868,4872],{"type":35,"tag":136,"props":4864,"children":4865},{"style":3920},[4866],{"type":41,"value":4867},"      app",{"type":35,"tag":136,"props":4869,"children":4870},{"style":163},[4871],{"type":41,"value":3927},{"type":35,"tag":136,"props":4873,"children":4874},{"style":618},[4875],{"type":41,"value":4807},{"type":35,"tag":136,"props":4877,"children":4878},{"class":138,"line":333},[4879,4884],{"type":35,"tag":136,"props":4880,"children":4881},{"style":3920},[4882],{"type":41,"value":4883},"  strategy",{"type":35,"tag":136,"props":4885,"children":4886},{"style":163},[4887],{"type":41,"value":3962},{"type":35,"tag":136,"props":4889,"children":4890},{"class":138,"line":662},[4891,4896,4900],{"type":35,"tag":136,"props":4892,"children":4893},{"style":3920},[4894],{"type":41,"value":4895},"    type",{"type":35,"tag":136,"props":4897,"children":4898},{"style":163},[4899],{"type":41,"value":3927},{"type":35,"tag":136,"props":4901,"children":4902},{"style":618},[4903],{"type":41,"value":4904},"RollingUpdate\n",{"type":35,"tag":136,"props":4906,"children":4907},{"class":138,"line":679},[4908,4913],{"type":35,"tag":136,"props":4909,"children":4910},{"style":3920},[4911],{"type":41,"value":4912},"    rollingUpdate",{"type":35,"tag":136,"props":4914,"children":4915},{"style":163},[4916],{"type":41,"value":3962},{"type":35,"tag":136,"props":4918,"children":4919},{"class":138,"line":1154},[4920,4925,4929,4934],{"type":35,"tag":136,"props":4921,"children":4922},{"style":3920},[4923],{"type":41,"value":4924},"      maxUnavailable",{"type":35,"tag":136,"props":4926,"children":4927},{"style":163},[4928],{"type":41,"value":3927},{"type":35,"tag":136,"props":4930,"children":4931},{"style":182},[4932],{"type":41,"value":4933},"0",{"type":35,"tag":136,"props":4935,"children":4936},{"style":143},[4937],{"type":41,"value":4938},"       # Never take a pod down before a new one is ready\n",{"type":35,"tag":136,"props":4940,"children":4941},{"class":138,"line":2116},[4942,4947,4951],{"type":35,"tag":136,"props":4943,"children":4944},{"style":3920},[4945],{"type":41,"value":4946},"      maxSurge",{"type":35,"tag":136,"props":4948,"children":4949},{"style":163},[4950],{"type":41,"value":3927},{"type":35,"tag":136,"props":4952,"children":4953},{"style":182},[4954],{"type":41,"value":4955},"1\n",{"type":35,"tag":136,"props":4957,"children":4958},{"class":138,"line":2145},[4959,4964],{"type":35,"tag":136,"props":4960,"children":4961},{"style":3920},[4962],{"type":41,"value":4963},"  template",{"type":35,"tag":136,"props":4965,"children":4966},{"style":163},[4967],{"type":41,"value":3962},{"type":35,"tag":136,"props":4969,"children":4970},{"class":138,"line":2154},[4971,4976],{"type":35,"tag":136,"props":4972,"children":4973},{"style":3920},[4974],{"type":41,"value":4975},"    metadata",{"type":35,"tag":136,"props":4977,"children":4978},{"style":163},[4979],{"type":41,"value":3962},{"type":35,"tag":136,"props":4981,"children":4982},{"class":138,"line":2177},[4983,4988],{"type":35,"tag":136,"props":4984,"children":4985},{"style":3920},[4986],{"type":41,"value":4987},"      labels",{"type":35,"tag":136,"props":4989,"children":4990},{"style":163},[4991],{"type":41,"value":3962},{"type":35,"tag":136,"props":4993,"children":4994},{"class":138,"line":2186},[4995,5000,5004],{"type":35,"tag":136,"props":4996,"children":4997},{"style":3920},[4998],{"type":41,"value":4999},"        app",{"type":35,"tag":136,"props":5001,"children":5002},{"style":163},[5003],{"type":41,"value":3927},{"type":35,"tag":136,"props":5005,"children":5006},{"style":618},[5007],{"type":41,"value":4807},{"type":35,"tag":136,"props":5009,"children":5010},{"class":138,"line":2205},[5011,5016],{"type":35,"tag":136,"props":5012,"children":5013},{"style":3920},[5014],{"type":41,"value":5015},"    spec",{"type":35,"tag":136,"props":5017,"children":5018},{"style":163},[5019],{"type":41,"value":3962},{"type":35,"tag":136,"props":5021,"children":5022},{"class":138,"line":2219},[5023,5028],{"type":35,"tag":136,"props":5024,"children":5025},{"style":3920},[5026],{"type":41,"value":5027},"      containers",{"type":35,"tag":136,"props":5029,"children":5030},{"style":163},[5031],{"type":41,"value":3962},{"type":35,"tag":136,"props":5033,"children":5034},{"class":138,"line":2228},[5035,5040,5044,5048],{"type":35,"tag":136,"props":5036,"children":5037},{"style":163},[5038],{"type":41,"value":5039},"      - ",{"type":35,"tag":136,"props":5041,"children":5042},{"style":3920},[5043],{"type":41,"value":443},{"type":35,"tag":136,"props":5045,"children":5046},{"style":163},[5047],{"type":41,"value":3927},{"type":35,"tag":136,"props":5049,"children":5050},{"style":618},[5051],{"type":41,"value":4807},{"type":35,"tag":136,"props":5053,"children":5054},{"class":138,"line":2264},[5055,5060,5064],{"type":35,"tag":136,"props":5056,"children":5057},{"style":3920},[5058],{"type":41,"value":5059},"        image",{"type":35,"tag":136,"props":5061,"children":5062},{"style":163},[5063],{"type":41,"value":3927},{"type":35,"tag":136,"props":5065,"children":5066},{"style":618},[5067],{"type":41,"value":5068},"registry.example.com/order-service:v2.4.1\n",{"type":35,"tag":136,"props":5070,"children":5071},{"class":138,"line":2273},[5072,5077,5082,5087,5091,5096],{"type":35,"tag":136,"props":5073,"children":5074},{"style":3920},[5075],{"type":41,"value":5076},"        ports",{"type":35,"tag":136,"props":5078,"children":5079},{"style":163},[5080],{"type":41,"value":5081},": [{",{"type":35,"tag":136,"props":5083,"children":5084},{"style":3920},[5085],{"type":41,"value":5086},"containerPort",{"type":35,"tag":136,"props":5088,"children":5089},{"style":163},[5090],{"type":41,"value":3927},{"type":35,"tag":136,"props":5092,"children":5093},{"style":182},[5094],{"type":41,"value":5095},"8080",{"type":35,"tag":136,"props":5097,"children":5098},{"style":163},[5099],{"type":41,"value":5100},"}]\n",{"type":35,"tag":136,"props":5102,"children":5103},{"class":138,"line":2282},[5104,5109],{"type":35,"tag":136,"props":5105,"children":5106},{"style":3920},[5107],{"type":41,"value":5108},"        resources",{"type":35,"tag":136,"props":5110,"children":5111},{"style":163},[5112],{"type":41,"value":3962},{"type":35,"tag":136,"props":5114,"children":5115},{"class":138,"line":2290},[5116,5121],{"type":35,"tag":136,"props":5117,"children":5118},{"style":3920},[5119],{"type":41,"value":5120},"          requests",{"type":35,"tag":136,"props":5122,"children":5123},{"style":163},[5124],{"type":41,"value":3962},{"type":35,"tag":136,"props":5126,"children":5127},{"class":138,"line":2311},[5128,5133,5137],{"type":35,"tag":136,"props":5129,"children":5130},{"style":3920},[5131],{"type":41,"value":5132},"            cpu",{"type":35,"tag":136,"props":5134,"children":5135},{"style":163},[5136],{"type":41,"value":3927},{"type":35,"tag":136,"props":5138,"children":5139},{"style":618},[5140],{"type":41,"value":5141},"\"250m\"\n",{"type":35,"tag":136,"props":5143,"children":5144},{"class":138,"line":4494},[5145,5150,5154],{"type":35,"tag":136,"props":5146,"children":5147},{"style":3920},[5148],{"type":41,"value":5149},"            memory",{"type":35,"tag":136,"props":5151,"children":5152},{"style":163},[5153],{"type":41,"value":3927},{"type":35,"tag":136,"props":5155,"children":5156},{"style":618},[5157],{"type":41,"value":5158},"\"256Mi\"\n",{"type":35,"tag":136,"props":5160,"children":5161},{"class":138,"line":4510},[5162,5167],{"type":35,"tag":136,"props":5163,"children":5164},{"style":3920},[5165],{"type":41,"value":5166},"          limits",{"type":35,"tag":136,"props":5168,"children":5169},{"style":163},[5170],{"type":41,"value":3962},{"type":35,"tag":136,"props":5172,"children":5173},{"class":138,"line":4518},[5174,5178,5182],{"type":35,"tag":136,"props":5175,"children":5176},{"style":3920},[5177],{"type":41,"value":5132},{"type":35,"tag":136,"props":5179,"children":5180},{"style":163},[5181],{"type":41,"value":3927},{"type":35,"tag":136,"props":5183,"children":5184},{"style":618},[5185],{"type":41,"value":5186},"\"500m\"\n",{"type":35,"tag":136,"props":5188,"children":5189},{"class":138,"line":4531},[5190,5194,5198],{"type":35,"tag":136,"props":5191,"children":5192},{"style":3920},[5193],{"type":41,"value":5149},{"type":35,"tag":136,"props":5195,"children":5196},{"style":163},[5197],{"type":41,"value":3927},{"type":35,"tag":136,"props":5199,"children":5200},{"style":618},[5201],{"type":41,"value":5202},"\"512Mi\"\n",{"type":35,"tag":136,"props":5204,"children":5205},{"class":138,"line":4544},[5206,5211],{"type":35,"tag":136,"props":5207,"children":5208},{"style":3920},[5209],{"type":41,"value":5210},"        livenessProbe",{"type":35,"tag":136,"props":5212,"children":5213},{"style":163},[5214],{"type":41,"value":3962},{"type":35,"tag":136,"props":5216,"children":5217},{"class":138,"line":4552},[5218,5223],{"type":35,"tag":136,"props":5219,"children":5220},{"style":3920},[5221],{"type":41,"value":5222},"          httpGet",{"type":35,"tag":136,"props":5224,"children":5225},{"style":163},[5226],{"type":41,"value":3962},{"type":35,"tag":136,"props":5228,"children":5229},{"class":138,"line":4565},[5230,5235,5239],{"type":35,"tag":136,"props":5231,"children":5232},{"style":3920},[5233],{"type":41,"value":5234},"            path",{"type":35,"tag":136,"props":5236,"children":5237},{"style":163},[5238],{"type":41,"value":3927},{"type":35,"tag":136,"props":5240,"children":5241},{"style":618},[5242],{"type":41,"value":5243},"/health/live\n",{"type":35,"tag":136,"props":5245,"children":5246},{"class":138,"line":4578},[5247,5252,5256],{"type":35,"tag":136,"props":5248,"children":5249},{"style":3920},[5250],{"type":41,"value":5251},"            port",{"type":35,"tag":136,"props":5253,"children":5254},{"style":163},[5255],{"type":41,"value":3927},{"type":35,"tag":136,"props":5257,"children":5258},{"style":182},[5259],{"type":41,"value":5260},"8080\n",{"type":35,"tag":136,"props":5262,"children":5264},{"class":138,"line":5263},35,[5265,5270,5274],{"type":35,"tag":136,"props":5266,"children":5267},{"style":3920},[5268],{"type":41,"value":5269},"          initialDelaySeconds",{"type":35,"tag":136,"props":5271,"children":5272},{"style":163},[5273],{"type":41,"value":3927},{"type":35,"tag":136,"props":5275,"children":5276},{"style":182},[5277],{"type":41,"value":5278},"10\n",{"type":35,"tag":136,"props":5280,"children":5282},{"class":138,"line":5281},36,[5283,5288,5292],{"type":35,"tag":136,"props":5284,"children":5285},{"style":3920},[5286],{"type":41,"value":5287},"          periodSeconds",{"type":35,"tag":136,"props":5289,"children":5290},{"style":163},[5291],{"type":41,"value":3927},{"type":35,"tag":136,"props":5293,"children":5294},{"style":182},[5295],{"type":41,"value":5296},"15\n",{"type":35,"tag":136,"props":5298,"children":5300},{"class":138,"line":5299},37,[5301,5306],{"type":35,"tag":136,"props":5302,"children":5303},{"style":3920},[5304],{"type":41,"value":5305},"        readinessProbe",{"type":35,"tag":136,"props":5307,"children":5308},{"style":163},[5309],{"type":41,"value":3962},{"type":35,"tag":136,"props":5311,"children":5313},{"class":138,"line":5312},38,[5314,5318],{"type":35,"tag":136,"props":5315,"children":5316},{"style":3920},[5317],{"type":41,"value":5222},{"type":35,"tag":136,"props":5319,"children":5320},{"style":163},[5321],{"type":41,"value":3962},{"type":35,"tag":136,"props":5323,"children":5325},{"class":138,"line":5324},39,[5326,5330,5334],{"type":35,"tag":136,"props":5327,"children":5328},{"style":3920},[5329],{"type":41,"value":5234},{"type":35,"tag":136,"props":5331,"children":5332},{"style":163},[5333],{"type":41,"value":3927},{"type":35,"tag":136,"props":5335,"children":5336},{"style":618},[5337],{"type":41,"value":5338},"/health/ready\n",{"type":35,"tag":136,"props":5340,"children":5342},{"class":138,"line":5341},40,[5343,5347,5351],{"type":35,"tag":136,"props":5344,"children":5345},{"style":3920},[5346],{"type":41,"value":5251},{"type":35,"tag":136,"props":5348,"children":5349},{"style":163},[5350],{"type":41,"value":3927},{"type":35,"tag":136,"props":5352,"children":5353},{"style":182},[5354],{"type":41,"value":5260},{"type":35,"tag":136,"props":5356,"children":5358},{"class":138,"line":5357},41,[5359,5363,5367],{"type":35,"tag":136,"props":5360,"children":5361},{"style":3920},[5362],{"type":41,"value":5269},{"type":35,"tag":136,"props":5364,"children":5365},{"style":163},[5366],{"type":41,"value":3927},{"type":35,"tag":136,"props":5368,"children":5369},{"style":182},[5370],{"type":41,"value":5371},"5\n",{"type":35,"tag":136,"props":5373,"children":5375},{"class":138,"line":5374},42,[5376,5380,5384],{"type":35,"tag":136,"props":5377,"children":5378},{"style":3920},[5379],{"type":41,"value":5287},{"type":35,"tag":136,"props":5381,"children":5382},{"style":163},[5383],{"type":41,"value":3927},{"type":35,"tag":136,"props":5385,"children":5386},{"style":182},[5387],{"type":41,"value":5278},{"type":35,"tag":136,"props":5389,"children":5391},{"class":138,"line":5390},43,[5392,5397],{"type":35,"tag":136,"props":5393,"children":5394},{"style":3920},[5395],{"type":41,"value":5396},"        securityContext",{"type":35,"tag":136,"props":5398,"children":5399},{"style":163},[5400],{"type":41,"value":3962},{"type":35,"tag":136,"props":5402,"children":5404},{"class":138,"line":5403},44,[5405,5410,5414],{"type":35,"tag":136,"props":5406,"children":5407},{"style":3920},[5408],{"type":41,"value":5409},"          runAsNonRoot",{"type":35,"tag":136,"props":5411,"children":5412},{"style":163},[5413],{"type":41,"value":3927},{"type":35,"tag":136,"props":5415,"children":5416},{"style":182},[5417],{"type":41,"value":5418},"true\n",{"type":35,"tag":136,"props":5420,"children":5422},{"class":138,"line":5421},45,[5423,5428,5432],{"type":35,"tag":136,"props":5424,"children":5425},{"style":3920},[5426],{"type":41,"value":5427},"          readOnlyRootFilesystem",{"type":35,"tag":136,"props":5429,"children":5430},{"style":163},[5431],{"type":41,"value":3927},{"type":35,"tag":136,"props":5433,"children":5434},{"style":182},[5435],{"type":41,"value":5418},{"type":35,"tag":44,"props":5437,"children":5438},{},[5439,5441,5447,5448,5454],{"type":41,"value":5440},"Setting ",{"type":35,"tag":81,"props":5442,"children":5444},{"className":5443},[],[5445],{"type":41,"value":5446},"maxUnavailable: 0",{"type":41,"value":2776},{"type":35,"tag":81,"props":5449,"children":5451},{"className":5450},[],[5452],{"type":41,"value":5453},"maxSurge: 1",{"type":41,"value":5455}," means Kubernetes always keeps the full replica count healthy during a rollout — zero-downtime deploys become the default.",{"type":35,"tag":36,"props":5457,"children":5459},{"id":5458},"case-study-containerising-a-legacy-net-platform",[5460],{"type":41,"value":5461},"Case Study: Containerising a Legacy .NET Platform",{"type":35,"tag":44,"props":5463,"children":5464},{},[5465],{"type":41,"value":5466},"A financial services client came to us with a Windows-server monolith that took three hours to deploy and consistently caused configuration drift between environments. Our containerisation project over eight weeks delivered:",{"type":35,"tag":2621,"props":5468,"children":5469},{},[5470,5491],{"type":35,"tag":2625,"props":5471,"children":5472},{},[5473],{"type":35,"tag":2629,"props":5474,"children":5475},{},[5476,5481,5486],{"type":35,"tag":2633,"props":5477,"children":5478},{},[5479],{"type":41,"value":5480},"Metric",{"type":35,"tag":2633,"props":5482,"children":5483},{},[5484],{"type":41,"value":5485},"Before",{"type":35,"tag":2633,"props":5487,"children":5488},{},[5489],{"type":41,"value":5490},"After",{"type":35,"tag":2644,"props":5492,"children":5493},{},[5494,5512,5530,5548],{"type":35,"tag":2629,"props":5495,"children":5496},{},[5497,5502,5507],{"type":35,"tag":2651,"props":5498,"children":5499},{},[5500],{"type":41,"value":5501},"Deployment time",{"type":35,"tag":2651,"props":5503,"children":5504},{},[5505],{"type":41,"value":5506},"~3 hours",{"type":35,"tag":2651,"props":5508,"children":5509},{},[5510],{"type":41,"value":5511},"~8 minutes",{"type":35,"tag":2629,"props":5513,"children":5514},{},[5515,5520,5525],{"type":35,"tag":2651,"props":5516,"children":5517},{},[5518],{"type":41,"value":5519},"Environment parity",{"type":35,"tag":2651,"props":5521,"children":5522},{},[5523],{"type":41,"value":5524},"❌ frequent drift",{"type":35,"tag":2651,"props":5526,"children":5527},{},[5528],{"type":41,"value":5529},"✅ identical images",{"type":35,"tag":2629,"props":5531,"children":5532},{},[5533,5538,5543],{"type":35,"tag":2651,"props":5534,"children":5535},{},[5536],{"type":41,"value":5537},"Infrastructure cost",{"type":35,"tag":2651,"props":5539,"children":5540},{},[5541],{"type":41,"value":5542},"baseline",{"type":35,"tag":2651,"props":5544,"children":5545},{},[5546],{"type":41,"value":5547},"−40%",{"type":35,"tag":2629,"props":5549,"children":5550},{},[5551,5556,5561],{"type":35,"tag":2651,"props":5552,"children":5553},{},[5554],{"type":41,"value":5555},"Release cadence",{"type":35,"tag":2651,"props":5557,"children":5558},{},[5559],{"type":41,"value":5560},"monthly",{"type":35,"tag":2651,"props":5562,"children":5563},{},[5564],{"type":41,"value":5565},"weekly",{"type":35,"tag":44,"props":5567,"children":5568},{},[5569],{"type":41,"value":5570},"The key steps: extracting configuration into environment variables, adding structured health-check endpoints the probes could target, building images in CI using multi-stage Dockerfiles, and deploying to AKS with Helm charts versioned alongside the application code.",{"type":35,"tag":36,"props":5572,"children":5574},{"id":5573},"what-to-containerise-first",[5575],{"type":41,"value":5576},"What to Containerise First",{"type":35,"tag":44,"props":5578,"children":5579},{},[5580],{"type":41,"value":5581},"Not everything benefits equally from containerisation. Start here:",{"type":35,"tag":1220,"props":5583,"children":5584},{},[5585,5595,5605],{"type":35,"tag":70,"props":5586,"children":5587},{},[5588,5593],{"type":35,"tag":74,"props":5589,"children":5590},{},[5591],{"type":41,"value":5592},"Stateless HTTP services",{"type":41,"value":5594}," — the easiest wins with the highest immediate benefit",{"type":35,"tag":70,"props":5596,"children":5597},{},[5598,5603],{"type":35,"tag":74,"props":5599,"children":5600},{},[5601],{"type":41,"value":5602},"Background workers and scheduled jobs",{"type":41,"value":5604}," — clean separation of concerns from your main API",{"type":35,"tag":70,"props":5606,"children":5607},{},[5608,5613],{"type":35,"tag":74,"props":5609,"children":5610},{},[5611],{"type":41,"value":5612},"Third-party dependencies in dev",{"type":41,"value":5614}," (databases, queues, email servers) — Compose makes local parity trivial",{"type":35,"tag":44,"props":5616,"children":5617},{},[5618],{"type":41,"value":5619},"Tackle stateful services (primary databases, file stores) last, and only when you have a solid understanding of volume management and backup strategies in your target cluster.",{"type":35,"tag":44,"props":5621,"children":5622},{},[5623],{"type":41,"value":5624},"Containerisation isn't a destination—it's the foundation for everything from zero-downtime deployments to auto-scaling to disaster recovery. Build the discipline into your workflow from day one.",{"type":35,"tag":2831,"props":5626,"children":5627},{},[5628],{"type":41,"value":2835},{"title":7,"searchDepth":159,"depth":159,"links":5630},[5631,5632,5633,5637,5638,5642,5643],{"id":3540,"depth":149,"text":3543},{"id":3571,"depth":149,"text":3574},{"id":3630,"depth":149,"text":3633,"children":5634},[5635,5636],{"id":3641,"depth":159,"text":3644},{"id":3802,"depth":159,"text":3805},{"id":4016,"depth":149,"text":4019},{"id":4616,"depth":149,"text":4619,"children":5639},[5640,5641],{"id":4627,"depth":159,"text":4630},{"id":4734,"depth":159,"text":4737},{"id":5458,"depth":149,"text":5461},{"id":5573,"depth":149,"text":5576},"content:blog:containerization-guide.md","blog/containerization-guide.md","blog/containerization-guide",{"_path":5648,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":5649,"description":5650,"slug":5651,"date":5652,"readTime":5653,"category":5654,"image":5655,"imageCaption":5656,"author":5657,"tags":5659,"body":5664,"_type":2857,"_id":7304,"_source":2859,"_file":7305,"_stem":7306,"_extension":2862},"/blog/ecommerce-platform-case-study","How We Cut Page Load Time by 65%: Modernising a Legacy E-Commerce Platform","A detailed case study on migrating a decade-old PHP monolith to .NET 8 and Nuxt 3—delivering a 28% conversion rate increase, 47% more mobile orders, and monthly releases replaced by daily deploys.","ecommerce-platform-case-study","2025-01-15","11 min","Case Study","https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?w=1200&h=600&fit=crop&auto=format","Modern e-commerce platform UI built with Nuxt 3 and .NET 8",{"name":17,"role":18,"avatar":19,"bio":20,"social":5658},{"github":22,"twitter":23,"linkedin":24},[5660,5661,5662,5663,5654],".NET","Vue.js","E-Commerce","Modernisation",{"type":32,"children":5665,"toc":7290},[5666,5672,5677,5682,5720,5725,5731,5736,5741,5746,5789,5794,5800,5806,5811,6476,6502,6508,6513,6869,6874,6880,6885,6891,7021,7027,7145,7151,7245,7251,7261,7271,7281,7286],{"type":35,"tag":36,"props":5667,"children":5669},{"id":5668},"the-business-problem",[5670],{"type":41,"value":5671},"The Business Problem",{"type":35,"tag":44,"props":5673,"children":5674},{},[5675],{"type":41,"value":5676},"FreshMarket, a growing grocery delivery service, came to MediaFront with a platform that had become a business liability. Built ten years earlier as a PHP/jQuery monolith, the codebase had accumulated so much technical debt that even simple features took weeks to ship—and those features frequently broke in production.",{"type":35,"tag":44,"props":5678,"children":5679},{},[5680],{"type":41,"value":5681},"The impact was measurable:",{"type":35,"tag":66,"props":5683,"children":5684},{},[5685,5695,5705,5715],{"type":35,"tag":70,"props":5686,"children":5687},{},[5688,5693],{"type":35,"tag":74,"props":5689,"children":5690},{},[5691],{"type":41,"value":5692},"5.2-second page load times",{"type":41,"value":5694}," driving mobile users to competitors",{"type":35,"tag":70,"props":5696,"children":5697},{},[5698,5703],{"type":35,"tag":74,"props":5699,"children":5700},{},[5701],{"type":41,"value":5702},"System crashes during promotional events",{"type":41,"value":5704}," — the platform would buckle at 3× normal traffic",{"type":35,"tag":70,"props":5706,"children":5707},{},[5708,5713],{"type":35,"tag":74,"props":5709,"children":5710},{},[5711],{"type":41,"value":5712},"62% cart abandonment rate",{"type":41,"value":5714}," — far above the 50% industry average",{"type":35,"tag":70,"props":5716,"children":5717},{},[5718],{"type":41,"value":5719},"Monthly release cycles with a 40% regression rate",{"type":35,"tag":44,"props":5721,"children":5722},{},[5723],{"type":41,"value":5724},"The brief was clear: rebuild for performance, scalability, and velocity—without taking the platform offline for months.",{"type":35,"tag":36,"props":5726,"children":5728},{"id":5727},"the-strategy-strangle-dont-rewrite",[5729],{"type":41,"value":5730},"The Strategy: Strangle, Don't Rewrite",{"type":35,"tag":44,"props":5732,"children":5733},{},[5734],{"type":41,"value":5735},"The fastest way to deliver value without risk is the strangler fig pattern: build a new system incrementally alongside the old one, routing traffic to the new components as they mature, until nothing is left to strangle.",{"type":35,"tag":44,"props":5737,"children":5738},{},[5739],{"type":41,"value":5740},"We rejected a full rewrite for two reasons. First, big-bang rewrites routinely fail or deliver years late. Second, FreshMarket couldn't stop selling groceries while we worked.",{"type":35,"tag":44,"props":5742,"children":5743},{},[5744],{"type":41,"value":5745},"Our phased approach over eight months:",{"type":35,"tag":1220,"props":5747,"children":5748},{},[5749,5759,5769,5779],{"type":35,"tag":70,"props":5750,"children":5751},{},[5752,5757],{"type":35,"tag":74,"props":5753,"children":5754},{},[5755],{"type":41,"value":5756},"Month 1–2",{"type":41,"value":5758},": Build the API layer and CI/CD infrastructure",{"type":35,"tag":70,"props":5760,"children":5761},{},[5762,5767],{"type":35,"tag":74,"props":5763,"children":5764},{},[5765],{"type":41,"value":5766},"Month 3–4",{"type":41,"value":5768},": Rebuild the product catalogue, search, and checkout in Nuxt 3",{"type":35,"tag":70,"props":5770,"children":5771},{},[5772,5777],{"type":35,"tag":74,"props":5773,"children":5774},{},[5775],{"type":41,"value":5776},"Month 5–6",{"type":41,"value":5778},": Migrate order processing and inventory to .NET 8 microservices",{"type":35,"tag":70,"props":5780,"children":5781},{},[5782,5787],{"type":35,"tag":74,"props":5783,"children":5784},{},[5785],{"type":41,"value":5786},"Month 7–8",{"type":41,"value":5788},": Decommission legacy PHP, performance optimisation, launch",{"type":35,"tag":44,"props":5790,"children":5791},{},[5792],{"type":41,"value":5793},"An Azure API Management gateway sat in front of both systems throughout, routing based on URL path. Users never saw the migration happening.",{"type":35,"tag":36,"props":5795,"children":5797},{"id":5796},"the-technical-architecture",[5798],{"type":41,"value":5799},"The Technical Architecture",{"type":35,"tag":362,"props":5801,"children":5803},{"id":5802},"backend-net-8-with-clean-architecture",[5804],{"type":41,"value":5805},"Backend: .NET 8 with Clean Architecture",{"type":35,"tag":44,"props":5807,"children":5808},{},[5809],{"type":41,"value":5810},"We built the backend on .NET 8 using a clean architecture approach—domain logic isolated from infrastructure concerns, with CQRS (Command Query Responsibility Segregation) separating reads from writes at the service boundary.",{"type":35,"tag":126,"props":5812,"children":5814},{"className":1767,"code":5813,"language":1769,"meta":7,"style":7},"// Command: write path — validated, transactional, produces domain events\npublic class CreateOrderCommandHandler : IRequestHandler\u003CCreateOrderCommand, Result\u003Cint>>\n{\n    private readonly IOrderRepository _orders;\n    private readonly IEventBus _events;\n\n    public async Task\u003CResult\u003Cint>> Handle(\n        CreateOrderCommand cmd,\n        CancellationToken ct)\n    {\n        var order = Order.Create(cmd.CustomerId, cmd.Items);\n\n        if (order.IsFailure)\n            return Result.Failure\u003Cint>(order.Error);\n\n        await _orders.SaveAsync(order.Value, ct);\n        await _events.PublishAsync(new OrderCreatedEvent(order.Value.Id), ct);\n\n        return Result.Success(order.Value.Id);\n    }\n}\n\n// Query: read path — optimised for speed, no domain model overhead\npublic class GetOrderSummaryQueryHandler : IRequestHandler\u003CGetOrderSummaryQuery, OrderSummaryDto>\n{\n    private readonly IDbConnection _db;\n\n    public async Task\u003COrderSummaryDto> Handle(GetOrderSummaryQuery query, CancellationToken ct)\n    {\n        // Direct Dapper query against denormalised read model — sub-10ms\n        return await _db.QuerySingleAsync\u003COrderSummaryDto>(\n            \"SELECT * FROM v_order_summaries WHERE id = @Id\",\n            new { query.Id });\n    }\n}\n",[5815],{"type":35,"tag":81,"props":5816,"children":5817},{"__ignoreMap":7},[5818,5826,5884,5891,5918,5943,5950,5996,6013,6030,6037,6069,6076,6089,6120,6127,6149,6185,6192,6213,6220,6227,6234,6242,6289,6296,6321,6328,6389,6396,6404,6438,6450,6462,6469],{"type":35,"tag":136,"props":5819,"children":5820},{"class":138,"line":139},[5821],{"type":35,"tag":136,"props":5822,"children":5823},{"style":143},[5824],{"type":41,"value":5825},"// Command: write path — validated, transactional, produces domain events\n",{"type":35,"tag":136,"props":5827,"children":5828},{"class":138,"line":149},[5829,5833,5838,5843,5848,5853,5857,5862,5866,5871,5875,5879],{"type":35,"tag":136,"props":5830,"children":5831},{"style":153},[5832],{"type":41,"value":1781},{"type":35,"tag":136,"props":5834,"children":5835},{"style":153},[5836],{"type":41,"value":5837}," class",{"type":35,"tag":136,"props":5839,"children":5840},{"style":1437},[5841],{"type":41,"value":5842}," CreateOrderCommandHandler",{"type":35,"tag":136,"props":5844,"children":5845},{"style":163},[5846],{"type":41,"value":5847}," : ",{"type":35,"tag":136,"props":5849,"children":5850},{"style":1437},[5851],{"type":41,"value":5852},"IRequestHandler",{"type":35,"tag":136,"props":5854,"children":5855},{"style":163},[5856],{"type":41,"value":1796},{"type":35,"tag":136,"props":5858,"children":5859},{"style":1437},[5860],{"type":41,"value":5861},"CreateOrderCommand",{"type":35,"tag":136,"props":5863,"children":5864},{"style":163},[5865],{"type":41,"value":200},{"type":35,"tag":136,"props":5867,"children":5868},{"style":1437},[5869],{"type":41,"value":5870},"Result",{"type":35,"tag":136,"props":5872,"children":5873},{"style":163},[5874],{"type":41,"value":1796},{"type":35,"tag":136,"props":5876,"children":5877},{"style":153},[5878],{"type":41,"value":1820},{"type":35,"tag":136,"props":5880,"children":5881},{"style":163},[5882],{"type":41,"value":5883},">>\n",{"type":35,"tag":136,"props":5885,"children":5886},{"class":138,"line":159},[5887],{"type":35,"tag":136,"props":5888,"children":5889},{"style":163},[5890],{"type":41,"value":1837},{"type":35,"tag":136,"props":5892,"children":5893},{"class":138,"line":169},[5894,5899,5904,5909,5914],{"type":35,"tag":136,"props":5895,"children":5896},{"style":153},[5897],{"type":41,"value":5898},"    private",{"type":35,"tag":136,"props":5900,"children":5901},{"style":153},[5902],{"type":41,"value":5903}," readonly",{"type":35,"tag":136,"props":5905,"children":5906},{"style":1437},[5907],{"type":41,"value":5908}," IOrderRepository",{"type":35,"tag":136,"props":5910,"children":5911},{"style":1437},[5912],{"type":41,"value":5913}," _orders",{"type":35,"tag":136,"props":5915,"children":5916},{"style":163},[5917],{"type":41,"value":349},{"type":35,"tag":136,"props":5919,"children":5920},{"class":138,"line":178},[5921,5925,5929,5934,5939],{"type":35,"tag":136,"props":5922,"children":5923},{"style":153},[5924],{"type":41,"value":5898},{"type":35,"tag":136,"props":5926,"children":5927},{"style":153},[5928],{"type":41,"value":5903},{"type":35,"tag":136,"props":5930,"children":5931},{"style":1437},[5932],{"type":41,"value":5933}," IEventBus",{"type":35,"tag":136,"props":5935,"children":5936},{"style":1437},[5937],{"type":41,"value":5938}," _events",{"type":35,"tag":136,"props":5940,"children":5941},{"style":163},[5942],{"type":41,"value":349},{"type":35,"tag":136,"props":5944,"children":5945},{"class":138,"line":223},[5946],{"type":35,"tag":136,"props":5947,"children":5948},{"emptyLinePlaceholder":830},[5949],{"type":41,"value":833},{"type":35,"tag":136,"props":5951,"children":5952},{"class":138,"line":262},[5953,5958,5962,5966,5970,5974,5978,5982,5987,5992],{"type":35,"tag":136,"props":5954,"children":5955},{"style":153},[5956],{"type":41,"value":5957},"    public",{"type":35,"tag":136,"props":5959,"children":5960},{"style":153},[5961],{"type":41,"value":1786},{"type":35,"tag":136,"props":5963,"children":5964},{"style":1437},[5965],{"type":41,"value":1791},{"type":35,"tag":136,"props":5967,"children":5968},{"style":163},[5969],{"type":41,"value":1796},{"type":35,"tag":136,"props":5971,"children":5972},{"style":1437},[5973],{"type":41,"value":5870},{"type":35,"tag":136,"props":5975,"children":5976},{"style":163},[5977],{"type":41,"value":1796},{"type":35,"tag":136,"props":5979,"children":5980},{"style":153},[5981],{"type":41,"value":1820},{"type":35,"tag":136,"props":5983,"children":5984},{"style":163},[5985],{"type":41,"value":5986},">> ",{"type":35,"tag":136,"props":5988,"children":5989},{"style":1437},[5990],{"type":41,"value":5991},"Handle",{"type":35,"tag":136,"props":5993,"children":5994},{"style":163},[5995],{"type":41,"value":2174},{"type":35,"tag":136,"props":5997,"children":5998},{"class":138,"line":300},[5999,6004,6009],{"type":35,"tag":136,"props":6000,"children":6001},{"style":1437},[6002],{"type":41,"value":6003},"        CreateOrderCommand",{"type":35,"tag":136,"props":6005,"children":6006},{"style":1437},[6007],{"type":41,"value":6008}," cmd",{"type":35,"tag":136,"props":6010,"children":6011},{"style":163},[6012],{"type":41,"value":427},{"type":35,"tag":136,"props":6014,"children":6015},{"class":138,"line":314},[6016,6021,6026],{"type":35,"tag":136,"props":6017,"children":6018},{"style":1437},[6019],{"type":41,"value":6020},"        CancellationToken",{"type":35,"tag":136,"props":6022,"children":6023},{"style":1437},[6024],{"type":41,"value":6025}," ct",{"type":35,"tag":136,"props":6027,"children":6028},{"style":163},[6029],{"type":41,"value":397},{"type":35,"tag":136,"props":6031,"children":6032},{"class":138,"line":333},[6033],{"type":35,"tag":136,"props":6034,"children":6035},{"style":163},[6036],{"type":41,"value":2151},{"type":35,"tag":136,"props":6038,"children":6039},{"class":138,"line":662},[6040,6045,6050,6054,6059,6064],{"type":35,"tag":136,"props":6041,"children":6042},{"style":153},[6043],{"type":41,"value":6044},"        var",{"type":35,"tag":136,"props":6046,"children":6047},{"style":1437},[6048],{"type":41,"value":6049}," order",{"type":35,"tag":136,"props":6051,"children":6052},{"style":153},[6053],{"type":41,"value":575},{"type":35,"tag":136,"props":6055,"children":6056},{"style":163},[6057],{"type":41,"value":6058}," Order.",{"type":35,"tag":136,"props":6060,"children":6061},{"style":1437},[6062],{"type":41,"value":6063},"Create",{"type":35,"tag":136,"props":6065,"children":6066},{"style":163},[6067],{"type":41,"value":6068},"(cmd.CustomerId, cmd.Items);\n",{"type":35,"tag":136,"props":6070,"children":6071},{"class":138,"line":679},[6072],{"type":35,"tag":136,"props":6073,"children":6074},{"emptyLinePlaceholder":830},[6075],{"type":41,"value":833},{"type":35,"tag":136,"props":6077,"children":6078},{"class":138,"line":1154},[6079,6084],{"type":35,"tag":136,"props":6080,"children":6081},{"style":153},[6082],{"type":41,"value":6083},"        if",{"type":35,"tag":136,"props":6085,"children":6086},{"style":163},[6087],{"type":41,"value":6088}," (order.IsFailure)\n",{"type":35,"tag":136,"props":6090,"children":6091},{"class":138,"line":2116},[6092,6097,6102,6107,6111,6115],{"type":35,"tag":136,"props":6093,"children":6094},{"style":153},[6095],{"type":41,"value":6096},"            return",{"type":35,"tag":136,"props":6098,"children":6099},{"style":163},[6100],{"type":41,"value":6101}," Result.",{"type":35,"tag":136,"props":6103,"children":6104},{"style":1437},[6105],{"type":41,"value":6106},"Failure",{"type":35,"tag":136,"props":6108,"children":6109},{"style":163},[6110],{"type":41,"value":1796},{"type":35,"tag":136,"props":6112,"children":6113},{"style":153},[6114],{"type":41,"value":1820},{"type":35,"tag":136,"props":6116,"children":6117},{"style":163},[6118],{"type":41,"value":6119},">(order.Error);\n",{"type":35,"tag":136,"props":6121,"children":6122},{"class":138,"line":2145},[6123],{"type":35,"tag":136,"props":6124,"children":6125},{"emptyLinePlaceholder":830},[6126],{"type":41,"value":833},{"type":35,"tag":136,"props":6128,"children":6129},{"class":138,"line":2154},[6130,6134,6139,6144],{"type":35,"tag":136,"props":6131,"children":6132},{"style":153},[6133],{"type":41,"value":2160},{"type":35,"tag":136,"props":6135,"children":6136},{"style":163},[6137],{"type":41,"value":6138}," _orders.",{"type":35,"tag":136,"props":6140,"children":6141},{"style":1437},[6142],{"type":41,"value":6143},"SaveAsync",{"type":35,"tag":136,"props":6145,"children":6146},{"style":163},[6147],{"type":41,"value":6148},"(order.Value, ct);\n",{"type":35,"tag":136,"props":6150,"children":6151},{"class":138,"line":2177},[6152,6156,6161,6166,6170,6175,6180],{"type":35,"tag":136,"props":6153,"children":6154},{"style":153},[6155],{"type":41,"value":2160},{"type":35,"tag":136,"props":6157,"children":6158},{"style":163},[6159],{"type":41,"value":6160}," _events.",{"type":35,"tag":136,"props":6162,"children":6163},{"style":1437},[6164],{"type":41,"value":6165},"PublishAsync",{"type":35,"tag":136,"props":6167,"children":6168},{"style":163},[6169],{"type":41,"value":460},{"type":35,"tag":136,"props":6171,"children":6172},{"style":153},[6173],{"type":41,"value":6174},"new",{"type":35,"tag":136,"props":6176,"children":6177},{"style":1437},[6178],{"type":41,"value":6179}," OrderCreatedEvent",{"type":35,"tag":136,"props":6181,"children":6182},{"style":163},[6183],{"type":41,"value":6184},"(order.Value.Id), ct);\n",{"type":35,"tag":136,"props":6186,"children":6187},{"class":138,"line":2186},[6188],{"type":35,"tag":136,"props":6189,"children":6190},{"emptyLinePlaceholder":830},[6191],{"type":41,"value":833},{"type":35,"tag":136,"props":6193,"children":6194},{"class":138,"line":2205},[6195,6199,6203,6208],{"type":35,"tag":136,"props":6196,"children":6197},{"style":153},[6198],{"type":41,"value":1955},{"type":35,"tag":136,"props":6200,"children":6201},{"style":163},[6202],{"type":41,"value":6101},{"type":35,"tag":136,"props":6204,"children":6205},{"style":1437},[6206],{"type":41,"value":6207},"Success",{"type":35,"tag":136,"props":6209,"children":6210},{"style":163},[6211],{"type":41,"value":6212},"(order.Value.Id);\n",{"type":35,"tag":136,"props":6214,"children":6215},{"class":138,"line":2219},[6216],{"type":35,"tag":136,"props":6217,"children":6218},{"style":163},[6219],{"type":41,"value":2279},{"type":35,"tag":136,"props":6221,"children":6222},{"class":138,"line":2228},[6223],{"type":35,"tag":136,"props":6224,"children":6225},{"style":163},[6226],{"type":41,"value":2317},{"type":35,"tag":136,"props":6228,"children":6229},{"class":138,"line":2264},[6230],{"type":35,"tag":136,"props":6231,"children":6232},{"emptyLinePlaceholder":830},[6233],{"type":41,"value":833},{"type":35,"tag":136,"props":6235,"children":6236},{"class":138,"line":2273},[6237],{"type":35,"tag":136,"props":6238,"children":6239},{"style":143},[6240],{"type":41,"value":6241},"// Query: read path — optimised for speed, no domain model overhead\n",{"type":35,"tag":136,"props":6243,"children":6244},{"class":138,"line":2282},[6245,6249,6253,6258,6262,6266,6270,6275,6279,6284],{"type":35,"tag":136,"props":6246,"children":6247},{"style":153},[6248],{"type":41,"value":1781},{"type":35,"tag":136,"props":6250,"children":6251},{"style":153},[6252],{"type":41,"value":5837},{"type":35,"tag":136,"props":6254,"children":6255},{"style":1437},[6256],{"type":41,"value":6257}," GetOrderSummaryQueryHandler",{"type":35,"tag":136,"props":6259,"children":6260},{"style":163},[6261],{"type":41,"value":5847},{"type":35,"tag":136,"props":6263,"children":6264},{"style":1437},[6265],{"type":41,"value":5852},{"type":35,"tag":136,"props":6267,"children":6268},{"style":163},[6269],{"type":41,"value":1796},{"type":35,"tag":136,"props":6271,"children":6272},{"style":1437},[6273],{"type":41,"value":6274},"GetOrderSummaryQuery",{"type":35,"tag":136,"props":6276,"children":6277},{"style":163},[6278],{"type":41,"value":200},{"type":35,"tag":136,"props":6280,"children":6281},{"style":1437},[6282],{"type":41,"value":6283},"OrderSummaryDto",{"type":35,"tag":136,"props":6285,"children":6286},{"style":163},[6287],{"type":41,"value":6288},">\n",{"type":35,"tag":136,"props":6290,"children":6291},{"class":138,"line":2290},[6292],{"type":35,"tag":136,"props":6293,"children":6294},{"style":163},[6295],{"type":41,"value":1837},{"type":35,"tag":136,"props":6297,"children":6298},{"class":138,"line":2311},[6299,6303,6307,6312,6317],{"type":35,"tag":136,"props":6300,"children":6301},{"style":153},[6302],{"type":41,"value":5898},{"type":35,"tag":136,"props":6304,"children":6305},{"style":153},[6306],{"type":41,"value":5903},{"type":35,"tag":136,"props":6308,"children":6309},{"style":1437},[6310],{"type":41,"value":6311}," IDbConnection",{"type":35,"tag":136,"props":6313,"children":6314},{"style":1437},[6315],{"type":41,"value":6316}," _db",{"type":35,"tag":136,"props":6318,"children":6319},{"style":163},[6320],{"type":41,"value":349},{"type":35,"tag":136,"props":6322,"children":6323},{"class":138,"line":4494},[6324],{"type":35,"tag":136,"props":6325,"children":6326},{"emptyLinePlaceholder":830},[6327],{"type":41,"value":833},{"type":35,"tag":136,"props":6329,"children":6330},{"class":138,"line":4510},[6331,6335,6339,6343,6347,6351,6355,6359,6363,6367,6372,6376,6381,6385],{"type":35,"tag":136,"props":6332,"children":6333},{"style":153},[6334],{"type":41,"value":5957},{"type":35,"tag":136,"props":6336,"children":6337},{"style":153},[6338],{"type":41,"value":1786},{"type":35,"tag":136,"props":6340,"children":6341},{"style":1437},[6342],{"type":41,"value":1791},{"type":35,"tag":136,"props":6344,"children":6345},{"style":163},[6346],{"type":41,"value":1796},{"type":35,"tag":136,"props":6348,"children":6349},{"style":1437},[6350],{"type":41,"value":6283},{"type":35,"tag":136,"props":6352,"children":6353},{"style":163},[6354],{"type":41,"value":1806},{"type":35,"tag":136,"props":6356,"children":6357},{"style":1437},[6358],{"type":41,"value":5991},{"type":35,"tag":136,"props":6360,"children":6361},{"style":163},[6362],{"type":41,"value":460},{"type":35,"tag":136,"props":6364,"children":6365},{"style":1437},[6366],{"type":41,"value":6274},{"type":35,"tag":136,"props":6368,"children":6369},{"style":1437},[6370],{"type":41,"value":6371}," query",{"type":35,"tag":136,"props":6373,"children":6374},{"style":163},[6375],{"type":41,"value":200},{"type":35,"tag":136,"props":6377,"children":6378},{"style":1437},[6379],{"type":41,"value":6380},"CancellationToken",{"type":35,"tag":136,"props":6382,"children":6383},{"style":1437},[6384],{"type":41,"value":6025},{"type":35,"tag":136,"props":6386,"children":6387},{"style":163},[6388],{"type":41,"value":397},{"type":35,"tag":136,"props":6390,"children":6391},{"class":138,"line":4518},[6392],{"type":35,"tag":136,"props":6393,"children":6394},{"style":163},[6395],{"type":41,"value":2151},{"type":35,"tag":136,"props":6397,"children":6398},{"class":138,"line":4531},[6399],{"type":35,"tag":136,"props":6400,"children":6401},{"style":143},[6402],{"type":41,"value":6403},"        // Direct Dapper query against denormalised read model — sub-10ms\n",{"type":35,"tag":136,"props":6405,"children":6406},{"class":138,"line":4544},[6407,6411,6415,6420,6425,6429,6433],{"type":35,"tag":136,"props":6408,"children":6409},{"style":153},[6410],{"type":41,"value":1955},{"type":35,"tag":136,"props":6412,"children":6413},{"style":153},[6414],{"type":41,"value":1900},{"type":35,"tag":136,"props":6416,"children":6417},{"style":163},[6418],{"type":41,"value":6419}," _db.",{"type":35,"tag":136,"props":6421,"children":6422},{"style":1437},[6423],{"type":41,"value":6424},"QuerySingleAsync",{"type":35,"tag":136,"props":6426,"children":6427},{"style":163},[6428],{"type":41,"value":1796},{"type":35,"tag":136,"props":6430,"children":6431},{"style":1437},[6432],{"type":41,"value":6283},{"type":35,"tag":136,"props":6434,"children":6435},{"style":163},[6436],{"type":41,"value":6437},">(\n",{"type":35,"tag":136,"props":6439,"children":6440},{"class":138,"line":4552},[6441,6446],{"type":35,"tag":136,"props":6442,"children":6443},{"style":618},[6444],{"type":41,"value":6445},"            \"SELECT * FROM v_order_summaries WHERE id = @Id\"",{"type":35,"tag":136,"props":6447,"children":6448},{"style":163},[6449],{"type":41,"value":427},{"type":35,"tag":136,"props":6451,"children":6452},{"class":138,"line":4565},[6453,6457],{"type":35,"tag":136,"props":6454,"children":6455},{"style":153},[6456],{"type":41,"value":2211},{"type":35,"tag":136,"props":6458,"children":6459},{"style":163},[6460],{"type":41,"value":6461}," { query.Id });\n",{"type":35,"tag":136,"props":6463,"children":6464},{"class":138,"line":4578},[6465],{"type":35,"tag":136,"props":6466,"children":6467},{"style":163},[6468],{"type":41,"value":2279},{"type":35,"tag":136,"props":6470,"children":6471},{"class":138,"line":5263},[6472],{"type":35,"tag":136,"props":6473,"children":6474},{"style":163},[6475],{"type":41,"value":2317},{"type":35,"tag":44,"props":6477,"children":6478},{},[6479,6481,6486,6488,6493,6495,6500],{"type":41,"value":6480},"Key decisions that paid off: ",{"type":35,"tag":74,"props":6482,"children":6483},{},[6484],{"type":41,"value":6485},"MediatR",{"type":41,"value":6487}," for decoupled command/query dispatch, ",{"type":35,"tag":74,"props":6489,"children":6490},{},[6491],{"type":41,"value":6492},"Azure Service Bus",{"type":41,"value":6494}," for asynchronous cross-service communication, and ",{"type":35,"tag":74,"props":6496,"children":6497},{},[6498],{"type":41,"value":6499},"Redis",{"type":41,"value":6501}," for hot product catalogue data with a 94% cache hit rate in production.",{"type":35,"tag":362,"props":6503,"children":6505},{"id":6504},"frontend-nuxt-3-with-server-side-rendering",[6506],{"type":41,"value":6507},"Frontend: Nuxt 3 with Server-Side Rendering",{"type":35,"tag":44,"props":6509,"children":6510},{},[6511],{"type":41,"value":6512},"The customer-facing frontend was rebuilt in Nuxt 3 with SSR enabled for all product and checkout pages — critical for both SEO and perceived performance on slow mobile connections.",{"type":35,"tag":126,"props":6514,"children":6518},{"className":6515,"code":6516,"language":6517,"meta":7,"style":7},"language-typescript shiki shiki-themes github-light","// Nuxt 3 composable: type-safe product fetching with caching\nconst useProduct = (id: string) => {\n  return useAsyncData(\n    `product-${id}`,\n    () => $fetch\u003CProduct>(`/api/products/${id}`),\n    {\n      // Cache in Nuxt's built-in data layer — no duplicate requests\n      dedupe: 'defer',\n      transform: (data) => ({\n        ...data,\n        // Pre-format price on server to avoid hydration mismatch\n        formattedPrice: new Intl.NumberFormat('nl-NL', {\n          style: 'currency',\n          currency: 'EUR',\n        }).format(data.price),\n      }),\n    }\n  );\n};\n","typescript",[6519],{"type":35,"tag":81,"props":6520,"children":6521},{"__ignoreMap":7},[6522,6530,6580,6597,6618,6666,6673,6681,6698,6729,6742,6750,6786,6803,6820,6838,6846,6853,6861],{"type":35,"tag":136,"props":6523,"children":6524},{"class":138,"line":139},[6525],{"type":35,"tag":136,"props":6526,"children":6527},{"style":143},[6528],{"type":41,"value":6529},"// Nuxt 3 composable: type-safe product fetching with caching\n",{"type":35,"tag":136,"props":6531,"children":6532},{"class":138,"line":149},[6533,6538,6543,6547,6551,6556,6561,6566,6570,6575],{"type":35,"tag":136,"props":6534,"children":6535},{"style":153},[6536],{"type":41,"value":6537},"const",{"type":35,"tag":136,"props":6539,"children":6540},{"style":1437},[6541],{"type":41,"value":6542}," useProduct",{"type":35,"tag":136,"props":6544,"children":6545},{"style":153},[6546],{"type":41,"value":575},{"type":35,"tag":136,"props":6548,"children":6549},{"style":163},[6550],{"type":41,"value":1580},{"type":35,"tag":136,"props":6552,"children":6554},{"style":6553},"--shiki-default:#E36209",[6555],{"type":41,"value":996},{"type":35,"tag":136,"props":6557,"children":6558},{"style":153},[6559],{"type":41,"value":6560},":",{"type":35,"tag":136,"props":6562,"children":6563},{"style":182},[6564],{"type":41,"value":6565}," string",{"type":35,"tag":136,"props":6567,"children":6568},{"style":163},[6569],{"type":41,"value":210},{"type":35,"tag":136,"props":6571,"children":6572},{"style":153},[6573],{"type":41,"value":6574},"=>",{"type":35,"tag":136,"props":6576,"children":6577},{"style":163},[6578],{"type":41,"value":6579}," {\n",{"type":35,"tag":136,"props":6581,"children":6582},{"class":138,"line":159},[6583,6588,6593],{"type":35,"tag":136,"props":6584,"children":6585},{"style":153},[6586],{"type":41,"value":6587},"  return",{"type":35,"tag":136,"props":6589,"children":6590},{"style":1437},[6591],{"type":41,"value":6592}," useAsyncData",{"type":35,"tag":136,"props":6594,"children":6595},{"style":163},[6596],{"type":41,"value":2174},{"type":35,"tag":136,"props":6598,"children":6599},{"class":138,"line":169},[6600,6605,6609,6614],{"type":35,"tag":136,"props":6601,"children":6602},{"style":618},[6603],{"type":41,"value":6604},"    `product-${",{"type":35,"tag":136,"props":6606,"children":6607},{"style":163},[6608],{"type":41,"value":996},{"type":35,"tag":136,"props":6610,"children":6611},{"style":618},[6612],{"type":41,"value":6613},"}`",{"type":35,"tag":136,"props":6615,"children":6616},{"style":163},[6617],{"type":41,"value":427},{"type":35,"tag":136,"props":6619,"children":6620},{"class":138,"line":178},[6621,6626,6630,6635,6639,6643,6648,6653,6657,6661],{"type":35,"tag":136,"props":6622,"children":6623},{"style":163},[6624],{"type":41,"value":6625},"    () ",{"type":35,"tag":136,"props":6627,"children":6628},{"style":153},[6629],{"type":41,"value":6574},{"type":35,"tag":136,"props":6631,"children":6632},{"style":1437},[6633],{"type":41,"value":6634}," $fetch",{"type":35,"tag":136,"props":6636,"children":6637},{"style":163},[6638],{"type":41,"value":1796},{"type":35,"tag":136,"props":6640,"children":6641},{"style":1437},[6642],{"type":41,"value":1801},{"type":35,"tag":136,"props":6644,"children":6645},{"style":163},[6646],{"type":41,"value":6647},">(",{"type":35,"tag":136,"props":6649,"children":6650},{"style":618},[6651],{"type":41,"value":6652},"`/api/products/${",{"type":35,"tag":136,"props":6654,"children":6655},{"style":163},[6656],{"type":41,"value":996},{"type":35,"tag":136,"props":6658,"children":6659},{"style":618},[6660],{"type":41,"value":6613},{"type":35,"tag":136,"props":6662,"children":6663},{"style":163},[6664],{"type":41,"value":6665},"),\n",{"type":35,"tag":136,"props":6667,"children":6668},{"class":138,"line":223},[6669],{"type":35,"tag":136,"props":6670,"children":6671},{"style":163},[6672],{"type":41,"value":2151},{"type":35,"tag":136,"props":6674,"children":6675},{"class":138,"line":262},[6676],{"type":35,"tag":136,"props":6677,"children":6678},{"style":143},[6679],{"type":41,"value":6680},"      // Cache in Nuxt's built-in data layer — no duplicate requests\n",{"type":35,"tag":136,"props":6682,"children":6683},{"class":138,"line":300},[6684,6689,6694],{"type":35,"tag":136,"props":6685,"children":6686},{"style":163},[6687],{"type":41,"value":6688},"      dedupe: ",{"type":35,"tag":136,"props":6690,"children":6691},{"style":618},[6692],{"type":41,"value":6693},"'defer'",{"type":35,"tag":136,"props":6695,"children":6696},{"style":163},[6697],{"type":41,"value":427},{"type":35,"tag":136,"props":6699,"children":6700},{"class":138,"line":314},[6701,6706,6711,6716,6720,6724],{"type":35,"tag":136,"props":6702,"children":6703},{"style":1437},[6704],{"type":41,"value":6705},"      transform",{"type":35,"tag":136,"props":6707,"children":6708},{"style":163},[6709],{"type":41,"value":6710},": (",{"type":35,"tag":136,"props":6712,"children":6713},{"style":6553},[6714],{"type":41,"value":6715},"data",{"type":35,"tag":136,"props":6717,"children":6718},{"style":163},[6719],{"type":41,"value":210},{"type":35,"tag":136,"props":6721,"children":6722},{"style":153},[6723],{"type":41,"value":6574},{"type":35,"tag":136,"props":6725,"children":6726},{"style":163},[6727],{"type":41,"value":6728}," ({\n",{"type":35,"tag":136,"props":6730,"children":6731},{"class":138,"line":333},[6732,6737],{"type":35,"tag":136,"props":6733,"children":6734},{"style":153},[6735],{"type":41,"value":6736},"        ...",{"type":35,"tag":136,"props":6738,"children":6739},{"style":163},[6740],{"type":41,"value":6741},"data,\n",{"type":35,"tag":136,"props":6743,"children":6744},{"class":138,"line":662},[6745],{"type":35,"tag":136,"props":6746,"children":6747},{"style":143},[6748],{"type":41,"value":6749},"        // Pre-format price on server to avoid hydration mismatch\n",{"type":35,"tag":136,"props":6751,"children":6752},{"class":138,"line":679},[6753,6758,6762,6767,6772,6776,6781],{"type":35,"tag":136,"props":6754,"children":6755},{"style":163},[6756],{"type":41,"value":6757},"        formattedPrice: ",{"type":35,"tag":136,"props":6759,"children":6760},{"style":153},[6761],{"type":41,"value":6174},{"type":35,"tag":136,"props":6763,"children":6764},{"style":163},[6765],{"type":41,"value":6766}," Intl.",{"type":35,"tag":136,"props":6768,"children":6769},{"style":1437},[6770],{"type":41,"value":6771},"NumberFormat",{"type":35,"tag":136,"props":6773,"children":6774},{"style":163},[6775],{"type":41,"value":460},{"type":35,"tag":136,"props":6777,"children":6778},{"style":618},[6779],{"type":41,"value":6780},"'nl-NL'",{"type":35,"tag":136,"props":6782,"children":6783},{"style":163},[6784],{"type":41,"value":6785},", {\n",{"type":35,"tag":136,"props":6787,"children":6788},{"class":138,"line":1154},[6789,6794,6799],{"type":35,"tag":136,"props":6790,"children":6791},{"style":163},[6792],{"type":41,"value":6793},"          style: ",{"type":35,"tag":136,"props":6795,"children":6796},{"style":618},[6797],{"type":41,"value":6798},"'currency'",{"type":35,"tag":136,"props":6800,"children":6801},{"style":163},[6802],{"type":41,"value":427},{"type":35,"tag":136,"props":6804,"children":6805},{"class":138,"line":2116},[6806,6811,6816],{"type":35,"tag":136,"props":6807,"children":6808},{"style":163},[6809],{"type":41,"value":6810},"          currency: ",{"type":35,"tag":136,"props":6812,"children":6813},{"style":618},[6814],{"type":41,"value":6815},"'EUR'",{"type":35,"tag":136,"props":6817,"children":6818},{"style":163},[6819],{"type":41,"value":427},{"type":35,"tag":136,"props":6821,"children":6822},{"class":138,"line":2145},[6823,6828,6833],{"type":35,"tag":136,"props":6824,"children":6825},{"style":163},[6826],{"type":41,"value":6827},"        }).",{"type":35,"tag":136,"props":6829,"children":6830},{"style":1437},[6831],{"type":41,"value":6832},"format",{"type":35,"tag":136,"props":6834,"children":6835},{"style":163},[6836],{"type":41,"value":6837},"(data.price),\n",{"type":35,"tag":136,"props":6839,"children":6840},{"class":138,"line":2154},[6841],{"type":35,"tag":136,"props":6842,"children":6843},{"style":163},[6844],{"type":41,"value":6845},"      }),\n",{"type":35,"tag":136,"props":6847,"children":6848},{"class":138,"line":2177},[6849],{"type":35,"tag":136,"props":6850,"children":6851},{"style":163},[6852],{"type":41,"value":2279},{"type":35,"tag":136,"props":6854,"children":6855},{"class":138,"line":2186},[6856],{"type":35,"tag":136,"props":6857,"children":6858},{"style":163},[6859],{"type":41,"value":6860},"  );\n",{"type":35,"tag":136,"props":6862,"children":6863},{"class":138,"line":2205},[6864],{"type":35,"tag":136,"props":6865,"children":6866},{"style":163},[6867],{"type":41,"value":6868},"};\n",{"type":35,"tag":44,"props":6870,"children":6871},{},[6872],{"type":41,"value":6873},"We implemented Tailwind CSS for consistent utility-first styling, Pinia for client-side state (cart, wishlist, user session), and lazy-loaded non-critical components to keep initial JS bundles under 120kB.",{"type":35,"tag":36,"props":6875,"children":6877},{"id":6876},"measuring-what-matters",[6878],{"type":41,"value":6879},"Measuring What Matters",{"type":35,"tag":44,"props":6881,"children":6882},{},[6883],{"type":41,"value":6884},"We tracked three categories of metrics from day one:",{"type":35,"tag":362,"props":6886,"children":6888},{"id":6887},"performance-lighthouse-real-user-monitoring",[6889],{"type":41,"value":6890},"Performance (Lighthouse, Real User Monitoring)",{"type":35,"tag":2621,"props":6892,"children":6893},{},[6894,6917],{"type":35,"tag":2625,"props":6895,"children":6896},{},[6897],{"type":35,"tag":2629,"props":6898,"children":6899},{},[6900,6904,6908,6912],{"type":35,"tag":2633,"props":6901,"children":6902},{},[6903],{"type":41,"value":5480},{"type":35,"tag":2633,"props":6905,"children":6906},{},[6907],{"type":41,"value":5485},{"type":35,"tag":2633,"props":6909,"children":6910},{},[6911],{"type":41,"value":5490},{"type":35,"tag":2633,"props":6913,"children":6914},{},[6915],{"type":41,"value":6916},"Change",{"type":35,"tag":2644,"props":6918,"children":6919},{},[6920,6946,6972,6998],{"type":35,"tag":2629,"props":6921,"children":6922},{},[6923,6928,6933,6938],{"type":35,"tag":2651,"props":6924,"children":6925},{},[6926],{"type":41,"value":6927},"Page load time (median)",{"type":35,"tag":2651,"props":6929,"children":6930},{},[6931],{"type":41,"value":6932},"5.2s",{"type":35,"tag":2651,"props":6934,"children":6935},{},[6936],{"type":41,"value":6937},"1.8s",{"type":35,"tag":2651,"props":6939,"children":6940},{},[6941],{"type":35,"tag":74,"props":6942,"children":6943},{},[6944],{"type":41,"value":6945},"−65%",{"type":35,"tag":2629,"props":6947,"children":6948},{},[6949,6954,6959,6964],{"type":35,"tag":2651,"props":6950,"children":6951},{},[6952],{"type":41,"value":6953},"Server response time",{"type":35,"tag":2651,"props":6955,"children":6956},{},[6957],{"type":41,"value":6958},"850ms",{"type":35,"tag":2651,"props":6960,"children":6961},{},[6962],{"type":41,"value":6963},"120ms",{"type":35,"tag":2651,"props":6965,"children":6966},{},[6967],{"type":35,"tag":74,"props":6968,"children":6969},{},[6970],{"type":41,"value":6971},"−86%",{"type":35,"tag":2629,"props":6973,"children":6974},{},[6975,6980,6985,6990],{"type":35,"tag":2651,"props":6976,"children":6977},{},[6978],{"type":41,"value":6979},"Lighthouse Performance",{"type":35,"tag":2651,"props":6981,"children":6982},{},[6983],{"type":41,"value":6984},"42",{"type":35,"tag":2651,"props":6986,"children":6987},{},[6988],{"type":41,"value":6989},"89",{"type":35,"tag":2651,"props":6991,"children":6992},{},[6993],{"type":35,"tag":74,"props":6994,"children":6995},{},[6996],{"type":41,"value":6997},"+112%",{"type":35,"tag":2629,"props":6999,"children":7000},{},[7001,7006,7011,7016],{"type":35,"tag":2651,"props":7002,"children":7003},{},[7004],{"type":41,"value":7005},"Core Web Vitals (LCP)",{"type":35,"tag":2651,"props":7007,"children":7008},{},[7009],{"type":41,"value":7010},"6.1s",{"type":35,"tag":2651,"props":7012,"children":7013},{},[7014],{"type":41,"value":7015},"1.9s",{"type":35,"tag":2651,"props":7017,"children":7018},{},[7019],{"type":41,"value":7020},"✅ Good",{"type":35,"tag":362,"props":7022,"children":7024},{"id":7023},"business-metrics-3-months-post-launch",[7025],{"type":41,"value":7026},"Business Metrics (3 months post-launch)",{"type":35,"tag":2621,"props":7028,"children":7029},{},[7030,7052],{"type":35,"tag":2625,"props":7031,"children":7032},{},[7033],{"type":35,"tag":2629,"props":7034,"children":7035},{},[7036,7040,7044,7048],{"type":35,"tag":2633,"props":7037,"children":7038},{},[7039],{"type":41,"value":5480},{"type":35,"tag":2633,"props":7041,"children":7042},{},[7043],{"type":41,"value":5485},{"type":35,"tag":2633,"props":7045,"children":7046},{},[7047],{"type":41,"value":5490},{"type":35,"tag":2633,"props":7049,"children":7050},{},[7051],{"type":41,"value":6916},{"type":35,"tag":2644,"props":7053,"children":7054},{},[7055,7077,7098,7124],{"type":35,"tag":2629,"props":7056,"children":7057},{},[7058,7063,7067,7072],{"type":35,"tag":2651,"props":7059,"children":7060},{},[7061],{"type":41,"value":7062},"Conversion rate",{"type":35,"tag":2651,"props":7064,"children":7065},{},[7066],{"type":41,"value":5542},{"type":35,"tag":2651,"props":7068,"children":7069},{},[7070],{"type":41,"value":7071},"+28%",{"type":35,"tag":2651,"props":7073,"children":7074},{},[7075],{"type":41,"value":7076},"📈",{"type":35,"tag":2629,"props":7078,"children":7079},{},[7080,7085,7089,7094],{"type":35,"tag":2651,"props":7081,"children":7082},{},[7083],{"type":41,"value":7084},"Mobile orders",{"type":35,"tag":2651,"props":7086,"children":7087},{},[7088],{"type":41,"value":5542},{"type":35,"tag":2651,"props":7090,"children":7091},{},[7092],{"type":41,"value":7093},"+47%",{"type":35,"tag":2651,"props":7095,"children":7096},{},[7097],{"type":41,"value":7076},{"type":35,"tag":2629,"props":7099,"children":7100},{},[7101,7106,7111,7116],{"type":35,"tag":2651,"props":7102,"children":7103},{},[7104],{"type":41,"value":7105},"Cart abandonment",{"type":35,"tag":2651,"props":7107,"children":7108},{},[7109],{"type":41,"value":7110},"62%",{"type":35,"tag":2651,"props":7112,"children":7113},{},[7114],{"type":41,"value":7115},"41%",{"type":35,"tag":2651,"props":7117,"children":7118},{},[7119],{"type":35,"tag":74,"props":7120,"children":7121},{},[7122],{"type":41,"value":7123},"−34%",{"type":35,"tag":2629,"props":7125,"children":7126},{},[7127,7132,7136,7141],{"type":35,"tag":2651,"props":7128,"children":7129},{},[7130],{"type":41,"value":7131},"Average order value",{"type":35,"tag":2651,"props":7133,"children":7134},{},[7135],{"type":41,"value":5542},{"type":35,"tag":2651,"props":7137,"children":7138},{},[7139],{"type":41,"value":7140},"+12%",{"type":35,"tag":2651,"props":7142,"children":7143},{},[7144],{"type":41,"value":7076},{"type":35,"tag":362,"props":7146,"children":7148},{"id":7147},"engineering-velocity",[7149],{"type":41,"value":7150},"Engineering Velocity",{"type":35,"tag":2621,"props":7152,"children":7153},{},[7154,7172],{"type":35,"tag":2625,"props":7155,"children":7156},{},[7157],{"type":35,"tag":2629,"props":7158,"children":7159},{},[7160,7164,7168],{"type":35,"tag":2633,"props":7161,"children":7162},{},[7163],{"type":41,"value":5480},{"type":35,"tag":2633,"props":7165,"children":7166},{},[7167],{"type":41,"value":5485},{"type":35,"tag":2633,"props":7169,"children":7170},{},[7171],{"type":41,"value":5490},{"type":35,"tag":2644,"props":7173,"children":7174},{},[7175,7192,7209,7227],{"type":35,"tag":2629,"props":7176,"children":7177},{},[7178,7183,7187],{"type":35,"tag":2651,"props":7179,"children":7180},{},[7181],{"type":41,"value":7182},"Deploy frequency",{"type":35,"tag":2651,"props":7184,"children":7185},{},[7186],{"type":41,"value":5560},{"type":35,"tag":2651,"props":7188,"children":7189},{},[7190],{"type":41,"value":7191},"3–4× per week",{"type":35,"tag":2629,"props":7193,"children":7194},{},[7195,7200,7204],{"type":35,"tag":2651,"props":7196,"children":7197},{},[7198],{"type":41,"value":7199},"Deploy-related incidents",{"type":35,"tag":2651,"props":7201,"children":7202},{},[7203],{"type":41,"value":5542},{"type":35,"tag":2651,"props":7205,"children":7206},{},[7207],{"type":41,"value":7208},"−92%",{"type":35,"tag":2629,"props":7210,"children":7211},{},[7212,7217,7222],{"type":35,"tag":2651,"props":7213,"children":7214},{},[7215],{"type":41,"value":7216},"Mean time to recovery",{"type":35,"tag":2651,"props":7218,"children":7219},{},[7220],{"type":41,"value":7221},"hours",{"type":35,"tag":2651,"props":7223,"children":7224},{},[7225],{"type":41,"value":7226},"minutes",{"type":35,"tag":2629,"props":7228,"children":7229},{},[7230,7235,7240],{"type":35,"tag":2651,"props":7231,"children":7232},{},[7233],{"type":41,"value":7234},"Onboarding time (new dev)",{"type":35,"tag":2651,"props":7236,"children":7237},{},[7238],{"type":41,"value":7239},"~3 weeks",{"type":35,"tag":2651,"props":7241,"children":7242},{},[7243],{"type":41,"value":7244},"~4 days",{"type":35,"tag":36,"props":7246,"children":7248},{"id":7247},"the-lessons-that-carried-forward",[7249],{"type":41,"value":7250},"The Lessons That Carried Forward",{"type":35,"tag":44,"props":7252,"children":7253},{},[7254,7259],{"type":35,"tag":74,"props":7255,"children":7256},{},[7257],{"type":41,"value":7258},"Start where the customer feels the pain.",{"type":41,"value":7260}," We rebuilt the checkout flow in month three, before the product catalogue was even finished on the new stack. A 28% conversion lift started accumulating six months before the migration completed.",{"type":35,"tag":44,"props":7262,"children":7263},{},[7264,7269],{"type":35,"tag":74,"props":7265,"children":7266},{},[7267],{"type":41,"value":7268},"Invest in observability from week one.",{"type":41,"value":7270}," We instrumented every API endpoint with Azure Application Insights on day one. Without real latency data, we would have optimised the wrong things. With it, we identified that 70% of total response time came from two database queries — both fixable.",{"type":35,"tag":44,"props":7272,"children":7273},{},[7274,7279],{"type":35,"tag":74,"props":7275,"children":7276},{},[7277],{"type":41,"value":7278},"Strangler is slower to start, faster to finish.",{"type":41,"value":7280}," The first two months felt slow — no visible user-facing changes. But by month four, we were shipping multiple features per week to a progressively growing slice of real production traffic, validating changes with real users rather than staging assumptions.",{"type":35,"tag":44,"props":7282,"children":7283},{},[7284],{"type":41,"value":7285},"The modernised FreshMarket platform now handles 5× the peak traffic of the old system, on 30% less infrastructure spend. More importantly, the team ships with confidence — because the architecture was built to evolve.",{"type":35,"tag":2831,"props":7287,"children":7288},{},[7289],{"type":41,"value":2835},{"title":7,"searchDepth":159,"depth":159,"links":7291},[7292,7293,7294,7298,7303],{"id":5668,"depth":149,"text":5671},{"id":5727,"depth":149,"text":5730},{"id":5796,"depth":149,"text":5799,"children":7295},[7296,7297],{"id":5802,"depth":159,"text":5805},{"id":6504,"depth":159,"text":6507},{"id":6876,"depth":149,"text":6879,"children":7299},[7300,7301,7302],{"id":6887,"depth":159,"text":6890},{"id":7023,"depth":159,"text":7026},{"id":7147,"depth":159,"text":7150},{"id":7247,"depth":149,"text":7250},"content:blog:ecommerce-platform-case-study.md","blog/ecommerce-platform-case-study.md","blog/ecommerce-platform-case-study",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"slug":10,"date":11,"readTime":12,"category":13,"image":14,"imageCaption":15,"author":7308,"tags":7310,"body":7311,"_type":2857,"_id":2858,"_source":2859,"_file":2860,"_stem":2861,"_extension":2862},{"name":17,"role":18,"avatar":19,"bio":20,"social":7309},{"github":22,"twitter":23,"linkedin":24},[26,27,28,29,30],{"type":32,"children":7312,"toc":9704},[7313,7317,7321,7325,7329,7333,7378,7558,7562,7566,7570,7574,7856,7860,7903,7907,7911,8030,8034,8038,8303,8307,8311,8315,8319,8356,8360,8381,8385,8389,8548,8564,8568,8572,8646,8650,8654,8658,8771,8775,8779,8783,8787,9263,9267,9271,9275,9515,9524,9528,9532,9613,9617,9621,9625,9696,9700],{"type":35,"tag":36,"props":7314,"children":7315},{"id":38},[7316],{"type":41,"value":42},{"type":35,"tag":44,"props":7318,"children":7319},{},[7320],{"type":41,"value":48},{"type":35,"tag":44,"props":7322,"children":7323},{},[7324],{"type":41,"value":53},{"type":35,"tag":36,"props":7326,"children":7327},{"id":56},[7328],{"type":41,"value":59},{"type":35,"tag":44,"props":7330,"children":7331},{},[7332],{"type":41,"value":64},{"type":35,"tag":66,"props":7334,"children":7335},{},[7336,7350,7370],{"type":35,"tag":70,"props":7337,"children":7338},{},[7339,7343,7344,7349],{"type":35,"tag":74,"props":7340,"children":7341},{},[7342],{"type":41,"value":27},{"type":41,"value":79},{"type":35,"tag":81,"props":7345,"children":7347},{"className":7346},[],[7348],{"type":41,"value":86},{"type":41,"value":88},{"type":35,"tag":70,"props":7351,"children":7352},{},[7353,7357,7358,7363,7364,7369],{"type":35,"tag":74,"props":7354,"children":7355},{},[7356],{"type":41,"value":96},{"type":41,"value":98},{"type":35,"tag":81,"props":7359,"children":7361},{"className":7360},[],[7362],{"type":41,"value":104},{"type":41,"value":106},{"type":35,"tag":81,"props":7365,"children":7367},{"className":7366},[],[7368],{"type":41,"value":112},{"type":41,"value":114},{"type":35,"tag":70,"props":7371,"children":7372},{},[7373,7377],{"type":35,"tag":74,"props":7374,"children":7375},{},[7376],{"type":41,"value":122},{"type":41,"value":124},{"type":35,"tag":126,"props":7379,"children":7380},{"className":128,"code":129,"language":130,"meta":7,"style":7},[7381],{"type":35,"tag":81,"props":7382,"children":7383},{"__ignoreMap":7},[7384,7391,7398,7405,7412,7447,7482,7517,7528,7543],{"type":35,"tag":136,"props":7385,"children":7386},{"class":138,"line":139},[7387],{"type":35,"tag":136,"props":7388,"children":7389},{"style":143},[7390],{"type":41,"value":146},{"type":35,"tag":136,"props":7392,"children":7393},{"class":138,"line":149},[7394],{"type":35,"tag":136,"props":7395,"children":7396},{"style":153},[7397],{"type":41,"value":156},{"type":35,"tag":136,"props":7399,"children":7400},{"class":138,"line":159},[7401],{"type":35,"tag":136,"props":7402,"children":7403},{"style":163},[7404],{"type":41,"value":166},{"type":35,"tag":136,"props":7406,"children":7407},{"class":138,"line":169},[7408],{"type":35,"tag":136,"props":7409,"children":7410},{"style":163},[7411],{"type":41,"value":175},{"type":35,"tag":136,"props":7413,"children":7414},{"class":138,"line":178},[7415,7419,7423,7427,7431,7435,7439,7443],{"type":35,"tag":136,"props":7416,"children":7417},{"style":182},[7418],{"type":41,"value":185},{"type":35,"tag":136,"props":7420,"children":7421},{"style":163},[7422],{"type":41,"value":190},{"type":35,"tag":136,"props":7424,"children":7425},{"style":153},[7426],{"type":41,"value":195},{"type":35,"tag":136,"props":7428,"children":7429},{"style":163},[7430],{"type":41,"value":200},{"type":35,"tag":136,"props":7432,"children":7433},{"style":182},[7434],{"type":41,"value":205},{"type":35,"tag":136,"props":7436,"children":7437},{"style":163},[7438],{"type":41,"value":210},{"type":35,"tag":136,"props":7440,"children":7441},{"style":153},[7442],{"type":41,"value":215},{"type":35,"tag":136,"props":7444,"children":7445},{"style":163},[7446],{"type":41,"value":220},{"type":35,"tag":136,"props":7448,"children":7449},{"class":138,"line":223},[7450,7454,7458,7462,7466,7470,7474,7478],{"type":35,"tag":136,"props":7451,"children":7452},{"style":182},[7453],{"type":41,"value":185},{"type":35,"tag":136,"props":7455,"children":7456},{"style":163},[7457],{"type":41,"value":233},{"type":35,"tag":136,"props":7459,"children":7460},{"style":153},[7461],{"type":41,"value":195},{"type":35,"tag":136,"props":7463,"children":7464},{"style":163},[7465],{"type":41,"value":200},{"type":35,"tag":136,"props":7467,"children":7468},{"style":182},[7469],{"type":41,"value":205},{"type":35,"tag":136,"props":7471,"children":7472},{"style":163},[7473],{"type":41,"value":250},{"type":35,"tag":136,"props":7475,"children":7476},{"style":153},[7477],{"type":41,"value":215},{"type":35,"tag":136,"props":7479,"children":7480},{"style":163},[7481],{"type":41,"value":259},{"type":35,"tag":136,"props":7483,"children":7484},{"class":138,"line":262},[7485,7489,7493,7497,7501,7505,7509,7513],{"type":35,"tag":136,"props":7486,"children":7487},{"style":182},[7488],{"type":41,"value":185},{"type":35,"tag":136,"props":7490,"children":7491},{"style":163},[7492],{"type":41,"value":272},{"type":35,"tag":136,"props":7494,"children":7495},{"style":153},[7496],{"type":41,"value":195},{"type":35,"tag":136,"props":7498,"children":7499},{"style":163},[7500],{"type":41,"value":200},{"type":35,"tag":136,"props":7502,"children":7503},{"style":182},[7504],{"type":41,"value":205},{"type":35,"tag":136,"props":7506,"children":7507},{"style":163},[7508],{"type":41,"value":210},{"type":35,"tag":136,"props":7510,"children":7511},{"style":153},[7512],{"type":41,"value":215},{"type":35,"tag":136,"props":7514,"children":7515},{"style":163},[7516],{"type":41,"value":297},{"type":35,"tag":136,"props":7518,"children":7519},{"class":138,"line":300},[7520,7524],{"type":35,"tag":136,"props":7521,"children":7522},{"style":153},[7523],{"type":41,"value":306},{"type":35,"tag":136,"props":7525,"children":7526},{"style":163},[7527],{"type":41,"value":311},{"type":35,"tag":136,"props":7529,"children":7530},{"class":138,"line":314},[7531,7535,7539],{"type":35,"tag":136,"props":7532,"children":7533},{"style":153},[7534],{"type":41,"value":320},{"type":35,"tag":136,"props":7536,"children":7537},{"style":163},[7538],{"type":41,"value":325},{"type":35,"tag":136,"props":7540,"children":7541},{"style":153},[7542],{"type":41,"value":330},{"type":35,"tag":136,"props":7544,"children":7545},{"class":138,"line":333},[7546,7550,7554],{"type":35,"tag":136,"props":7547,"children":7548},{"style":153},[7549],{"type":41,"value":339},{"type":35,"tag":136,"props":7551,"children":7552},{"style":182},[7553],{"type":41,"value":344},{"type":35,"tag":136,"props":7555,"children":7556},{"style":163},[7557],{"type":41,"value":349},{"type":35,"tag":44,"props":7559,"children":7560},{},[7561],{"type":41,"value":354},{"type":35,"tag":36,"props":7563,"children":7564},{"id":357},[7565],{"type":41,"value":360},{"type":35,"tag":362,"props":7567,"children":7568},{"id":364},[7569],{"type":41,"value":367},{"type":35,"tag":44,"props":7571,"children":7572},{},[7573],{"type":41,"value":372},{"type":35,"tag":126,"props":7575,"children":7576},{"className":128,"code":375,"language":130,"meta":7,"style":7},[7577],{"type":35,"tag":81,"props":7578,"children":7579},{"__ignoreMap":7},[7580,7595,7602,7621,7640,7675,7710,7721,7764,7791,7826,7841],{"type":35,"tag":136,"props":7581,"children":7582},{"class":138,"line":139},[7583,7587,7591],{"type":35,"tag":136,"props":7584,"children":7585},{"style":163},[7586],{"type":41,"value":387},{"type":35,"tag":136,"props":7588,"children":7589},{"style":153},[7590],{"type":41,"value":392},{"type":35,"tag":136,"props":7592,"children":7593},{"style":163},[7594],{"type":41,"value":397},{"type":35,"tag":136,"props":7596,"children":7597},{"class":138,"line":149},[7598],{"type":35,"tag":136,"props":7599,"children":7600},{"style":153},[7601],{"type":41,"value":156},{"type":35,"tag":136,"props":7603,"children":7604},{"class":138,"line":159},[7605,7609,7613,7617],{"type":35,"tag":136,"props":7606,"children":7607},{"style":182},[7608],{"type":41,"value":412},{"type":35,"tag":136,"props":7610,"children":7611},{"style":163},[7612],{"type":41,"value":417},{"type":35,"tag":136,"props":7614,"children":7615},{"style":182},[7616],{"type":41,"value":422},{"type":35,"tag":136,"props":7618,"children":7619},{"style":163},[7620],{"type":41,"value":427},{"type":35,"tag":136,"props":7622,"children":7623},{"class":138,"line":169},[7624,7628,7632,7636],{"type":35,"tag":136,"props":7625,"children":7626},{"style":182},[7627],{"type":41,"value":412},{"type":35,"tag":136,"props":7629,"children":7630},{"style":163},[7631],{"type":41,"value":417},{"type":35,"tag":136,"props":7633,"children":7634},{"style":182},[7635],{"type":41,"value":443},{"type":35,"tag":136,"props":7637,"children":7638},{"style":163},[7639],{"type":41,"value":427},{"type":35,"tag":136,"props":7641,"children":7642},{"class":138,"line":178},[7643,7647,7651,7655,7659,7663,7667,7671],{"type":35,"tag":136,"props":7644,"children":7645},{"style":182},[7646],{"type":41,"value":455},{"type":35,"tag":136,"props":7648,"children":7649},{"style":163},[7650],{"type":41,"value":460},{"type":35,"tag":136,"props":7652,"children":7653},{"style":182},[7654],{"type":41,"value":465},{"type":35,"tag":136,"props":7656,"children":7657},{"style":163},[7658],{"type":41,"value":417},{"type":35,"tag":136,"props":7660,"children":7661},{"style":182},[7662],{"type":41,"value":474},{"type":35,"tag":136,"props":7664,"children":7665},{"style":163},[7666],{"type":41,"value":479},{"type":35,"tag":136,"props":7668,"children":7669},{"style":153},[7670],{"type":41,"value":215},{"type":35,"tag":136,"props":7672,"children":7673},{"style":163},[7674],{"type":41,"value":488},{"type":35,"tag":136,"props":7676,"children":7677},{"class":138,"line":223},[7678,7682,7686,7690,7694,7698,7702,7706],{"type":35,"tag":136,"props":7679,"children":7680},{"style":182},[7681],{"type":41,"value":496},{"type":35,"tag":136,"props":7683,"children":7684},{"style":163},[7685],{"type":41,"value":460},{"type":35,"tag":136,"props":7687,"children":7688},{"style":182},[7689],{"type":41,"value":465},{"type":35,"tag":136,"props":7691,"children":7692},{"style":163},[7693],{"type":41,"value":417},{"type":35,"tag":136,"props":7695,"children":7696},{"style":182},[7697],{"type":41,"value":513},{"type":35,"tag":136,"props":7699,"children":7700},{"style":163},[7701],{"type":41,"value":518},{"type":35,"tag":136,"props":7703,"children":7704},{"style":153},[7705],{"type":41,"value":215},{"type":35,"tag":136,"props":7707,"children":7708},{"style":163},[7709],{"type":41,"value":527},{"type":35,"tag":136,"props":7711,"children":7712},{"class":138,"line":262},[7713,7717],{"type":35,"tag":136,"props":7714,"children":7715},{"style":153},[7716],{"type":41,"value":306},{"type":35,"tag":136,"props":7718,"children":7719},{"style":163},[7720],{"type":41,"value":539},{"type":35,"tag":136,"props":7722,"children":7723},{"class":138,"line":300},[7724,7728,7732,7736,7740,7744,7748,7752,7756,7760],{"type":35,"tag":136,"props":7725,"children":7726},{"style":153},[7727],{"type":41,"value":547},{"type":35,"tag":136,"props":7729,"children":7730},{"style":163},[7731],{"type":41,"value":552},{"type":35,"tag":136,"props":7733,"children":7734},{"style":153},[7735],{"type":41,"value":557},{"type":35,"tag":136,"props":7737,"children":7738},{"style":182},[7739],{"type":41,"value":562},{"type":35,"tag":136,"props":7741,"children":7742},{"style":163},[7743],{"type":41,"value":417},{"type":35,"tag":136,"props":7745,"children":7746},{"style":182},[7747],{"type":41,"value":422},{"type":35,"tag":136,"props":7749,"children":7750},{"style":153},[7751],{"type":41,"value":575},{"type":35,"tag":136,"props":7753,"children":7754},{"style":182},[7755],{"type":41,"value":580},{"type":35,"tag":136,"props":7757,"children":7758},{"style":163},[7759],{"type":41,"value":417},{"type":35,"tag":136,"props":7761,"children":7762},{"style":182},[7763],{"type":41,"value":589},{"type":35,"tag":136,"props":7765,"children":7766},{"class":138,"line":314},[7767,7771,7775,7779,7783,7787],{"type":35,"tag":136,"props":7768,"children":7769},{"style":153},[7770],{"type":41,"value":597},{"type":35,"tag":136,"props":7772,"children":7773},{"style":182},[7774],{"type":41,"value":562},{"type":35,"tag":136,"props":7776,"children":7777},{"style":163},[7778],{"type":41,"value":417},{"type":35,"tag":136,"props":7780,"children":7781},{"style":182},[7782],{"type":41,"value":610},{"type":35,"tag":136,"props":7784,"children":7785},{"style":153},[7786],{"type":41,"value":615},{"type":35,"tag":136,"props":7788,"children":7789},{"style":618},[7790],{"type":41,"value":621},{"type":35,"tag":136,"props":7792,"children":7793},{"class":138,"line":333},[7794,7798,7802,7806,7810,7814,7818,7822],{"type":35,"tag":136,"props":7795,"children":7796},{"style":153},[7797],{"type":41,"value":629},{"type":35,"tag":136,"props":7799,"children":7800},{"style":182},[7801],{"type":41,"value":562},{"type":35,"tag":136,"props":7803,"children":7804},{"style":163},[7805],{"type":41,"value":417},{"type":35,"tag":136,"props":7807,"children":7808},{"style":182},[7809],{"type":41,"value":422},{"type":35,"tag":136,"props":7811,"children":7812},{"style":163},[7813],{"type":41,"value":200},{"type":35,"tag":136,"props":7815,"children":7816},{"style":182},[7817],{"type":41,"value":650},{"type":35,"tag":136,"props":7819,"children":7820},{"style":163},[7821],{"type":41,"value":417},{"type":35,"tag":136,"props":7823,"children":7824},{"style":182},[7825],{"type":41,"value":659},{"type":35,"tag":136,"props":7827,"children":7828},{"class":138,"line":662},[7829,7833,7837],{"type":35,"tag":136,"props":7830,"children":7831},{"style":153},[7832],{"type":41,"value":320},{"type":35,"tag":136,"props":7834,"children":7835},{"style":163},[7836],{"type":41,"value":672},{"type":35,"tag":136,"props":7838,"children":7839},{"style":153},[7840],{"type":41,"value":330},{"type":35,"tag":136,"props":7842,"children":7843},{"class":138,"line":679},[7844,7848,7852],{"type":35,"tag":136,"props":7845,"children":7846},{"style":153},[7847],{"type":41,"value":339},{"type":35,"tag":136,"props":7849,"children":7850},{"style":182},[7851],{"type":41,"value":689},{"type":35,"tag":136,"props":7853,"children":7854},{"style":163},[7855],{"type":41,"value":349},{"type":35,"tag":44,"props":7857,"children":7858},{},[7859],{"type":41,"value":698},{"type":35,"tag":66,"props":7861,"children":7862},{},[7863,7872,7893],{"type":35,"tag":70,"props":7864,"children":7865},{},[7866,7871],{"type":35,"tag":81,"props":7867,"children":7869},{"className":7868},[],[7870],{"type":41,"value":710},{"type":41,"value":712},{"type":35,"tag":70,"props":7873,"children":7874},{},[7875,7880,7881,7886,7887,7892],{"type":35,"tag":81,"props":7876,"children":7878},{"className":7877},[],[7879],{"type":41,"value":721},{"type":41,"value":723},{"type":35,"tag":81,"props":7882,"children":7884},{"className":7883},[],[7885],{"type":41,"value":729},{"type":41,"value":731},{"type":35,"tag":81,"props":7888,"children":7890},{"className":7889},[],[7891],{"type":41,"value":737},{"type":41,"value":739},{"type":35,"tag":70,"props":7894,"children":7895},{},[7896,7897,7902],{"type":41,"value":744},{"type":35,"tag":81,"props":7898,"children":7900},{"className":7899},[],[7901],{"type":41,"value":750},{"type":41,"value":752},{"type":35,"tag":362,"props":7904,"children":7905},{"id":755},[7906],{"type":41,"value":758},{"type":35,"tag":44,"props":7908,"children":7909},{},[7910],{"type":41,"value":763},{"type":35,"tag":126,"props":7912,"children":7913},{"className":128,"code":766,"language":130,"meta":7,"style":7},[7914],{"type":35,"tag":81,"props":7915,"children":7916},{"__ignoreMap":7},[7917,7924,7963,7970,7977,7996,8007],{"type":35,"tag":136,"props":7918,"children":7919},{"class":138,"line":139},[7920],{"type":35,"tag":136,"props":7921,"children":7922},{"style":143},[7923],{"type":41,"value":778},{"type":35,"tag":136,"props":7925,"children":7926},{"class":138,"line":149},[7927,7931,7935,7939,7943,7947,7951,7955,7959],{"type":35,"tag":136,"props":7928,"children":7929},{"style":153},[7930],{"type":41,"value":786},{"type":35,"tag":136,"props":7932,"children":7933},{"style":153},[7934],{"type":41,"value":791},{"type":35,"tag":136,"props":7936,"children":7937},{"style":153},[7938],{"type":41,"value":796},{"type":35,"tag":136,"props":7940,"children":7941},{"style":163},[7942],{"type":41,"value":801},{"type":35,"tag":136,"props":7944,"children":7945},{"style":153},[7946],{"type":41,"value":597},{"type":35,"tag":136,"props":7948,"children":7949},{"style":163},[7950],{"type":41,"value":810},{"type":35,"tag":136,"props":7952,"children":7953},{"style":153},[7954],{"type":41,"value":815},{"type":35,"tag":136,"props":7956,"children":7957},{"style":182},[7958],{"type":41,"value":820},{"type":35,"tag":136,"props":7960,"children":7961},{"style":163},[7962],{"type":41,"value":349},{"type":35,"tag":136,"props":7964,"children":7965},{"class":138,"line":159},[7966],{"type":35,"tag":136,"props":7967,"children":7968},{"emptyLinePlaceholder":830},[7969],{"type":41,"value":833},{"type":35,"tag":136,"props":7971,"children":7972},{"class":138,"line":169},[7973],{"type":35,"tag":136,"props":7974,"children":7975},{"style":143},[7976],{"type":41,"value":841},{"type":35,"tag":136,"props":7978,"children":7979},{"class":138,"line":178},[7980,7984,7988,7992],{"type":35,"tag":136,"props":7981,"children":7982},{"style":153},[7983],{"type":41,"value":786},{"type":35,"tag":136,"props":7985,"children":7986},{"style":163},[7987],{"type":41,"value":853},{"type":35,"tag":136,"props":7989,"children":7990},{"style":153},[7991],{"type":41,"value":443},{"type":35,"tag":136,"props":7993,"children":7994},{"style":163},[7995],{"type":41,"value":862},{"type":35,"tag":136,"props":7997,"children":7998},{"class":138,"line":223},[7999,8003],{"type":35,"tag":136,"props":8000,"children":8001},{"style":153},[8002],{"type":41,"value":306},{"type":35,"tag":136,"props":8004,"children":8005},{"style":163},[8006],{"type":41,"value":874},{"type":35,"tag":136,"props":8008,"children":8009},{"class":138,"line":262},[8010,8014,8018,8022,8026],{"type":35,"tag":136,"props":8011,"children":8012},{"style":153},[8013],{"type":41,"value":597},{"type":35,"tag":136,"props":8015,"children":8016},{"style":163},[8017],{"type":41,"value":810},{"type":35,"tag":136,"props":8019,"children":8020},{"style":153},[8021],{"type":41,"value":815},{"type":35,"tag":136,"props":8023,"children":8024},{"style":182},[8025],{"type":41,"value":820},{"type":35,"tag":136,"props":8027,"children":8028},{"style":163},[8029],{"type":41,"value":349},{"type":35,"tag":362,"props":8031,"children":8032},{"id":900},[8033],{"type":41,"value":903},{"type":35,"tag":44,"props":8035,"children":8036},{},[8037],{"type":41,"value":908},{"type":35,"tag":126,"props":8039,"children":8040},{"className":128,"code":911,"language":130,"meta":7,"style":7},[8041],{"type":35,"tag":81,"props":8042,"children":8043},{"__ignoreMap":7},[8044,8051,8066,8129,8140,8147,8154,8189,8200,8211,8238,8249,8260],{"type":35,"tag":136,"props":8045,"children":8046},{"class":138,"line":139},[8047],{"type":35,"tag":136,"props":8048,"children":8049},{"style":143},[8050],{"type":41,"value":923},{"type":35,"tag":136,"props":8052,"children":8053},{"class":138,"line":149},[8054,8058,8062],{"type":35,"tag":136,"props":8055,"children":8056},{"style":153},[8057],{"type":41,"value":786},{"type":35,"tag":136,"props":8059,"children":8060},{"style":153},[8061],{"type":41,"value":935},{"type":35,"tag":136,"props":8063,"children":8064},{"style":163},[8065],{"type":41,"value":427},{"type":35,"tag":136,"props":8067,"children":8068},{"class":138,"line":159},[8069,8073,8077,8081,8085,8089,8093,8097,8101,8105,8109,8113,8117,8121,8125],{"type":35,"tag":136,"props":8070,"children":8071},{"style":163},[8072],{"type":41,"value":947},{"type":35,"tag":136,"props":8074,"children":8075},{"style":153},[8076],{"type":41,"value":786},{"type":35,"tag":136,"props":8078,"children":8079},{"style":182},[8080],{"type":41,"value":956},{"type":35,"tag":136,"props":8082,"children":8083},{"style":163},[8084],{"type":41,"value":961},{"type":35,"tag":136,"props":8086,"children":8087},{"style":153},[8088],{"type":41,"value":306},{"type":35,"tag":136,"props":8090,"children":8091},{"style":163},[8092],{"type":41,"value":970},{"type":35,"tag":136,"props":8094,"children":8095},{"style":153},[8096],{"type":41,"value":597},{"type":35,"tag":136,"props":8098,"children":8099},{"style":163},[8100],{"type":41,"value":979},{"type":35,"tag":136,"props":8102,"children":8103},{"style":153},[8104],{"type":41,"value":815},{"type":35,"tag":136,"props":8106,"children":8107},{"style":182},[8108],{"type":41,"value":562},{"type":35,"tag":136,"props":8110,"children":8111},{"style":163},[8112],{"type":41,"value":417},{"type":35,"tag":136,"props":8114,"children":8115},{"style":182},[8116],{"type":41,"value":996},{"type":35,"tag":136,"props":8118,"children":8119},{"style":163},[8120],{"type":41,"value":210},{"type":35,"tag":136,"props":8122,"children":8123},{"style":153},[8124],{"type":41,"value":215},{"type":35,"tag":136,"props":8126,"children":8127},{"style":163},[8128],{"type":41,"value":1009},{"type":35,"tag":136,"props":8130,"children":8131},{"class":138,"line":169},[8132,8136],{"type":35,"tag":136,"props":8133,"children":8134},{"style":153},[8135],{"type":41,"value":306},{"type":35,"tag":136,"props":8137,"children":8138},{"style":163},[8139],{"type":41,"value":1021},{"type":35,"tag":136,"props":8141,"children":8142},{"class":138,"line":178},[8143],{"type":35,"tag":136,"props":8144,"children":8145},{"emptyLinePlaceholder":830},[8146],{"type":41,"value":833},{"type":35,"tag":136,"props":8148,"children":8149},{"class":138,"line":223},[8150],{"type":35,"tag":136,"props":8151,"children":8152},{"style":143},[8153],{"type":41,"value":1036},{"type":35,"tag":136,"props":8155,"children":8156},{"class":138,"line":262},[8157,8161,8165,8169,8173,8177,8181,8185],{"type":35,"tag":136,"props":8158,"children":8159},{"style":153},[8160],{"type":41,"value":786},{"type":35,"tag":136,"props":8162,"children":8163},{"style":182},[8164],{"type":41,"value":562},{"type":35,"tag":136,"props":8166,"children":8167},{"style":163},[8168],{"type":41,"value":417},{"type":35,"tag":136,"props":8170,"children":8171},{"style":182},[8172],{"type":41,"value":443},{"type":35,"tag":136,"props":8174,"children":8175},{"style":163},[8176],{"type":41,"value":200},{"type":35,"tag":136,"props":8178,"children":8179},{"style":182},[8180],{"type":41,"value":465},{"type":35,"tag":136,"props":8182,"children":8183},{"style":163},[8184],{"type":41,"value":417},{"type":35,"tag":136,"props":8186,"children":8187},{"style":182},[8188],{"type":41,"value":1072},{"type":35,"tag":136,"props":8190,"children":8191},{"class":138,"line":300},[8192,8196],{"type":35,"tag":136,"props":8193,"children":8194},{"style":153},[8195],{"type":41,"value":306},{"type":35,"tag":136,"props":8197,"children":8198},{"style":163},[8199],{"type":41,"value":539},{"type":35,"tag":136,"props":8201,"children":8202},{"class":138,"line":314},[8203,8207],{"type":35,"tag":136,"props":8204,"children":8205},{"style":153},[8206],{"type":41,"value":547},{"type":35,"tag":136,"props":8208,"children":8209},{"style":163},[8210],{"type":41,"value":1095},{"type":35,"tag":136,"props":8212,"children":8213},{"class":138,"line":333},[8214,8218,8222,8226,8230,8234],{"type":35,"tag":136,"props":8215,"children":8216},{"style":153},[8217],{"type":41,"value":1103},{"type":35,"tag":136,"props":8219,"children":8220},{"style":163},[8221],{"type":41,"value":1108},{"type":35,"tag":136,"props":8223,"children":8224},{"style":182},[8225],{"type":41,"value":1113},{"type":35,"tag":136,"props":8227,"children":8228},{"style":163},[8229],{"type":41,"value":961},{"type":35,"tag":136,"props":8231,"children":8232},{"style":153},[8233],{"type":41,"value":215},{"type":35,"tag":136,"props":8235,"children":8236},{"style":163},[8237],{"type":41,"value":1009},{"type":35,"tag":136,"props":8239,"children":8240},{"class":138,"line":662},[8241,8245],{"type":35,"tag":136,"props":8242,"children":8243},{"style":153},[8244],{"type":41,"value":1133},{"type":35,"tag":136,"props":8246,"children":8247},{"style":163},[8248],{"type":41,"value":1138},{"type":35,"tag":136,"props":8250,"children":8251},{"class":138,"line":679},[8252,8256],{"type":35,"tag":136,"props":8253,"children":8254},{"style":153},[8255],{"type":41,"value":1146},{"type":35,"tag":136,"props":8257,"children":8258},{"style":163},[8259],{"type":41,"value":1151},{"type":35,"tag":136,"props":8261,"children":8262},{"class":138,"line":1154},[8263,8267,8271,8275,8279,8283,8287,8291,8295,8299],{"type":35,"tag":136,"props":8264,"children":8265},{"style":163},[8266],{"type":41,"value":1160},{"type":35,"tag":136,"props":8268,"children":8269},{"style":153},[8270],{"type":41,"value":557},{"type":35,"tag":136,"props":8272,"children":8273},{"style":182},[8274],{"type":41,"value":562},{"type":35,"tag":136,"props":8276,"children":8277},{"style":163},[8278],{"type":41,"value":417},{"type":35,"tag":136,"props":8280,"children":8281},{"style":182},[8282],{"type":41,"value":996},{"type":35,"tag":136,"props":8284,"children":8285},{"style":153},[8286],{"type":41,"value":575},{"type":35,"tag":136,"props":8288,"children":8289},{"style":182},[8290],{"type":41,"value":580},{"type":35,"tag":136,"props":8292,"children":8293},{"style":163},[8294],{"type":41,"value":417},{"type":35,"tag":136,"props":8296,"children":8297},{"style":182},[8298],{"type":41,"value":422},{"type":35,"tag":136,"props":8300,"children":8301},{"style":163},[8302],{"type":41,"value":349},{"type":35,"tag":36,"props":8304,"children":8305},{"id":1199},[8306],{"type":41,"value":1202},{"type":35,"tag":44,"props":8308,"children":8309},{},[8310],{"type":41,"value":1207},{"type":35,"tag":362,"props":8312,"children":8313},{"id":1210},[8314],{"type":41,"value":1213},{"type":35,"tag":44,"props":8316,"children":8317},{},[8318],{"type":41,"value":1218},{"type":35,"tag":1220,"props":8320,"children":8321},{},[8322,8344,8348,8352],{"type":35,"tag":70,"props":8323,"children":8324},{},[8325,8326,8331,8332,8337,8338,8343],{"type":41,"value":1227},{"type":35,"tag":81,"props":8327,"children":8329},{"className":8328},[],[8330],{"type":41,"value":597},{"type":41,"value":200},{"type":35,"tag":81,"props":8333,"children":8335},{"className":8334},[],[8336],{"type":41,"value":1239},{"type":41,"value":1241},{"type":35,"tag":81,"props":8339,"children":8341},{"className":8340},[],[8342],{"type":41,"value":320},{"type":41,"value":1248},{"type":35,"tag":70,"props":8345,"children":8346},{},[8347],{"type":41,"value":1253},{"type":35,"tag":70,"props":8349,"children":8350},{},[8351],{"type":41,"value":1258},{"type":35,"tag":70,"props":8353,"children":8354},{},[8355],{"type":41,"value":1263},{"type":35,"tag":44,"props":8357,"children":8358},{},[8359],{"type":41,"value":1268},{"type":35,"tag":66,"props":8361,"children":8362},{},[8363,8367,8377],{"type":35,"tag":70,"props":8364,"children":8365},{},[8366],{"type":41,"value":1276},{"type":35,"tag":70,"props":8368,"children":8369},{},[8370,8371,8376],{"type":41,"value":1281},{"type":35,"tag":81,"props":8372,"children":8374},{"className":8373},[],[8375],{"type":41,"value":1287},{"type":41,"value":1289},{"type":35,"tag":70,"props":8378,"children":8379},{},[8380],{"type":41,"value":1294},{"type":35,"tag":362,"props":8382,"children":8383},{"id":1297},[8384],{"type":41,"value":1300},{"type":35,"tag":44,"props":8386,"children":8387},{},[8388],{"type":41,"value":1305},{"type":35,"tag":126,"props":8390,"children":8391},{"className":128,"code":1308,"language":130,"meta":7,"style":7},[8392],{"type":35,"tag":81,"props":8393,"children":8394},{"__ignoreMap":7},[8395,8402,8413,8424,8443,8462,8481,8488,8495,8510,8537],{"type":35,"tag":136,"props":8396,"children":8397},{"class":138,"line":139},[8398],{"type":35,"tag":136,"props":8399,"children":8400},{"style":143},[8401],{"type":41,"value":1320},{"type":35,"tag":136,"props":8403,"children":8404},{"class":138,"line":149},[8405,8409],{"type":35,"tag":136,"props":8406,"children":8407},{"style":153},[8408],{"type":41,"value":786},{"type":35,"tag":136,"props":8410,"children":8411},{"style":163},[8412],{"type":41,"value":1332},{"type":35,"tag":136,"props":8414,"children":8415},{"class":138,"line":159},[8416,8420],{"type":35,"tag":136,"props":8417,"children":8418},{"style":153},[8419],{"type":41,"value":306},{"type":35,"tag":136,"props":8421,"children":8422},{"style":163},[8423],{"type":41,"value":1138},{"type":35,"tag":136,"props":8425,"children":8426},{"class":138,"line":169},[8427,8431,8435,8439],{"type":35,"tag":136,"props":8428,"children":8429},{"style":153},[8430],{"type":41,"value":597},{"type":35,"tag":136,"props":8432,"children":8433},{"style":163},[8434],{"type":41,"value":979},{"type":35,"tag":136,"props":8436,"children":8437},{"style":153},[8438],{"type":41,"value":815},{"type":35,"tag":136,"props":8440,"children":8441},{"style":182},[8442],{"type":41,"value":1363},{"type":35,"tag":136,"props":8444,"children":8445},{"class":138,"line":178},[8446,8450,8454,8458],{"type":35,"tag":136,"props":8447,"children":8448},{"style":153},[8449],{"type":41,"value":1371},{"type":35,"tag":136,"props":8451,"children":8452},{"style":153},[8453],{"type":41,"value":1376},{"type":35,"tag":136,"props":8455,"children":8456},{"style":153},[8457],{"type":41,"value":575},{"type":35,"tag":136,"props":8459,"children":8460},{"style":618},[8461],{"type":41,"value":1385},{"type":35,"tag":136,"props":8463,"children":8464},{"class":138,"line":223},[8465,8469,8473,8477],{"type":35,"tag":136,"props":8466,"children":8467},{"style":153},[8468],{"type":41,"value":320},{"type":35,"tag":136,"props":8470,"children":8471},{"style":163},[8472],{"type":41,"value":1397},{"type":35,"tag":136,"props":8474,"children":8475},{"style":153},[8476],{"type":41,"value":1402},{"type":35,"tag":136,"props":8478,"children":8479},{"style":163},[8480],{"type":41,"value":349},{"type":35,"tag":136,"props":8482,"children":8483},{"class":138,"line":262},[8484],{"type":35,"tag":136,"props":8485,"children":8486},{"emptyLinePlaceholder":830},[8487],{"type":41,"value":833},{"type":35,"tag":136,"props":8489,"children":8490},{"class":138,"line":300},[8491],{"type":35,"tag":136,"props":8492,"children":8493},{"style":143},[8494],{"type":41,"value":1421},{"type":35,"tag":136,"props":8496,"children":8497},{"class":138,"line":314},[8498,8502,8506],{"type":35,"tag":136,"props":8499,"children":8500},{"style":153},[8501],{"type":41,"value":1429},{"type":35,"tag":136,"props":8503,"children":8504},{"style":153},[8505],{"type":41,"value":1434},{"type":35,"tag":136,"props":8507,"children":8508},{"style":1437},[8509],{"type":41,"value":1440},{"type":35,"tag":136,"props":8511,"children":8512},{"class":138,"line":333},[8513,8517,8521,8525,8529,8533],{"type":35,"tag":136,"props":8514,"children":8515},{"style":153},[8516],{"type":41,"value":1448},{"type":35,"tag":136,"props":8518,"children":8519},{"style":163},[8520],{"type":41,"value":1453},{"type":35,"tag":136,"props":8522,"children":8523},{"style":153},[8524],{"type":41,"value":1458},{"type":35,"tag":136,"props":8526,"children":8527},{"style":163},[8528],{"type":41,"value":1463},{"type":35,"tag":136,"props":8530,"children":8531},{"style":153},[8532],{"type":41,"value":1402},{"type":35,"tag":136,"props":8534,"children":8535},{"style":163},[8536],{"type":41,"value":397},{"type":35,"tag":136,"props":8538,"children":8539},{"class":138,"line":662},[8540,8544],{"type":35,"tag":136,"props":8541,"children":8542},{"style":153},[8543],{"type":41,"value":1479},{"type":35,"tag":136,"props":8545,"children":8546},{"style":163},[8547],{"type":41,"value":1484},{"type":35,"tag":44,"props":8549,"children":8550},{},[8551,8552,8557,8558,8563],{"type":41,"value":1489},{"type":35,"tag":81,"props":8553,"children":8555},{"className":8554},[],[8556],{"type":41,"value":1495},{"type":41,"value":1497},{"type":35,"tag":81,"props":8559,"children":8561},{"className":8560},[],[8562],{"type":41,"value":513},{"type":41,"value":1504},{"type":35,"tag":362,"props":8565,"children":8566},{"id":1507},[8567],{"type":41,"value":1510},{"type":35,"tag":44,"props":8569,"children":8570},{},[8571],{"type":41,"value":1515},{"type":35,"tag":126,"props":8573,"children":8574},{"className":128,"code":1518,"language":130,"meta":7,"style":7},[8575],{"type":35,"tag":81,"props":8576,"children":8577},{"__ignoreMap":7},[8578,8585,8600,8611],{"type":35,"tag":136,"props":8579,"children":8580},{"class":138,"line":139},[8581],{"type":35,"tag":136,"props":8582,"children":8583},{"style":143},[8584],{"type":41,"value":1530},{"type":35,"tag":136,"props":8586,"children":8587},{"class":138,"line":149},[8588,8592,8596],{"type":35,"tag":136,"props":8589,"children":8590},{"style":153},[8591],{"type":41,"value":1429},{"type":35,"tag":136,"props":8593,"children":8594},{"style":153},[8595],{"type":41,"value":1434},{"type":35,"tag":136,"props":8597,"children":8598},{"style":1437},[8599],{"type":41,"value":1546},{"type":35,"tag":136,"props":8601,"children":8602},{"class":138,"line":159},[8603,8607],{"type":35,"tag":136,"props":8604,"children":8605},{"style":153},[8606],{"type":41,"value":1448},{"type":35,"tag":136,"props":8608,"children":8609},{"style":163},[8610],{"type":41,"value":1558},{"type":35,"tag":136,"props":8612,"children":8613},{"class":138,"line":169},[8614,8618,8622,8626,8630,8634,8638,8642],{"type":35,"tag":136,"props":8615,"children":8616},{"style":153},[8617],{"type":41,"value":1566},{"type":35,"tag":136,"props":8619,"children":8620},{"style":153},[8621],{"type":41,"value":1376},{"type":35,"tag":136,"props":8623,"children":8624},{"style":153},[8625],{"type":41,"value":1575},{"type":35,"tag":136,"props":8627,"children":8628},{"style":163},[8629],{"type":41,"value":1580},{"type":35,"tag":136,"props":8631,"children":8632},{"style":618},[8633],{"type":41,"value":1585},{"type":35,"tag":136,"props":8635,"children":8636},{"style":163},[8637],{"type":41,"value":200},{"type":35,"tag":136,"props":8639,"children":8640},{"style":618},[8641],{"type":41,"value":1594},{"type":35,"tag":136,"props":8643,"children":8644},{"style":163},[8645],{"type":41,"value":1599},{"type":35,"tag":44,"props":8647,"children":8648},{},[8649],{"type":41,"value":1604},{"type":35,"tag":362,"props":8651,"children":8652},{"id":1607},[8653],{"type":41,"value":1610},{"type":35,"tag":44,"props":8655,"children":8656},{},[8657],{"type":41,"value":1615},{"type":35,"tag":126,"props":8659,"children":8660},{"className":128,"code":1618,"language":130,"meta":7,"style":7},[8661],{"type":35,"tag":81,"props":8662,"children":8663},{"__ignoreMap":7},[8664,8671,8678,8685,8692,8707,8718,8737,8760],{"type":35,"tag":136,"props":8665,"children":8666},{"class":138,"line":139},[8667],{"type":35,"tag":136,"props":8668,"children":8669},{"style":153},[8670],{"type":41,"value":156},{"type":35,"tag":136,"props":8672,"children":8673},{"class":138,"line":149},[8674],{"type":35,"tag":136,"props":8675,"children":8676},{"style":163},[8677],{"type":41,"value":1637},{"type":35,"tag":136,"props":8679,"children":8680},{"class":138,"line":159},[8681],{"type":35,"tag":136,"props":8682,"children":8683},{"style":163},[8684],{"type":41,"value":1645},{"type":35,"tag":136,"props":8686,"children":8687},{"class":138,"line":169},[8688],{"type":35,"tag":136,"props":8689,"children":8690},{"style":163},[8691],{"type":41,"value":1653},{"type":35,"tag":136,"props":8693,"children":8694},{"class":138,"line":178},[8695,8699,8703],{"type":35,"tag":136,"props":8696,"children":8697},{"style":163},[8698],{"type":41,"value":1661},{"type":35,"tag":136,"props":8700,"children":8701},{"style":153},[8702],{"type":41,"value":215},{"type":35,"tag":136,"props":8704,"children":8705},{"style":163},[8706],{"type":41,"value":1670},{"type":35,"tag":136,"props":8708,"children":8709},{"class":138,"line":223},[8710,8714],{"type":35,"tag":136,"props":8711,"children":8712},{"style":153},[8713],{"type":41,"value":306},{"type":35,"tag":136,"props":8715,"children":8716},{"style":163},[8717],{"type":41,"value":1682},{"type":35,"tag":136,"props":8719,"children":8720},{"class":138,"line":262},[8721,8725,8729,8733],{"type":35,"tag":136,"props":8722,"children":8723},{"style":153},[8724],{"type":41,"value":597},{"type":35,"tag":136,"props":8726,"children":8727},{"style":163},[8728],{"type":41,"value":1694},{"type":35,"tag":136,"props":8730,"children":8731},{"style":153},[8732],{"type":41,"value":815},{"type":35,"tag":136,"props":8734,"children":8735},{"style":182},[8736],{"type":41,"value":1703},{"type":35,"tag":136,"props":8738,"children":8739},{"class":138,"line":300},[8740,8744,8748,8752,8756],{"type":35,"tag":136,"props":8741,"children":8742},{"style":153},[8743],{"type":41,"value":1371},{"type":35,"tag":136,"props":8745,"children":8746},{"style":163},[8747],{"type":41,"value":1715},{"type":35,"tag":136,"props":8749,"children":8750},{"style":153},[8751],{"type":41,"value":1720},{"type":35,"tag":136,"props":8753,"children":8754},{"style":153},[8755],{"type":41,"value":1725},{"type":35,"tag":136,"props":8757,"children":8758},{"style":618},[8759],{"type":41,"value":1730},{"type":35,"tag":136,"props":8761,"children":8762},{"class":138,"line":314},[8763,8767],{"type":35,"tag":136,"props":8764,"children":8765},{"style":153},[8766],{"type":41,"value":320},{"type":35,"tag":136,"props":8768,"children":8769},{"style":163},[8770],{"type":41,"value":1742},{"type":35,"tag":44,"props":8772,"children":8773},{},[8774],{"type":41,"value":1747},{"type":35,"tag":36,"props":8776,"children":8777},{"id":1750},[8778],{"type":41,"value":1753},{"type":35,"tag":44,"props":8780,"children":8781},{},[8782],{"type":41,"value":1758},{"type":35,"tag":362,"props":8784,"children":8785},{"id":1761},[8786],{"type":41,"value":1764},{"type":35,"tag":126,"props":8788,"children":8789},{"className":1767,"code":1768,"language":1769,"meta":7,"style":7},[8790],{"type":35,"tag":81,"props":8791,"children":8792},{"__ignoreMap":7},[8793,8840,8847,8878,8885,8916,8943,8978,8985,9008,9023,9050,9085,9092,9119,9126,9145,9152,9167,9178,9185,9216,9223,9230,9237,9256],{"type":35,"tag":136,"props":8794,"children":8795},{"class":138,"line":139},[8796,8800,8804,8808,8812,8816,8820,8824,8828,8832,8836],{"type":35,"tag":136,"props":8797,"children":8798},{"style":153},[8799],{"type":41,"value":1781},{"type":35,"tag":136,"props":8801,"children":8802},{"style":153},[8803],{"type":41,"value":1786},{"type":35,"tag":136,"props":8805,"children":8806},{"style":1437},[8807],{"type":41,"value":1791},{"type":35,"tag":136,"props":8809,"children":8810},{"style":163},[8811],{"type":41,"value":1796},{"type":35,"tag":136,"props":8813,"children":8814},{"style":1437},[8815],{"type":41,"value":1801},{"type":35,"tag":136,"props":8817,"children":8818},{"style":163},[8819],{"type":41,"value":1806},{"type":35,"tag":136,"props":8821,"children":8822},{"style":1437},[8823],{"type":41,"value":1811},{"type":35,"tag":136,"props":8825,"children":8826},{"style":163},[8827],{"type":41,"value":460},{"type":35,"tag":136,"props":8829,"children":8830},{"style":153},[8831],{"type":41,"value":1820},{"type":35,"tag":136,"props":8833,"children":8834},{"style":1437},[8835],{"type":41,"value":1825},{"type":35,"tag":136,"props":8837,"children":8838},{"style":163},[8839],{"type":41,"value":397},{"type":35,"tag":136,"props":8841,"children":8842},{"class":138,"line":149},[8843],{"type":35,"tag":136,"props":8844,"children":8845},{"style":163},[8846],{"type":41,"value":1837},{"type":35,"tag":136,"props":8848,"children":8849},{"class":138,"line":159},[8850,8854,8858,8862,8866,8870,8874],{"type":35,"tag":136,"props":8851,"children":8852},{"style":153},[8853],{"type":41,"value":1845},{"type":35,"tag":136,"props":8855,"children":8856},{"style":1437},[8857],{"type":41,"value":1850},{"type":35,"tag":136,"props":8859,"children":8860},{"style":153},[8861],{"type":41,"value":575},{"type":35,"tag":136,"props":8863,"children":8864},{"style":618},[8865],{"type":41,"value":1859},{"type":35,"tag":136,"props":8867,"children":8868},{"style":163},[8869],{"type":41,"value":996},{"type":35,"tag":136,"props":8871,"children":8872},{"style":618},[8873],{"type":41,"value":1868},{"type":35,"tag":136,"props":8875,"children":8876},{"style":163},[8877],{"type":41,"value":349},{"type":35,"tag":136,"props":8879,"children":8880},{"class":138,"line":169},[8881],{"type":35,"tag":136,"props":8882,"children":8883},{"emptyLinePlaceholder":830},[8884],{"type":41,"value":833},{"type":35,"tag":136,"props":8886,"children":8887},{"class":138,"line":178},[8888,8892,8896,8900,8904,8908,8912],{"type":35,"tag":136,"props":8889,"children":8890},{"style":153},[8891],{"type":41,"value":1845},{"type":35,"tag":136,"props":8893,"children":8894},{"style":1437},[8895],{"type":41,"value":1891},{"type":35,"tag":136,"props":8897,"children":8898},{"style":153},[8899],{"type":41,"value":575},{"type":35,"tag":136,"props":8901,"children":8902},{"style":153},[8903],{"type":41,"value":1900},{"type":35,"tag":136,"props":8905,"children":8906},{"style":163},[8907],{"type":41,"value":1905},{"type":35,"tag":136,"props":8909,"children":8910},{"style":1437},[8911],{"type":41,"value":1910},{"type":35,"tag":136,"props":8913,"children":8914},{"style":163},[8915],{"type":41,"value":1915},{"type":35,"tag":136,"props":8917,"children":8918},{"class":138,"line":223},[8919,8923,8927,8931,8935,8939],{"type":35,"tag":136,"props":8920,"children":8921},{"style":153},[8922],{"type":41,"value":1923},{"type":35,"tag":136,"props":8924,"children":8925},{"style":163},[8926],{"type":41,"value":1928},{"type":35,"tag":136,"props":8928,"children":8929},{"style":153},[8930],{"type":41,"value":1933},{"type":35,"tag":136,"props":8932,"children":8933},{"style":153},[8934],{"type":41,"value":1938},{"type":35,"tag":136,"props":8936,"children":8937},{"style":182},[8938],{"type":41,"value":1943},{"type":35,"tag":136,"props":8940,"children":8941},{"style":163},[8942],{"type":41,"value":397},{"type":35,"tag":136,"props":8944,"children":8945},{"class":138,"line":262},[8946,8950,8954,8958,8962,8966,8970,8974],{"type":35,"tag":136,"props":8947,"children":8948},{"style":153},[8949],{"type":41,"value":1955},{"type":35,"tag":136,"props":8951,"children":8952},{"style":163},[8953],{"type":41,"value":1960},{"type":35,"tag":136,"props":8955,"children":8956},{"style":1437},[8957],{"type":41,"value":1965},{"type":35,"tag":136,"props":8959,"children":8960},{"style":163},[8961],{"type":41,"value":1796},{"type":35,"tag":136,"props":8963,"children":8964},{"style":1437},[8965],{"type":41,"value":1801},{"type":35,"tag":136,"props":8967,"children":8968},{"style":163},[8969],{"type":41,"value":1978},{"type":35,"tag":136,"props":8971,"children":8972},{"style":153},[8973],{"type":41,"value":1983},{"type":35,"tag":136,"props":8975,"children":8976},{"style":163},[8977],{"type":41,"value":349},{"type":35,"tag":136,"props":8979,"children":8980},{"class":138,"line":300},[8981],{"type":35,"tag":136,"props":8982,"children":8983},{"emptyLinePlaceholder":830},[8984],{"type":41,"value":833},{"type":35,"tag":136,"props":8986,"children":8987},{"class":138,"line":314},[8988,8992,8996,9000,9004],{"type":35,"tag":136,"props":8989,"children":8990},{"style":153},[8991],{"type":41,"value":1845},{"type":35,"tag":136,"props":8993,"children":8994},{"style":1437},[8995],{"type":41,"value":2006},{"type":35,"tag":136,"props":8997,"children":8998},{"style":153},[8999],{"type":41,"value":575},{"type":35,"tag":136,"props":9001,"children":9002},{"style":153},[9003],{"type":41,"value":1900},{"type":35,"tag":136,"props":9005,"children":9006},{"style":163},[9007],{"type":41,"value":2019},{"type":35,"tag":136,"props":9009,"children":9010},{"class":138,"line":333},[9011,9015,9019],{"type":35,"tag":136,"props":9012,"children":9013},{"style":163},[9014],{"type":41,"value":2027},{"type":35,"tag":136,"props":9016,"children":9017},{"style":1437},[9018],{"type":41,"value":2032},{"type":35,"tag":136,"props":9020,"children":9021},{"style":163},[9022],{"type":41,"value":2037},{"type":35,"tag":136,"props":9024,"children":9025},{"class":138,"line":662},[9026,9030,9034,9038,9042,9046],{"type":35,"tag":136,"props":9027,"children":9028},{"style":163},[9029],{"type":41,"value":2027},{"type":35,"tag":136,"props":9031,"children":9032},{"style":1437},[9033],{"type":41,"value":2049},{"type":35,"tag":136,"props":9035,"children":9036},{"style":163},[9037],{"type":41,"value":460},{"type":35,"tag":136,"props":9039,"children":9040},{"style":1437},[9041],{"type":41,"value":44},{"type":35,"tag":136,"props":9043,"children":9044},{"style":153},[9045],{"type":41,"value":2062},{"type":35,"tag":136,"props":9047,"children":9048},{"style":163},[9049],{"type":41,"value":2067},{"type":35,"tag":136,"props":9051,"children":9052},{"class":138,"line":679},[9053,9057,9061,9065,9069,9073,9077,9081],{"type":35,"tag":136,"props":9054,"children":9055},{"style":163},[9056],{"type":41,"value":2027},{"type":35,"tag":136,"props":9058,"children":9059},{"style":1437},[9060],{"type":41,"value":2079},{"type":35,"tag":136,"props":9062,"children":9063},{"style":163},[9064],{"type":41,"value":460},{"type":35,"tag":136,"props":9066,"children":9067},{"style":1437},[9068],{"type":41,"value":44},{"type":35,"tag":136,"props":9070,"children":9071},{"style":153},[9072],{"type":41,"value":2062},{"type":35,"tag":136,"props":9074,"children":9075},{"style":163},[9076],{"type":41,"value":2096},{"type":35,"tag":136,"props":9078,"children":9079},{"style":153},[9080],{"type":41,"value":2101},{"type":35,"tag":136,"props":9082,"children":9083},{"style":163},[9084],{"type":41,"value":2106},{"type":35,"tag":136,"props":9086,"children":9087},{"class":138,"line":1154},[9088],{"type":35,"tag":136,"props":9089,"children":9090},{"emptyLinePlaceholder":830},[9091],{"type":41,"value":833},{"type":35,"tag":136,"props":9093,"children":9094},{"class":138,"line":2116},[9095,9099,9103,9107,9111,9115],{"type":35,"tag":136,"props":9096,"children":9097},{"style":153},[9098],{"type":41,"value":1923},{"type":35,"tag":136,"props":9100,"children":9101},{"style":163},[9102],{"type":41,"value":2126},{"type":35,"tag":136,"props":9104,"children":9105},{"style":153},[9106],{"type":41,"value":1933},{"type":35,"tag":136,"props":9108,"children":9109},{"style":153},[9110],{"type":41,"value":1938},{"type":35,"tag":136,"props":9112,"children":9113},{"style":182},[9114],{"type":41,"value":1943},{"type":35,"tag":136,"props":9116,"children":9117},{"style":163},[9118],{"type":41,"value":397},{"type":35,"tag":136,"props":9120,"children":9121},{"class":138,"line":2145},[9122],{"type":35,"tag":136,"props":9123,"children":9124},{"style":163},[9125],{"type":41,"value":2151},{"type":35,"tag":136,"props":9127,"children":9128},{"class":138,"line":2154},[9129,9133,9137,9141],{"type":35,"tag":136,"props":9130,"children":9131},{"style":153},[9132],{"type":41,"value":2160},{"type":35,"tag":136,"props":9134,"children":9135},{"style":163},[9136],{"type":41,"value":1905},{"type":35,"tag":136,"props":9138,"children":9139},{"style":1437},[9140],{"type":41,"value":2169},{"type":35,"tag":136,"props":9142,"children":9143},{"style":163},[9144],{"type":41,"value":2174},{"type":35,"tag":136,"props":9146,"children":9147},{"class":138,"line":2177},[9148],{"type":35,"tag":136,"props":9149,"children":9150},{"style":163},[9151],{"type":41,"value":2183},{"type":35,"tag":136,"props":9153,"children":9154},{"class":138,"line":2186},[9155,9159,9163],{"type":35,"tag":136,"props":9156,"children":9157},{"style":163},[9158],{"type":41,"value":2192},{"type":35,"tag":136,"props":9160,"children":9161},{"style":1437},[9162],{"type":41,"value":2197},{"type":35,"tag":136,"props":9164,"children":9165},{"style":163},[9166],{"type":41,"value":2202},{"type":35,"tag":136,"props":9168,"children":9169},{"class":138,"line":2205},[9170,9174],{"type":35,"tag":136,"props":9171,"children":9172},{"style":153},[9173],{"type":41,"value":2211},{"type":35,"tag":136,"props":9175,"children":9176},{"style":1437},[9177],{"type":41,"value":2216},{"type":35,"tag":136,"props":9179,"children":9180},{"class":138,"line":2219},[9181],{"type":35,"tag":136,"props":9182,"children":9183},{"style":163},[9184],{"type":41,"value":2225},{"type":35,"tag":136,"props":9186,"children":9187},{"class":138,"line":2228},[9188,9192,9196,9200,9204,9208,9212],{"type":35,"tag":136,"props":9189,"children":9190},{"style":163},[9191],{"type":41,"value":2234},{"type":35,"tag":136,"props":9193,"children":9194},{"style":153},[9195],{"type":41,"value":815},{"type":35,"tag":136,"props":9197,"children":9198},{"style":163},[9199],{"type":41,"value":2243},{"type":35,"tag":136,"props":9201,"children":9202},{"style":1437},[9203],{"type":41,"value":2248},{"type":35,"tag":136,"props":9205,"children":9206},{"style":163},[9207],{"type":41,"value":460},{"type":35,"tag":136,"props":9209,"children":9210},{"style":182},[9211],{"type":41,"value":2257},{"type":35,"tag":136,"props":9213,"children":9214},{"style":163},[9215],{"type":41,"value":397},{"type":35,"tag":136,"props":9217,"children":9218},{"class":138,"line":2264},[9219],{"type":35,"tag":136,"props":9220,"children":9221},{"style":163},[9222],{"type":41,"value":2270},{"type":35,"tag":136,"props":9224,"children":9225},{"class":138,"line":2273},[9226],{"type":35,"tag":136,"props":9227,"children":9228},{"style":163},[9229],{"type":41,"value":2279},{"type":35,"tag":136,"props":9231,"children":9232},{"class":138,"line":2282},[9233],{"type":35,"tag":136,"props":9234,"children":9235},{"emptyLinePlaceholder":830},[9236],{"type":41,"value":833},{"type":35,"tag":136,"props":9238,"children":9239},{"class":138,"line":2290},[9240,9244,9248,9252],{"type":35,"tag":136,"props":9241,"children":9242},{"style":153},[9243],{"type":41,"value":2296},{"type":35,"tag":136,"props":9245,"children":9246},{"style":163},[9247],{"type":41,"value":2006},{"type":35,"tag":136,"props":9249,"children":9250},{"style":153},[9251],{"type":41,"value":1983},{"type":35,"tag":136,"props":9253,"children":9254},{"style":163},[9255],{"type":41,"value":349},{"type":35,"tag":136,"props":9257,"children":9258},{"class":138,"line":2311},[9259],{"type":35,"tag":136,"props":9260,"children":9261},{"style":163},[9262],{"type":41,"value":2317},{"type":35,"tag":44,"props":9264,"children":9265},{},[9266],{"type":41,"value":2322},{"type":35,"tag":362,"props":9268,"children":9269},{"id":2325},[9270],{"type":41,"value":2328},{"type":35,"tag":44,"props":9272,"children":9273},{},[9274],{"type":41,"value":2333},{"type":35,"tag":126,"props":9276,"children":9277},{"className":128,"code":2336,"language":130,"meta":7,"style":7},[9278],{"type":35,"tag":81,"props":9279,"children":9280},{"__ignoreMap":7},[9281,9296,9303,9330,9337,9356,9383,9394,9437,9460,9467,9494,9501,9508],{"type":35,"tag":136,"props":9282,"children":9283},{"class":138,"line":139},[9284,9288,9292],{"type":35,"tag":136,"props":9285,"children":9286},{"style":153},[9287],{"type":41,"value":1429},{"type":35,"tag":136,"props":9289,"children":9290},{"style":163},[9291],{"type":41,"value":2352},{"type":35,"tag":136,"props":9293,"children":9294},{"style":153},[9295],{"type":41,"value":2357},{"type":35,"tag":136,"props":9297,"children":9298},{"class":138,"line":149},[9299],{"type":35,"tag":136,"props":9300,"children":9301},{"style":153},[9302],{"type":41,"value":156},{"type":35,"tag":136,"props":9304,"children":9305},{"class":138,"line":159},[9306,9310,9314,9318,9322,9326],{"type":35,"tag":136,"props":9307,"children":9308},{"style":163},[9309],{"type":41,"value":2372},{"type":35,"tag":136,"props":9311,"children":9312},{"style":618},[9313],{"type":41,"value":2377},{"type":35,"tag":136,"props":9315,"children":9316},{"style":163},[9317],{"type":41,"value":2382},{"type":35,"tag":136,"props":9319,"children":9320},{"style":153},[9321],{"type":41,"value":215},{"type":35,"tag":136,"props":9323,"children":9324},{"style":153},[9325],{"type":41,"value":2391},{"type":35,"tag":136,"props":9327,"children":9328},{"style":163},[9329],{"type":41,"value":427},{"type":35,"tag":136,"props":9331,"children":9332},{"class":138,"line":169},[9333],{"type":35,"tag":136,"props":9334,"children":9335},{"style":163},[9336],{"type":41,"value":2403},{"type":35,"tag":136,"props":9338,"children":9339},{"class":138,"line":178},[9340,9344,9348,9352],{"type":35,"tag":136,"props":9341,"children":9342},{"style":182},[9343],{"type":41,"value":496},{"type":35,"tag":136,"props":9345,"children":9346},{"style":163},[9347],{"type":41,"value":2415},{"type":35,"tag":136,"props":9349,"children":9350},{"style":153},[9351],{"type":41,"value":215},{"type":35,"tag":136,"props":9353,"children":9354},{"style":163},[9355],{"type":41,"value":2424},{"type":35,"tag":136,"props":9357,"children":9358},{"class":138,"line":223},[9359,9363,9367,9371,9375,9379],{"type":35,"tag":136,"props":9360,"children":9361},{"style":182},[9362],{"type":41,"value":455},{"type":35,"tag":136,"props":9364,"children":9365},{"style":163},[9366],{"type":41,"value":460},{"type":35,"tag":136,"props":9368,"children":9369},{"style":153},[9370],{"type":41,"value":2440},{"type":35,"tag":136,"props":9372,"children":9373},{"style":163},[9374],{"type":41,"value":2445},{"type":35,"tag":136,"props":9376,"children":9377},{"style":153},[9378],{"type":41,"value":215},{"type":35,"tag":136,"props":9380,"children":9381},{"style":163},[9382],{"type":41,"value":1138},{"type":35,"tag":136,"props":9384,"children":9385},{"class":138,"line":262},[9386,9390],{"type":35,"tag":136,"props":9387,"children":9388},{"style":153},[9389],{"type":41,"value":306},{"type":35,"tag":136,"props":9391,"children":9392},{"style":163},[9393],{"type":41,"value":2465},{"type":35,"tag":136,"props":9395,"children":9396},{"class":138,"line":300},[9397,9401,9405,9409,9413,9417,9421,9425,9429,9433],{"type":35,"tag":136,"props":9398,"children":9399},{"style":153},[9400],{"type":41,"value":2473},{"type":35,"tag":136,"props":9402,"children":9403},{"style":163},[9404],{"type":41,"value":2478},{"type":35,"tag":136,"props":9406,"children":9407},{"style":153},[9408],{"type":41,"value":557},{"type":35,"tag":136,"props":9410,"children":9411},{"style":182},[9412],{"type":41,"value":580},{"type":35,"tag":136,"props":9414,"children":9415},{"style":163},[9416],{"type":41,"value":417},{"type":35,"tag":136,"props":9418,"children":9419},{"style":182},[9420],{"type":41,"value":2495},{"type":35,"tag":136,"props":9422,"children":9423},{"style":153},[9424],{"type":41,"value":575},{"type":35,"tag":136,"props":9426,"children":9427},{"style":182},[9428],{"type":41,"value":2504},{"type":35,"tag":136,"props":9430,"children":9431},{"style":163},[9432],{"type":41,"value":417},{"type":35,"tag":136,"props":9434,"children":9435},{"style":182},[9436],{"type":41,"value":2513},{"type":35,"tag":136,"props":9438,"children":9439},{"class":138,"line":314},[9440,9444,9448,9452,9456],{"type":35,"tag":136,"props":9441,"children":9442},{"style":153},[9443],{"type":41,"value":629},{"type":35,"tag":136,"props":9445,"children":9446},{"style":182},[9447],{"type":41,"value":2525},{"type":35,"tag":136,"props":9449,"children":9450},{"style":163},[9451],{"type":41,"value":200},{"type":35,"tag":136,"props":9453,"children":9454},{"style":182},[9455],{"type":41,"value":205},{"type":35,"tag":136,"props":9457,"children":9458},{"style":163},[9459],{"type":41,"value":349},{"type":35,"tag":136,"props":9461,"children":9462},{"class":138,"line":333},[9463],{"type":35,"tag":136,"props":9464,"children":9465},{"emptyLinePlaceholder":830},[9466],{"type":41,"value":833},{"type":35,"tag":136,"props":9468,"children":9469},{"class":138,"line":662},[9470,9474,9478,9482,9486,9490],{"type":35,"tag":136,"props":9471,"children":9472},{"style":153},[9473],{"type":41,"value":1429},{"type":35,"tag":136,"props":9475,"children":9476},{"style":153},[9477],{"type":41,"value":1434},{"type":35,"tag":136,"props":9479,"children":9480},{"style":1437},[9481],{"type":41,"value":2560},{"type":35,"tag":136,"props":9483,"children":9484},{"style":163},[9485],{"type":41,"value":2565},{"type":35,"tag":136,"props":9487,"children":9488},{"style":153},[9489],{"type":41,"value":2570},{"type":35,"tag":136,"props":9491,"children":9492},{"style":163},[9493],{"type":41,"value":1599},{"type":35,"tag":136,"props":9495,"children":9496},{"class":138,"line":679},[9497],{"type":35,"tag":136,"props":9498,"children":9499},{"emptyLinePlaceholder":830},[9500],{"type":41,"value":833},{"type":35,"tag":136,"props":9502,"children":9503},{"class":138,"line":1154},[9504],{"type":35,"tag":136,"props":9505,"children":9506},{"style":143},[9507],{"type":41,"value":2589},{"type":35,"tag":136,"props":9509,"children":9510},{"class":138,"line":2116},[9511],{"type":35,"tag":136,"props":9512,"children":9513},{"style":163},[9514],{"type":41,"value":2597},{"type":35,"tag":44,"props":9516,"children":9517},{},[9518,9523],{"type":35,"tag":81,"props":9519,"children":9521},{"className":9520},[],[9522],{"type":41,"value":2606},{"type":41,"value":2608},{"type":35,"tag":36,"props":9525,"children":9526},{"id":2611},[9527],{"type":41,"value":2614},{"type":35,"tag":44,"props":9529,"children":9530},{},[9531],{"type":41,"value":2619},{"type":35,"tag":2621,"props":9533,"children":9534},{},[9535,9549],{"type":35,"tag":2625,"props":9536,"children":9537},{},[9538],{"type":35,"tag":2629,"props":9539,"children":9540},{},[9541,9545],{"type":35,"tag":2633,"props":9542,"children":9543},{},[9544],{"type":41,"value":2637},{"type":35,"tag":2633,"props":9546,"children":9547},{},[9548],{"type":41,"value":2642},{"type":35,"tag":2644,"props":9550,"children":9551},{},[9552,9563,9574,9585,9596],{"type":35,"tag":2629,"props":9553,"children":9554},{},[9555,9559],{"type":35,"tag":2651,"props":9556,"children":9557},{},[9558],{"type":41,"value":2655},{"type":35,"tag":2651,"props":9560,"children":9561},{},[9562],{"type":41,"value":2660},{"type":35,"tag":2629,"props":9564,"children":9565},{},[9566,9570],{"type":35,"tag":2651,"props":9567,"children":9568},{},[9569],{"type":41,"value":2668},{"type":35,"tag":2651,"props":9571,"children":9572},{},[9573],{"type":41,"value":2673},{"type":35,"tag":2629,"props":9575,"children":9576},{},[9577,9581],{"type":35,"tag":2651,"props":9578,"children":9579},{},[9580],{"type":41,"value":2681},{"type":35,"tag":2651,"props":9582,"children":9583},{},[9584],{"type":41,"value":2686},{"type":35,"tag":2629,"props":9586,"children":9587},{},[9588,9592],{"type":35,"tag":2651,"props":9589,"children":9590},{},[9591],{"type":41,"value":2694},{"type":35,"tag":2651,"props":9593,"children":9594},{},[9595],{"type":41,"value":2699},{"type":35,"tag":2629,"props":9597,"children":9598},{},[9599,9609],{"type":35,"tag":2651,"props":9600,"children":9601},{},[9602,9603,9608],{"type":41,"value":2707},{"type":35,"tag":81,"props":9604,"children":9606},{"className":9605},[],[9607],{"type":41,"value":2713},{"type":41,"value":2715},{"type":35,"tag":2651,"props":9610,"children":9611},{},[9612],{"type":41,"value":2720},{"type":35,"tag":44,"props":9614,"children":9615},{},[9616],{"type":41,"value":2725},{"type":35,"tag":36,"props":9618,"children":9619},{"id":2728},[9620],{"type":41,"value":2731},{"type":35,"tag":44,"props":9622,"children":9623},{},[9624],{"type":41,"value":2736},{"type":35,"tag":66,"props":9626,"children":9627},{},[9628,9636,9644,9664],{"type":35,"tag":70,"props":9629,"children":9630},{},[9631,9635],{"type":35,"tag":74,"props":9632,"children":9633},{},[9634],{"type":41,"value":2747},{"type":41,"value":2749},{"type":35,"tag":70,"props":9637,"children":9638},{},[9639,9643],{"type":35,"tag":74,"props":9640,"children":9641},{},[9642],{"type":41,"value":2757},{"type":41,"value":2759},{"type":35,"tag":70,"props":9645,"children":9646},{},[9647,9651,9652,9657,9658,9663],{"type":35,"tag":74,"props":9648,"children":9649},{},[9650],{"type":41,"value":2767},{"type":41,"value":2769},{"type":35,"tag":81,"props":9653,"children":9655},{"className":9654},[],[9656],{"type":41,"value":2713},{"type":41,"value":2776},{"type":35,"tag":81,"props":9659,"children":9661},{"className":9660},[],[9662],{"type":41,"value":2782},{"type":41,"value":2784},{"type":35,"tag":70,"props":9665,"children":9666},{},[9667,9671,9672,9677,9678,9683,9684,9689,9690,9695],{"type":35,"tag":74,"props":9668,"children":9669},{},[9670],{"type":41,"value":2792},{"type":41,"value":79},{"type":35,"tag":81,"props":9673,"children":9675},{"className":9674},[],[9676],{"type":41,"value":2799},{"type":41,"value":2801},{"type":35,"tag":81,"props":9679,"children":9681},{"className":9680},[],[9682],{"type":41,"value":2807},{"type":41,"value":2809},{"type":35,"tag":81,"props":9685,"children":9687},{"className":9686},[],[9688],{"type":41,"value":2815},{"type":41,"value":2817},{"type":35,"tag":81,"props":9691,"children":9693},{"className":9692},[],[9694],{"type":41,"value":2823},{"type":41,"value":1289},{"type":35,"tag":44,"props":9697,"children":9698},{},[9699],{"type":41,"value":2829},{"type":35,"tag":2831,"props":9701,"children":9702},{},[9703],{"type":41,"value":2835},{"title":7,"searchDepth":159,"depth":159,"links":9705},[9706,9707,9708,9713,9719,9723,9724],{"id":38,"depth":149,"text":42},{"id":56,"depth":149,"text":59},{"id":357,"depth":149,"text":360,"children":9709},[9710,9711,9712],{"id":364,"depth":159,"text":367},{"id":755,"depth":159,"text":758},{"id":900,"depth":159,"text":903},{"id":1199,"depth":149,"text":1202,"children":9714},[9715,9716,9717,9718],{"id":1210,"depth":159,"text":1213},{"id":1297,"depth":159,"text":1300},{"id":1507,"depth":159,"text":1510},{"id":1607,"depth":159,"text":1610},{"id":1750,"depth":149,"text":1753,"children":9720},[9721,9722],{"id":1761,"depth":159,"text":1764},{"id":2325,"depth":159,"text":2328},{"id":2611,"depth":149,"text":2614},{"id":2728,"depth":149,"text":2731},1777018790900]