<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://blog.lzstock.app/blog</id>
    <title>LZStock Blog Blog</title>
    <updated>2026-04-03T20:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://blog.lzstock.app/blog"/>
    <subtitle>LZStock Blog Blog</subtitle>
    <icon>https://blog.lzstock.app/img/favicon.png</icon>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (8) - Summary]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-summary</id>
        <link href="https://blog.lzstock.app/blog/battle-test-summary"/>
        <updated>2026-04-03T20:00:00.000Z</updated>
        <summary type="html"><![CDATA[After a series of rigorous load tests, including smoke tests, a 1.5k Virtual Users (VUs) spike test, and a 5k VUs capacity test, the streaming engine architecture has proven its resilience and performance. Here is a summary of the journey, the bottlenecks discovered, and the solutions implemented.]]></summary>
        <content type="html"><![CDATA[<p>After a series of rigorous load tests, including smoke tests, a 1.5k Virtual Users (VUs) spike test, and a 5k VUs capacity test, the streaming engine architecture has proven its resilience and performance. Here is a summary of the journey, the bottlenecks discovered, and the solutions implemented.</p>
<p><img decoding="async" loading="lazy" alt="Summary Chart" src="https://blog.lzstock.app/assets/images/summary-chart-dec5896986cfbc1cf23d7fb36aa5f07b.svg#light-only" width="1716" height="2015" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Summary Chart Dark" src="https://blog.lzstock.app/assets/images/summary-chart-dark-6411b4ef6958466a3437f062843b51a6.svg#dark-only" width="1716" height="2015" class="img_ev3q"></p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-achievements-at-a-glance">Key Achievements at a Glance<a href="https://blog.lzstock.app/blog/battle-test-summary#key-achievements-at-a-glance" class="hash-link" aria-label="Direct link to Key Achievements at a Glance" title="Direct link to Key Achievements at a Glance" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5000-ccu-capacity-test">5000 CCU Capacity Test<a href="https://blog.lzstock.app/blog/battle-test-summary#5000-ccu-capacity-test" class="hash-link" aria-label="Direct link to 5000 CCU Capacity Test" title="Direct link to 5000 CCU Capacity Test" translate="no">​</a></h3>
<ul>
<li class="">🚀 5,000 CCU Peak Capacity: Perfectly maintained 5,000 concurrent active WebSocket connections.</li>
<li class="">⚡ 14,000 ops/sec Broadcast: Handled massive throughput at peak capacity, pushing 2.6+ million updates in 10 minutes.</li>
<li class="">📉 30% Latency Improvement: Significantly improved real-time responsiveness, reducing P50 streaming latency from &gt;1s down to 500ms.</li>
<li class="">🧠 Optimized Hardware Footprint (~2 CPU Cores): Reduced CPU usage by up to 10% (stabilizing at 2 cores), sustaining the absolute maximum load with high efficiency.</li>
<li class="">🛡️ Zero Resource Leaks &amp; 33% Less RAM: Slashed memory consumption from 300MB to 200MB (a 33% reduction on BC11) while ensuring perfect Goroutine cleanup when 5,000 users abruptly disconnect.</li>
</ul>
<table><thead><tr><th>Metric</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>CPU <br> BC11(G): 2.2 -&gt; 2 <br> (10% reduction) <br> BC15(Y): 2.1-&gt; 2 <br> (5% reduction)</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-cpu-before-aae11a8399552b257f1f56efa87fc920.png" width="256" height="272" class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-cpu-after-6d5df06d8592cebe81df14e57e000a62.png" width="464" height="278" class="img_ev3q"></td></tr><tr><td>Memory <br> BC11(G): 300MB -&gt; 200MB <br> (33% reduction) <br> BC15(Y): 512 MB -&gt; 512 MB <br> (0% reduction)</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-ram-before-7d1cdd964dd64ff953fd58b7ace03088.png" width="384" height="280" class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-ram-after-d7d8237e5343c39a991472cd6b456f62.png" width="387" height="276" class="img_ev3q"></td></tr><tr><td>P50 Streaming latency (Y) <br> &gt;1s -&gt; 500ms <br> (50% reduction)</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-streaming-before-6fe099b816d250d1d943e5d66f93b0f0.png" width="380" height="249" class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-streaming-after-9698ee689cc0ddda7f750a8349cd50f7.png" width="590" height="258" class="img_ev3q"></td></tr></tbody></table>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Capacity Test Results</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">CPU<!-- -->
<ul>
<li class="">BC11: 2.2 -&gt; 2 (10% reduction)</li>
<li class="">BC15: 2.1-&gt; 2 (5% reduction)</li>
</ul>
</li>
<li class="">Ram<!-- -->
<ul>
<li class="">BC11: 300MB -&gt; 200MB (33% reduction)</li>
<li class="">BC15: 512 MB -&gt; 512 MB (0% reduction)</li>
</ul>
</li>
<li class="">P50 Streaming latency<!-- -->
<ul>
<li class="">1s -&gt; 500ms (50% reduction)</li>
</ul>
</li>
</ul><p><img decoding="async" loading="lazy" alt="Final Load Test Dashboard 5000" src="https://blog.lzstock.app/assets/images/5000-final-8282deafff8d1a064da0a497577a8557.png" width="1881" height="817" class="img_ev3q"></p></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1500-ccu-sudden-spike-test">1500 CCU Sudden Spike Test<a href="https://blog.lzstock.app/blog/battle-test-summary#1500-ccu-sudden-spike-test" class="hash-link" aria-label="Direct link to 1500 CCU Sudden Spike Test" title="Direct link to 1500 CCU Sudden Spike Test" translate="no">​</a></h3>
<ul>
<li class="">🚀 1,500 CCU Peak Capacity: Perfectly maintained 1,500 concurrent active WebSocket connections under sudden spike test conditions.</li>
<li class="">📉 Up to 40% Latency Reduction: Significantly improved real-time responsiveness under heavy load, slashing P99 streaming latency from 1s to 600ms (40% faster) and P99 subscription latency to 320ms (36% faster).</li>
<li class="">🧠 Optimized Hardware Footprint: Drastically improved compute efficiency, reducing CPU usage by up to 50% (stabilizing at just 0.6 to 0.8 cores) to sustain maximum load.</li>
<li class="">🛡️ Zero Leaks &amp; Robust Resilience: Slashed peak Goroutine count by 76% (from 37k down to 9k) and memory consumption by 37% (270MB down to 170MB), ensuring perfect resource cleanup even when 1,500 users abruptly disconnect.</li>
</ul>
<table><thead><tr><th>Metric</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>Memory <br> BC11(G): 90MB -&gt; 90MB <br> (0% reduction) <br> BC15(Y): 270MB -&gt; 170MB <br> (37% reduction)</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-ram-before-4afaf786ec23c43a4ad1794be574ecaf.png" width="391" height="285" class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-ram-after-3b587174353af63cedb04d42e89f0929.png" width="379" height="280" class="img_ev3q"></td></tr><tr><td>CPU <br> BC11(G): 1.2 -&gt; 0.8 <br> (33% reduction) <br> BC15(Y): 1.2 -&gt; 0.6 <br> (50% reduction)</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-cpu-before-dcc3e6f9a2b7a2ff68989d621ddfc1f8.png" width="476" height="284" class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-cpu-after-387b25e964ba3072912dbe319fddddbf.png" width="474" height="283" class="img_ev3q"></td></tr><tr><td>Subscription P99 Latency <br> 500ms -&gt; 320ms <br> (36% reduction)</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-sub-latency-before-7ccf67aa1d4649629cb0307d565dd8d4.png" width="339" height="249" class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-sub-latency-after-43e1499c0adae5898fca4dfe1d65837c.png" width="315" height="236" class="img_ev3q"></td></tr><tr><td>Streaming P99 Latency <br> 1s -&gt; 600ms <br> (40% reduction)</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-streaming-before-5952261097add2dc294ea8bb04057a6f.png" width="384" height="263" class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-streaming-after-d45c355de3fc128524b8276105d5c86a.png" width="324" height="250" class="img_ev3q"></td></tr><tr><td>Goroutine Count at peak <br> 37000 -&gt; 9000 <br> (76% reduction)</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-goroutine-before-f7f7d4a167ab3c247fd0a7c068ee403e.png" width="465" height="266" class="img_ev3q"></td><td><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="311" height="260" class="img_ev3q"></td></tr></tbody></table>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Spike Test Results</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">Ram:<!-- -->
<ul>
<li class="">BC11: 90MB -&gt; 90MB</li>
<li class="">BC15: 270MB -&gt; 170MB (37% reduction)</li>
</ul>
</li>
<li class="">CPU<!-- -->
<ul>
<li class="">BC11: 1.2 -&gt; 0.8 (33% reduction)</li>
<li class="">BC15: 1.2 -&gt; 0.6 (50% reduction)</li>
</ul>
</li>
<li class="">Subscription P99 Latency<!-- -->
<ul>
<li class="">500ms -&gt; 320ms (36% reduction)</li>
</ul>
</li>
<li class="">Streaming P99 Latency<!-- -->
<ul>
<li class="">1s -&gt; 600ms (40% reduction)</li>
</ul>
</li>
<li class="">Goroutine Count at peak<!-- -->
<ul>
<li class="">37000 -&gt; 9000 (76% reduction)</li>
</ul>
</li>
</ul><p><img decoding="async" loading="lazy" alt="1500 Final Load Test Dashboard" src="https://blog.lzstock.app/assets/images/1500-final-928864b630763044370ff1f6bd2a89eb.png" width="1876" height="811" class="img_ev3q"></p></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-test-results">Load Test Results<a href="https://blog.lzstock.app/blog/battle-test-summary#load-test-results" class="hash-link" aria-label="Direct link to Load Test Results" title="Direct link to Load Test Results" translate="no">​</a></h2>
<ul>
<li class=""><strong>Capacity Test (5,000 VUs):</strong> Perfectly maintained 5,000 concurrent active WebSocket connections. The system successfully distributed over 260+ million real-time price updates within 10 minutes, with a peak broadcast rate of <strong>14,000 ops/sec</strong>. It achieved this using an optimized hardware footprint of only <strong>~2 CPU cores</strong> (a 10% reduction) and <strong>200MB RAM</strong> (a 33% reduction). Furthermore, P50 streaming latency was reduced by 50% down to <strong>500ms</strong>, with zero memory or goroutine leaks after the test ended.</li>
<li class=""><strong>Spike Test (1,500 VUs):</strong> Successfully handled massive connection churns, proving the system's robust resilience under sudden traffic surges and drops. Compute efficiency was drastically improved, requiring only <strong>0.6 to 0.8 CPU cores</strong> (up to 50% reduction) and slashing peak Goroutine count by <strong>76%</strong> (from 37,000 down to 9,000). Real-time responsiveness was significantly enhanced, achieving a <strong>320ms P99 subscription latency</strong> (36% faster) and <strong>600ms P99 streaming latency</strong> (40% faster).</li>
</ul>
<p><em>Note: I intentionally set up 200ms frequency to batch the price updates to simulate the real-world market volatility.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="challenges--solutions">Challenges &amp; Solutions<a href="https://blog.lzstock.app/blog/battle-test-summary#challenges--solutions" class="hash-link" aria-label="Direct link to Challenges &amp; Solutions" title="Direct link to Challenges &amp; Solutions" translate="no">​</a></h2>
<p>Throughout the testing phases, several critical concurrency and resource management issues were exposed and resolved:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-race-conditions--panics">1. Race Conditions &amp; Panics<a href="https://blog.lzstock.app/blog/battle-test-summary#1-race-conditions--panics" class="hash-link" aria-label="Direct link to 1. Race Conditions &amp; Panics" title="Direct link to 1. Race Conditions &amp; Panics" translate="no">​</a></h3>
<ul>
<li class=""><strong>Issue:</strong> <code>panic: close of closed channel</code> occurred when multiple goroutines (API, background cleanup, WebSocket close) attempted to deactivate the same session concurrently.</li>
<li class=""><strong>Solution:</strong> Made the <code>deactivateSession</code> function idempotent using a session-level lock (<code>if !session.IsActive { return }</code>) before cleaning up resources.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-resource--goroutine-leaks">2. Resource &amp; Goroutine Leaks<a href="https://blog.lzstock.app/blog/battle-test-summary#2-resource--goroutine-leaks" class="hash-link" aria-label="Direct link to 2. Resource &amp; Goroutine Leaks" title="Direct link to 2. Resource &amp; Goroutine Leaks" translate="no">​</a></h3>
<ul>
<li class=""><strong>Redis Pub/Sub Leak:</strong> Connections leaked when <code>stream.Send()</code> errors bypassed the session deactivation. Fixed by ensuring <code>deactivateSession</code> is called within a <code>defer</code> statement.</li>
<li class=""><strong>WebSocket Goroutine Leak:</strong> The API gateway accumulated up to 40k leaked goroutines for only 1.3k connections due to improper context cancellation and unhandled TCP drops. Fixed by:<!-- -->
<ul>
<li class="">Returning and properly deferring the <code>cancel</code> function from custom <code>WithTimeout</code> contexts.</li>
<li class="">Implementing explicit <code>conn.Close()</code> on context completion instead of relying on blocked actions in <code>select</code> default cases.</li>
<li class="">Adding Ping/Pong handlers with read deadlines (<code>conn.SetReadDeadline</code>) to gracefully detect and close dead connections that didn't send a TCP FIN packet.</li>
</ul>
</li>
<li class=""><strong>Long-tail Resource Leak:</strong> Calling <code>close(session.PriceStream)</code> caused panics if background goroutines were still interacting with it. Fixed by using <code>context.CancelFunc</code> to unblock receivers and letting the Garbage Collector (GC) safely reclaim the unclosed channels.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-performance-tuning--micro-optimizations">3. Performance Tuning &amp; Micro-optimizations<a href="https://blog.lzstock.app/blog/battle-test-summary#3-performance-tuning--micro-optimizations" class="hash-link" aria-label="Direct link to 3. Performance Tuning &amp; Micro-optimizations" title="Direct link to 3. Performance Tuning &amp; Micro-optimizations" translate="no">​</a></h3>
<ul>
<li class=""><strong>O(1) Map Lookup:</strong> Replaced the array-based <code>priceChannels</code> management with a nested map (<code>map[string]map[string]chan</code>) keyed by <code>sessionID</code>. This O(1) deletion significantly reduced overhead and lock contention during high-churn disconnection events.</li>
<li class=""><strong>Timestamp Type Conversion:</strong> Avoided expensive string-to-int parsing (<code>strconv.ParseInt</code>) by changing the Protobuf timestamp type to <code>int64</code>. This micro-optimization, combined with the structural changes, was the key driver in slashing the <strong>P99 latency down to 600ms</strong> and lowering overall CPU usage by up to 50%.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-takeaways">Key Takeaways<a href="https://blog.lzstock.app/blog/battle-test-summary#key-takeaways" class="hash-link" aria-label="Direct link to Key Takeaways" title="Direct link to Key Takeaways" translate="no">​</a></h2>
<ol>
<li class=""><strong>Let GC Handle Data Channels:</strong> "Never close a channel from the receiver (Session) side. Only close it from the sender, or let GC handle it." Use Context to signal cancellations instead of explicitly closing data channels that might still have concurrent senders, avoiding <code>close of closed channel</code> panics.</li>
<li class=""><strong>Avoid Blocking in <code>select default</code>:</strong> "In a loop, never put blocking functions (like network reads, channel receives) in the default case of a select!" It defeats the purpose of the <code>select</code> statement and blocks the goroutine from receiving the context cancellation signal.</li>
<li class=""><strong>Context Cancellation Responsibility:</strong> "Who calls, who is responsible for cancellation." Always defer the cancel function in the exact same scope where the context was created to guarantee execution.</li>
<li class=""><strong>WebSocket Lifecycle Management:</strong> HTTP connections upgraded to WebSockets require explicit, manual closure. They do not automatically tear down when the HTTP context is done, nor do they reliably emit TCP FIN packets if the client abruptly disconnects or loses network. Always implement application-level Ping/Pong heartbeat and zombine cleanup mechanisms.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="check-the-series-of-posts">Check the series of posts:<a href="https://blog.lzstock.app/blog/battle-test-summary#check-the-series-of-posts" class="hash-link" aria-label="Direct link to Check the series of posts:" title="Direct link to Check the series of posts:" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://blog.lzstock.app/blog/battle-test-0">Streaming Engine to 5k+ Users (0) - Set up</a></li>
<li class=""><a class="" href="https://blog.lzstock.app/blog/battle-test-1">Streaming Engine to 5k+ Users (1) - Debugging a Race Condition in SessionManager.</a></li>
<li class=""><a class="" href="https://blog.lzstock.app/blog/battle-test-2">Streaming Engine to 5k+ Users (2) - Debugging Leaked Redis Pub/Sub Connections</a></li>
<li class=""><a class="" href="https://blog.lzstock.app/blog/battle-test-3">Streaming Engine to 5k+ Users (3) - Debugging Leaked Goroutine with Websocket</a></li>
<li class=""><a class="" href="https://blog.lzstock.app/blog/battle-test-4">Streaming Engine to 5k+ Users (4) - Shifting to Capacity Test</a></li>
<li class=""><a class="" href="https://blog.lzstock.app/blog/battle-test-5">Streaming Engine to 5k+ Users (5) - Performance Tuning </a></li>
<li class=""><a class="" href="https://blog.lzstock.app/blog/battle-test-6">Streaming Engine to 5k+ Users (6) - Micro-optimization</a></li>
<li class=""><a class="" href="https://blog.lzstock.app/blog/battle-test-7">Streaming Engine to 5k+ Users (7) - Debugging Long-tail Resource Leaks</a></li>
</ul>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (7) - Debugging Long-tail Resource Leaks]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-7</id>
        <link href="https://blog.lzstock.app/blog/battle-test-7"/>
        <updated>2026-04-03T16:00:00.000Z</updated>
        <summary type="html"><![CDATA[Test Goal]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-goal">Test Goal<a href="https://blog.lzstock.app/blog/battle-test-7#test-goal" class="hash-link" aria-label="Direct link to Test Goal" title="Direct link to Test Goal" translate="no">​</a></h2>
<p>There is a long-tail resource leak issue that may affect the performance. It happened when the server was idle for a while after a load test without restarting the server.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.lzstock.app/blog/battle-test-7#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>I fixed the long-tail resource leak issue. No more error logs are shown after the load test.</p>
<p>If you are interested in the testing process, please continue reading.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="observations">Observations<a href="https://blog.lzstock.app/blog/battle-test-7#observations" class="hash-link" aria-label="Direct link to Observations" title="Direct link to Observations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="long-tail-resource-leaks">Long-tail Resource Leaks<a href="https://blog.lzstock.app/blog/battle-test-7#long-tail-resource-leaks" class="hash-link" aria-label="Direct link to Long-tail Resource Leaks" title="Direct link to Long-tail Resource Leaks" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">goroutine 23228 [chan receive]:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lzstock/mods/bc11-market-monitor/useCases.(*RedisSubscriptionManager).listenToRedis(0xc000463e90, {0xc00030c350, 0x3}, 0xc00098f7a0?)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /build/mods/bc11-market-monitor/useCases/RedisSubscriptionManager.go:88 +0x65</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">created by lzstock/mods/bc11-market-monitor/useCases.(*RedisSubscriptionManager).AddSubscription in goroutine 23223</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /build/mods/bc11-market-monitor/useCases/RedisSubscriptionManager.go:54 +0x345</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">goroutine 23206 [select]:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lzstock/mods/bc11-market-monitor/useCases.(*StreamStockPriceUseCase).StreamPriceUpdates(0xc00013eee0, 0xc0004c19e0, {0x114bc30, 0xc0028285f0})</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /build/mods/bc11-market-monitor/useCases/StreamStockPrice.go:49 +0x4d0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lzstock/mods/bc11-market-monitor/controllers.(*Controller).StreamPriceUpdates(0xc00304c780?, 0xf4cb40?, {0x114bc30?, 0xc0028285f0?})</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /build/mods/bc11-market-monitor/controllers/StockPrice.go:52 +0xd7</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lzstock/shared/go/protos/bc11_market_monitor._RealTimePriceMonitoringService_StreamPriceUpdates_Handler({0xea5ce0, 0xc00011a2d8}, {0x114a8b0, 0xc00304c780})</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /build/shared/go/protos/bc11_market_monitor/bc11_market_monitor.service.pb.go:474 +0x110</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">google.golang.org/grpc.(*Server).processStreamingRPC(0xc000478000, {0x1147190, 0xc00295d0b0}, 0xc00125c600, 0xc00047a000, 0x1837b00, 0x0)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /go/pkg/mod/google.golang.org/grpc@v1.75.0/server.go:1722 +0x12e8</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">google.golang.org/grpc.(*Server).handleStream(0xc000478000, {0x1147830, 0xc000326000}, 0xc00125c600)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /go/pkg/mod/google.golang.org/grpc@v1.75.0/server.go:1846 +0xb47</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">google.golang.org/grpc.(*Server).serveStreams.func2.1()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /go/pkg/mod/google.golang.org/grpc@v1.75.0/server.go:1061 +0x7f</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">created by google.golang.org/grpc.(*Server).serveStreams.func2 in goroutine 1582</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  /go/pkg/mod/google.golang.org/grpc@v1.75.0/server.go:1072 +0x11d</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="root-cause-analysis-long-tail-resource-leaks">Root Cause Analysis: Long-tail Resource Leaks<a href="https://blog.lzstock.app/blog/battle-test-7#root-cause-analysis-long-tail-resource-leaks" class="hash-link" aria-label="Direct link to Root Cause Analysis: Long-tail Resource Leaks" title="Direct link to Root Cause Analysis: Long-tail Resource Leaks" translate="no">​</a></h2>
<p><strong>Sender</strong>: RedisSubscriptionManager's broadcast loop.</p>
<p><strong>Receiver</strong>: gRPC's StreamPriceUpdates.</p>
<p><strong>Owner</strong>: sessionManager (because it creates the channel using make(chan)).</p>
<p>I got a mixed suggestions that I should close the channel actively or rely on GC to close it. I decided to leave it out there. Unfortunately, it is not a good idea. That was the reason for this issue.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Session Manager</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 1. Detach this session's channel from the global Redis listener</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ticker </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Tickers </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">redisSubManager</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RemoveSubscription</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 2. Close the channel</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// close(session.PriceStream)</span><br></span></code></pre></div></div>
<p>The easiest way to fix this issue is to uncomment the line that closes the channel. However, it is a bad smell. Relying on execution order to safely close a channel is a very fragile design</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution">Solution<a href="https://blog.lzstock.app/blog/battle-test-7#solution" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution" translate="no">​</a></h2>
<p><strong>Never Close Data Channel, use context instead</strong></p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// SubscribeStockPriceUseCase</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">u </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">SubscribeStockPriceUseCase</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">Executes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">dtos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StartPriceMonitoring</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">defer</span><span class="token plain"> appErrs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Recover</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Tickers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> appErrs</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ErrEmptyTickers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Create a monitoring session</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  session </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">         uuid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    PriceStream</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">chan</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">schema</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MarketPrice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   ctx    context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   cancel context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CancelFunc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sm </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">deactivateSessionLocked</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sessionID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  session </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessions</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">cancel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">u </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">StreamStockPriceUseCase</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">StreamPriceUpdates</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">dtos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StreamPriceUpdates</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stream pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RealTimePriceMonitoringService_StreamPriceUpdatesServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> price </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PriceStream</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">flushTicker</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">C</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">     </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="result">Result<a href="https://blog.lzstock.app/blog/battle-test-7#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<p><strong>Rule</strong>: Receiver and Manager should not close the data channel.</p>
<p><strong>Solution</strong>: Use RemoveSubscription to block the data source, let PriceStream be collected by GC gracefully. Use context.CancelFunc to replace close, wake up and end the zombie Goroutine stuck in the select.</p>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (6) - Micro-optimization]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-6</id>
        <link href="https://blog.lzstock.app/blog/battle-test-6"/>
        <updated>2026-04-02T23:00:00.000Z</updated>
        <summary type="html"><![CDATA[Test Goal]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-goal">Test Goal<a href="https://blog.lzstock.app/blog/battle-test-6#test-goal" class="hash-link" aria-label="Direct link to Test Goal" title="Direct link to Test Goal" translate="no">​</a></h2>
<p>There is a type conversion issue that may affect the performance. Let's fix it and observe whether the performance is improved or not.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.lzstock.app/blog/battle-test-6#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>I fixed the type conversion issue. The P99 latency is reduced from 700ms to 450ms roughly and CPU usage is reduced a bit from from 0.8 to 0.5 roughly.</p>
<p>If you are interested in the testing process, please continue reading.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimization">Optimization<a href="https://blog.lzstock.app/blog/battle-test-6#optimization" class="hash-link" aria-label="Direct link to Optimization" title="Direct link to Optimization" translate="no">​</a></h2>
<div class="language-proto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-proto codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">message MarketPrice {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  string ticker = 1; // "TSLA"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  TradePrice trade = 2;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  PriceChange price_change = 3;</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">- string timestamp = 4;</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">+ int64 timestamp = 4;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">now </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">UnixMilli</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Results </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> sourceTs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> strconv</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ParseInt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Timestamp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   latency </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">float64</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">now </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Timestamp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> latency </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">float64</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">now </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Timestamp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="result">Result<a href="https://blog.lzstock.app/blog/battle-test-6#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<p><strong>CPU &amp; Memory</strong></p>
<p>CPU usage is reduced a bit from from 0.8 to 0.5 roughly (Yellow line).
<img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-upgrade-to-pricemap-timestamp-comparison-cpu-memory-2b05bfe7a8f8a2741e36497fbcb6dcd0.png" width="711" height="503" class="img_ev3q"></p>
<p><strong>Streaming Latency</strong></p>
<p>P99 latency is reduced from 700ms to 450ms roughly (Green line).
<img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-upgrade-to-pricemap-timestamp-comparison-streaming-latency-a11a3902a8fd38d2af2ee38b91a0b37c.png" width="406" height="547" class="img_ev3q"></p>
<p>I am alomst done with the load test. There is just one last piece of the puzzle to fix that is so called Long-tail resource leak. I will cover it in the next article.</p>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (5) - Performance Tuning]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-5</id>
        <link href="https://blog.lzstock.app/blog/battle-test-5"/>
        <updated>2026-04-02T20:00:00.000Z</updated>
        <summary type="html"><![CDATA[Test Goal]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-goal">Test Goal<a href="https://blog.lzstock.app/blog/battle-test-5#test-goal" class="hash-link" aria-label="Direct link to Test Goal" title="Direct link to Test Goal" translate="no">​</a></h2>
<p>There is a minor issue in the price channel management that may affect performance when conection rapidly built and destroyed. Let's fix it and observe whether the latency meter could be improved or not.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.lzstock.app/blog/battle-test-5#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>I updated the price channel management to use a map with sessionID. It is more efficient than the previous array. The P99 latency is reduced from above 1 second to around 800ms.</p>
<p>If you are interested in the testing process, please continue reading.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="spike-test">Spike Test<a href="https://blog.lzstock.app/blog/battle-test-5#spike-test" class="hash-link" aria-label="Direct link to Spike Test" title="Direct link to Spike Test" translate="no">​</a></h2>
<p>To oberve whether the performance is improved or not, a spike test is useful than capacity test. Because only in the extreme environment, the spike test can test whether the RLock will cause lock contention, and whether the O(1) Map deletion will help CPU save power.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">stages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Ramp-up: from 0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Steady state: observe baseline</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'30s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1500</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Spike: Sudden influx of concurrent users</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1500</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Sustained peak: test Lock Contention</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'10s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Recovery: Rapid scale down</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="capacity-test-baseline">Capacity Test Baseline<a href="https://blog.lzstock.app/blog/battle-test-5#capacity-test-baseline" class="hash-link" aria-label="Direct link to Capacity Test Baseline" title="Direct link to Capacity Test Baseline" translate="no">​</a></h2>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> RedisSubscriptionManager </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  priceChannels </span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token keyword" style="color:#00009f">chan</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">schema</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MarketPrice                       </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	priceChannels </span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token keyword" style="color:#00009f">chan</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">schema</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MarketPrice</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rsm </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">RedisSubscriptionManager</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">AddSubscription</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ticker </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stream </span><span class="token keyword" style="color:#00009f">chan</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">schema</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MarketPrice</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stream</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> 	rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">map</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token keyword" style="color:#00009f">chan</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">schema</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MarketPrice</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> stream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rsm </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">RedisSubscriptionManager</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">RemoveSubscription</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ticker </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> channels </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ch </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> channels </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> ch </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> streamToRemove </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic">// 從 slice 中移除該 channel</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">     rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">channels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> channels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">     </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">		</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">	</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> subs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> exists </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">exists </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Safely and accurately remove the specific session</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">delete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">subs</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">subs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   </span><span class="token function" style="color:#d73a49">delete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rsm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priceChannels</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ticker</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="observations">Observations<a href="https://blog.lzstock.app/blog/battle-test-5#observations" class="hash-link" aria-label="Direct link to Observations" title="Direct link to Observations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-99th-percentile-latency-streaming-flow">1. 99th Percentile Latency (Streaming Flow)<a href="https://blog.lzstock.app/blog/battle-test-5#1-99th-percentile-latency-streaming-flow" class="hash-link" aria-label="Direct link to 1. 99th Percentile Latency (Streaming Flow)" title="Direct link to 1. 99th Percentile Latency (Streaming Flow)" translate="no">​</a></h3>
<p>P99 latency of streaming flow is reduce a bit from above 1 second to around 800ms.</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-latency-streaming-comparison-e6292695d638d9d29e15bf4bd8dd9995.png" width="762" height="254" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-cpu">2. CPU<a href="https://blog.lzstock.app/blog/battle-test-5#2-cpu" class="hash-link" aria-label="Direct link to 2. CPU" title="Direct link to 2. CPU" translate="no">​</a></h3>
<p>CPU usage is reduced a bit but not much.</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-cpu-ram-comparison-c8ed519bc7ea1f0a10f4c6f380529a8b.png" width="946" height="278" class="img_ev3q"></p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>CPU &amp; Memory, Fanout Drop, Latency</summary><div><div class="collapsibleContent_i85q"><table><tbody><tr><td rowspan="2">CPU &amp; Memory</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-cpu-ram-baseline-9714de7c184fe5390612c516b2042518.png" width="857" height="282" class="img_ev3q"> <br> Baseline</td></tr><tr><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-cpu-ram-upgrade-to-pricemap-cbc9e5ecd4060cfd75a7175841914abc.png" width="860" height="284" class="img_ev3q"> <br> Upgrade to PriceMap</td></tr><tr><td rowspan="2">Fanout Drop</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-fanout-drop-baseline-13d9a6459c0db3fb2dc59907486dda02.png" width="471" height="258" class="img_ev3q"> <br> Baseline</td></tr><tr><td><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="463" height="252" class="img_ev3q"> <br> Upgrade to PriceMap</td></tr><tr><td rowspan="2">Latency</td><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-latency-baseline-9703ddf8875d672e024f0ba1eeb458a8.png" width="1120" height="252" class="img_ev3q"> Baseline</td></tr><tr><td><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-latency-upgrade-to-pricemap-12fd086403e984eb69add5c6297b1ae0.png" width="1169" height="259" class="img_ev3q"> Upgrade to PriceMap </td></tr></tbody></table></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-step">Next Step<a href="https://blog.lzstock.app/blog/battle-test-5#next-step" class="hash-link" aria-label="Direct link to Next Step" title="Direct link to Next Step" translate="no">​</a></h2>
<p>I am almost done with the load test. In the next article, I am going to fix a type conversion issue that may affect the performance.</p>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (4) - Shifting to Capacity Test]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-4</id>
        <link href="https://blog.lzstock.app/blog/battle-test-4"/>
        <updated>2026-04-01T20:00:00.000Z</updated>
        <summary type="html"><![CDATA[Test Goal]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-goal">Test Goal<a href="https://blog.lzstock.app/blog/battle-test-4#test-goal" class="hash-link" aria-label="Direct link to Test Goal" title="Direct link to Test Goal" translate="no">​</a></h2>
<p>Next step I test the last part of the load test. Let's do the capacity test with 5000 users CCU.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.lzstock.app/blog/battle-test-4#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The system can now handle 5000 users CCU within 5 mins and hold for another 5 mins. All of them will continuously receive message through websocket.</p>
<p>If you are interested in the testing process, please continue reading.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="capacity-test-round">Capacity Test Round<a href="https://blog.lzstock.app/blog/battle-test-4#capacity-test-round" class="hash-link" aria-label="Direct link to Capacity Test Round" title="Direct link to Capacity Test Round" translate="no">​</a></h2>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">stages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'5m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// 5 minutes ramp-up to 5000 VU</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'5m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Maintain 5000 users stable (quiet period)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'30s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Test end, graceful shutdown within 30 seconds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="observations">Observations<a href="https://blog.lzstock.app/blog/battle-test-4#observations" class="hash-link" aria-label="Direct link to Observations" title="Direct link to Observations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-k6-result-">1. K6 Result ✅<a href="https://blog.lzstock.app/blog/battle-test-4#1-k6-result-" class="hash-link" aria-label="Direct link to 1. K6 Result ✅" title="Direct link to 1. K6 Result ✅" translate="no">​</a></h3>
<p>The test was 100% successful. No failed requests.</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-1-k6-29e5b2ec8f53811374289a56b9e1853b.png" width="417" height="179" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-bc11-active-ws-connection-">2. BC11 Active WS Connection ✅<a href="https://blog.lzstock.app/blog/battle-test-4#2-bc11-active-ws-connection-" class="hash-link" aria-label="Direct link to 2. BC11 Active WS Connection ✅" title="Direct link to 2. BC11 Active WS Connection ✅" translate="no">​</a></h3>
<p>The green line climbed slowly and precisely stopped at 5000, maintaining stability for 5 minutes, and then dropped vertically to zero instantly. This proves that your k6 script executed exactly as planned, and the server perfectly handled these 5000 long connections.</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-1-ws-connection-abc1fcde01e1a1a6d85127ae88db085b.png" width="467" height="251" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-goroutine-count-">3. Goroutine Count ✅<a href="https://blog.lzstock.app/blog/battle-test-4#3-goroutine-count-" class="hash-link" aria-label="Direct link to 3. Goroutine Count ✅" title="Direct link to 3. Goroutine Count ✅" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-1-goroutine-edf032047a47ec4909be3de444073452.png" width="703" height="259" class="img_ev3q"></p>
<p>After the test ended, all Goroutines were zero leaked and instantly recycled.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-messages--fanout-">4. Messages / Fanout ✅<a href="https://blog.lzstock.app/blog/battle-test-4#4-messages--fanout-" class="hash-link" aria-label="Direct link to 4. Messages / Fanout ✅" title="Direct link to 4. Messages / Fanout ✅" translate="no">​</a></h3>
<p>These people received nearly 2.6+ million (<code>ws_msgs_received</code>) real-time stock price updates within 10 minutes! Your server's Fanout peak reached 12K ~ 14K ops/s (processing 14,000 broadcasts per second).</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-1-ws-received-b6d7c4b0e172de820558a298b2720f56.png" width="463" height="116" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-1-fanout-f231b2bb88968002c59d1974025680ae.png" width="465" height="251" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-cpu--memory-">5. CPU &amp; Memory ✅<a href="https://blog.lzstock.app/blog/battle-test-4#5-cpu--memory-" class="hash-link" aria-label="Direct link to 5. CPU &amp; Memory ✅" title="Direct link to 5. CPU &amp; Memory ✅" translate="no">​</a></h3>
<p>Memory: The Go memory pool was like a standard textbook (ramp-up -&gt; enter stable plateau period -&gt; maintain available water level after test end). No Memory Leak.</p>
<p>CPU: The peak was approximately 2.5 cores. Using 2.5 CPUs to handle 5000 users and processing thousands of broadcasts per second is extremely efficient!</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-1-cpu-ram-2ab3ef8c0093ad0d6a7805604cda6f80.png" width="859" height="285" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="result">Result<a href="https://blog.lzstock.app/blog/battle-test-4#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<p>After a series of thorough underlying Goroutine lifecycle and parallel lock reconstruction, our push engine finally faced the ultimate test: 5000 CCU capacity test (Capacity Test).</p>
<p>In this test, the system not only perfectly maintained 5000 active WebSocket connections but also successfully distributed 2.6+ million real-time price update messages within a few minutes, with a peak broadcast rate of 14,000 ops/sec. The most exciting part was that when 5000 users simultaneously disconnected, the system resources were precisely recycled like a textbook, with more than 30,000 Goroutines instantly returning to zero, completely eliminating Memory/Goroutine Leak. This proves that our architecture not only has high concurrent processing capabilities but also has extremely stable and scalable capabilities.</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/5000-1-dashboard-3fb1067af1812fb76b062d5e3d77a31f.png" width="1874" height="808" class="img_ev3q"></p>
<p>Until now, both spike test and capacity test are successful. Let's shift to the next article to see if there are any other issues or performance tuning opportunities.</p>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (3) - Debugging Leaked Goroutine with Websocket]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-3</id>
        <link href="https://blog.lzstock.app/blog/battle-test-3"/>
        <updated>2026-04-01T16:00:00.000Z</updated>
        <summary type="html"><![CDATA[Test Goal]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-goal">Test Goal<a href="https://blog.lzstock.app/blog/battle-test-3#test-goal" class="hash-link" aria-label="Direct link to Test Goal" title="Direct link to Test Goal" translate="no">​</a></h2>
<p>The real show begin. Let's do the spike test with 1500 VUs and see what will be happened.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.lzstock.app/blog/battle-test-3#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>I spotted a lot of goroutine leaked. I fixed it. The system can now handle 1500 VUs without any issues.</p>
<p>This is the most time consuming part of the load test.</p>
<p>If you are interested in the debugging process, please continue reading.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="spike-test-round">Spike Test Round<a href="https://blog.lzstock.app/blog/battle-test-3#spike-test-round" class="hash-link" aria-label="Direct link to Spike Test Round" title="Direct link to Spike Test Round" translate="no">​</a></h2>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">stages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Ramp-up: from 0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Steady state: observe baseline</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'30s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1500</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Spike: Sudden influx of concurrent users</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1500</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Sustained peak: test Lock Contention</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'10s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Recovery: Rapid scale down</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="observations">Observations<a href="https://blog.lzstock.app/blog/battle-test-3#observations" class="hash-link" aria-label="Direct link to Observations" title="Direct link to Observations" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Service Overview</div><div class="admonitionContent_BuS1"><p>BC11: Streaming Engine with Session Management and Redis Pub/Sub Fan-out Architecture
BC15: API Gateway with WebSocket Connection Management</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gateway-memory-was-leaking-">Gateway Memory was leaking ❌<a href="https://blog.lzstock.app/blog/battle-test-3#gateway-memory-was-leaking-" class="hash-link" aria-label="Direct link to Gateway Memory was leaking ❌" title="Direct link to Gateway Memory was leaking ❌" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="websocket connection" src="https://blog.lzstock.app/assets/images/1500-abnormal-wc-conn-3797f296246489bf3742721a312537eb.png" width="467" height="258" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Correction</div><div class="admonitionContent_BuS1"><p>BC11 Active WS Connection should be BC15 Active WS Connection</p></div></div>
<p><img decoding="async" loading="lazy" alt="goroutine" src="https://blog.lzstock.app/assets/images/1500-abnormal-gateway-goroutine-6257fcffd5c6cbcab1395c7868a42ce4.png" width="698" height="262" class="img_ev3q"></p>
<p>It was wired having 35000-40000 goroutine with only 1300 WS connections during the peak.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fan-out-arch-is-successful-">Fan-out arch is successful ✅<a href="https://blog.lzstock.app/blog/battle-test-3#fan-out-arch-is-successful-" class="hash-link" aria-label="Direct link to Fan-out arch is successful ✅" title="Direct link to Fan-out arch is successful ✅" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="fan-out" src="https://blog.lzstock.app/assets/images/1500-abnormal-fanout-8a183426dc44d1da31891d9d375ec80e.png" width="464" height="250" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="msg-pushed" src="https://blog.lzstock.app/assets/images/1500-abnormal-msg-pushed-e8ca5e6d137ca25d542094e4fe45e902.png" width="465" height="249" class="img_ev3q"></p>
<p>Message successful rate was met around 4.5k ops/s, while drop rate is almost zero, together with message pushed rate.
It means inside BC11 no message is blocked during the test.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hardware-limit-is-far-from-reached-">Hardware limit is far from reached ✅<a href="https://blog.lzstock.app/blog/battle-test-3#hardware-limit-is-far-from-reached-" class="hash-link" aria-label="Direct link to Hardware limit is far from reached ✅" title="Direct link to Hardware limit is far from reached ✅" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="services-cpu-didnt-meet-limit">Service's CPU didn't meet limit<a href="https://blog.lzstock.app/blog/battle-test-3#services-cpu-didnt-meet-limit" class="hash-link" aria-label="Direct link to Service's CPU didn't meet limit" title="Direct link to Service's CPU didn't meet limit" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="services&amp;#39; cpu" src="https://blog.lzstock.app/assets/images/1500-abnormal-cpu-5cccb78f1b763dea76f429f51b102143.png" width="463" height="269" class="img_ev3q"></p>
<p>According to the graph, CPUs are almost idle (CPU reach 1.3 core * 2 = 2.6 / 8 cores) and it usually indicates that our system is meeting I/O blocking or Deadlock.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-didnt-have-load-pressure-">Redis didn't have load pressure ✅<a href="https://blog.lzstock.app/blog/battle-test-3#redis-didnt-have-load-pressure-" class="hash-link" aria-label="Direct link to Redis didn't have load pressure ✅" title="Direct link to Redis didn't have load pressure ✅" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="redis" src="https://blog.lzstock.app/assets/images/1500-abnormal-redis-cpu-7c8f5766c177ae78db53ebc751e1a33c.png" width="547" height="281" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="redis" src="https://blog.lzstock.app/assets/images/1500-abnormal-redis-ram-dfe534f1175be37f64c806f2736b0bc2.png" width="465" height="268" class="img_ev3q"></p>
<p>Based on the graph, I can confirm that I successfully shifted pressure to service from redis by fan-out arch through a one-ticker-one-connection architecture.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-pubsub-connection-was-leaking-">Redis PubSub Connection was leaking ✅<a href="https://blog.lzstock.app/blog/battle-test-3#redis-pubsub-connection-was-leaking-" class="hash-link" aria-label="Direct link to Redis PubSub Connection was leaking ✅" title="Direct link to Redis PubSub Connection was leaking ✅" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="redis pubsub" src="https://blog.lzstock.app/assets/images/1500-abnormal-redis-pubsub-bbc5f30a38d624d0c899841006d8344a.png" width="464" height="258" class="img_ev3q"></p>
<p>The Redis PubSub connection number is back to baseline.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="debugging">Debugging<a href="https://blog.lzstock.app/blog/battle-test-3#debugging" class="hash-link" aria-label="Direct link to Debugging" title="Direct link to Debugging" translate="no">​</a></h2>
<p>I thought the issues may be related to the low level network or wrong configuration. So I tried to by pass Docker Desktop Proxy and increase all the congfiguration limits that I could find to see if it can resolve the issue.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="by-pass-docker-desktop-proxy">By pass Docker Desktop Proxy<a href="https://blog.lzstock.app/blog/battle-test-3#by-pass-docker-desktop-proxy" class="hash-link" aria-label="Direct link to By pass Docker Desktop Proxy" title="Direct link to By pass Docker Desktop Proxy" translate="no">​</a></h3>
<p>In case port proxy is a bottleneck when docker desktop forward inside docker desktop. I created a new temporary K6 container firing test inside of docker desktop to bypass the possible proxy issue.</p>
<!-- -->
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">k6</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> grafana/k6</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># load local script</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./k6/</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/scripts   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">profiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> tools</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker compose -p load-test run --rm k6 run /scripts/load-test.js</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="grpc-maxconcurrentstreams">gRPC MaxConcurrentStreams<a href="https://blog.lzstock.app/blog/battle-test-3#grpc-maxconcurrentstreams" class="hash-link" aria-label="Direct link to gRPC MaxConcurrentStreams" title="Direct link to gRPC MaxConcurrentStreams" translate="no">​</a></h3>
<p>I also increased the MaxConcurrentStreams to 65535 to prevent connection drop.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ServerInstance </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">MaxConcurrentStreams</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">65535</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tcp-backlog">TCP Backlog<a href="https://blog.lzstock.app/blog/battle-test-3#tcp-backlog" class="hash-link" aria-label="Direct link to TCP Backlog" title="Direct link to TCP Backlog" translate="no">​</a></h3>
<p>Linux's TCP connection may be jammed. To prevent connection drop, this value is needed.</p>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">bc11</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sysctls</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> net.core.somaxconn=65535 </span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="file-descriptor-limit--ulimit">File Descriptor Limit / ulimit<a href="https://blog.lzstock.app/blog/battle-test-3#file-descriptor-limit--ulimit" class="hash-link" aria-label="Direct link to File Descriptor Limit / ulimit" title="Direct link to File Descriptor Limit / ulimit" translate="no">​</a></h3>
<p>In Linux, each Websocket Connection is a TCP Socket, and each socket needs a File Descriptor. In case of disruption of connection, I updated the upper limit.</p>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">bc11</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ulimits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">nproc</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">nofile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">soft</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">hard</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="root-cause-analysis-with-pprof">Root Cause Analysis with pprof<a href="https://blog.lzstock.app/blog/battle-test-3#root-cause-analysis-with-pprof" class="hash-link" aria-label="Direct link to Root Cause Analysis with pprof" title="Direct link to Root Cause Analysis with pprof" translate="no">​</a></h2>
<p>Everything mentioned above didn't resolve the issue. So I started to analyze the pprof results.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">go tool pprof http://localhost:50052/debug/pprof/goroutine</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">go tool pprof -http=:8082 pprof.app.goroutine.pb.BC15-0.gz</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-abnormal-1-bc15-pprof-0e9bc83b8f12d913f543e5f9147d167e.png" width="750" height="170" class="img_ev3q"></p>
<p>At the top right of the pprof screenshot, it shows unexpected high value of goroutine which was 17505 (100%). The <code>runtime.gopark</code> means the Goroutine is putting to sleep because it is waiting on a select statement. The custom <code>withTimeout</code> function is the reason that cuased the leak. A anaymous background Goroutine (func1) wasn't canceled cleanly. So it got stuck waiting forever.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution">Solution<a href="https://blog.lzstock.app/blog/battle-test-3#solution" class="hash-link" aria-label="Direct link to Solution" title="Direct link to Solution" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="failed-to-cancel-websocket-connection">failed to cancel websocket connection<a href="https://blog.lzstock.app/blog/battle-test-3#failed-to-cancel-websocket-connection" class="hash-link" aria-label="Direct link to failed to cancel websocket connection" title="Direct link to failed to cancel websocket connection" translate="no">​</a></h3>
<p><strong>First attempt</strong></p>
<p>The implicit cancel call is inside <code>WithTimeout()</code>. It is fine if it is for HTTP connection, but not quite good for websocket, which relies on explicit cancel call to prevent leaked goroutine.
HTTP connection is upgraded to a long live state after websocket connection. So it is necessary to close connection manually instead of fully relying on <code>Done()</code> method in the framework.</p>
<p>Fasthttp reuse <code>RequestCtx</code> and put it back to <code>sync.Pool</code>. When it called upgrader.Upgrade(), this conneciton is over from Fasthttp's perspective. It will put the <code>RequestCtx</code> back to the pool. So the goroutine that is waiting on the ctx.Done() will be executed wrongly.</p>
<p>Original v.s. Fixed Code is this:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ctx </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> LZContext</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">routingCtx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cb </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">LZStockContext</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">WithTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">timeout time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Duration</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cancel </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> timeout</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">go</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">cb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">routingCtx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RequestCtx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">     </span><span class="token function" style="color:#d73a49">cancel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// cancel when HTTP request end</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">     </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> ctx</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cancel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>In the upper layer or the caller level. A caller should be responsible for canceling the context.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token operator" style="color:#393A34">-</span><span class="token plain"> ctx </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> LZContext</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">routingCtx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cancel </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> LZContext</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">routingCtx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">defer</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cancel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p><strong>Second attempt</strong></p>
<p>In both <code>handleGRPCStream()</code> and <code>listenWebSocketMessages()</code>, I put select + default and called two blocked action in default case. I set read deadline to 15 minutes in <code>listenWebSocketMessages()</code>, and called <code>stream.Recv()</code> in <code>handleGRPCStream()</code>. Either of them will be blocked if the context Done() was called.</p>
<p>So, I removed select + default and listened to context Done() in the upper layer and call <code>conn.Close()</code> if the context was done. So the connection will be closed explicitly when the context was done.</p>
<p>Original v.s. Fixed Code is this:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleGRPCStream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> conn </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> req </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StreamPriceUpdatesReq</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">     </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      stock</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Recv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> io</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">EOF </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 正常結束</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Errorf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"failed to receive from stream: %w"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sendToWebSocket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stock</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Errorf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"failed to send to WebSocket: %w"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">listenWebSocketMessages</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> conn </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">     </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Set read timeout</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetReadDeadline</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">15</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      messageType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ReadMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">IsUnexpectedCloseError</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CloseGoingAway</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CloseAbnormalClosure</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Errorf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"WebSocket read error: %w"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Errorf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"WebSocket connection closed: %w"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Handle received messages</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> messageType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TextMessage </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleWebSocketMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          log</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Error handling WebSocket message: %v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">PricePusher</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> routingCtx </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">routing</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">*</span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ctx </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> errgroup</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithContext</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">go</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> conn </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">     conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Handle gRPC stream</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleGRPCStream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> req</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Monitor WebSocket connection</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">monitorWebSocketConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Listen WebSocket messages</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  g</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Go</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">listenWebSocketMessages</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Third attempt</strong></p>
<p>After K6 test finished, it will abruptly stop the test. It may not dispatchs TCP FIN packet to the server. So the server may not be able to close the connection gracefully. To address this issue, the server should actively check the connection status by sending a ping message periodically. If the client side didn't respond within 60 seconds with a pong message, the server will close the connection.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	pingPeriod </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Second</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	pongWait   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Second</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">monitorWebSocketConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> conn </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> ticker </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewTicker</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pingPeriod</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">listenWebSocketMessages</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Set up initial read deadline</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetReadDeadline</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pongWait</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetPongHandler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Extended read deadline to 60 seconds as long as the client side responds with a pong message.</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetReadDeadline</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pongWait</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// Don't set read deadline in the loop.</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">   conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetReadDeadline</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">15</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleWebSocketMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">websocket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> message </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">byte</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> investorID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> wsMsg WSMessage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">switch</span><span class="token plain"> wsMsg</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Type </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ping"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Add extended read deadline to 60 seconds as long as the client side sends with a ping message.</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">     conn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetReadDeadline</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pongWait</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="result">Result<a href="https://blog.lzstock.app/blog/battle-test-3#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gateway-memory-was-not-leaking-anymore-">Gateway Memory was not leaking anymore ✅<a href="https://blog.lzstock.app/blog/battle-test-3#gateway-memory-was-not-leaking-anymore-" class="hash-link" aria-label="Direct link to Gateway Memory was not leaking anymore ✅" title="Direct link to Gateway Memory was not leaking anymore ✅" translate="no">​</a></h3>
<p>In comparison with the previous goroutine count, it was reduced from 35000-40000 to 1000-2000.</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-abnormal-4-round-goroutine-433342b7d0ddc50a1d03a7caa3bcb1f8.png" width="423" height="257" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/1500-abnormal-1-bc15-pprof-fix-cancel-6c6a0d6d334c5812297928b657f56f22.png" width="768" height="209" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="verified-with-k6-result">Verified with K6 Result<a href="https://blog.lzstock.app/blog/battle-test-3#verified-with-k6-result" class="hash-link" aria-label="Direct link to Verified with K6 Result" title="Direct link to Verified with K6 Result" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="k6 final result" src="https://blog.lzstock.app/assets/images/k6-final-result-d8632830d6d34b503be0516374870cde.png" width="952" height="565" class="img_ev3q"></p>
<p>There was 46 errors out of 22833 WS connections and 46 errors out of 22835 Websocket connections. So the availability was 99.8%.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 46 Error / 22833 WS connection</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ERRO[0172] [VU 259] WS Error:  websocket: close 1006 (abnormal closure): unexpected EOF  source=console </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span></code></pre></div></div>
<p>There were 46 errors out of 22835 HTTP connections. So the availability was 99.8%.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 46 Error / 22835 HTTP connection</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ERRO[0362] [VU 1496] HTTP Failed! Status: 0, Body: null  source=console</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ERRO[0369] [VU 428] HTTP Failed! Status: 0, Body: null   source=console</span><br></span></code></pre></div></div>
<p><strong>What is <code>Status: 0, Body: null</code>?</strong></p>
<p>It happened near the end of loading test. <code>Status: 0, Body: null</code> means no TCP connection, the request didn't even touch the server.</p>
<p>Only one error was caused by 404 error. It can be ignored during these kind of high load test.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 1 / 22835 HTTP connection</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ERRO[0275] [VU 743] HTTP Failed! Status: 404, Body: Route not found  source=console</span><br></span></code></pre></div></div>
<p>Now the spike test is successful. Let's shift to capacity test in the next article. I will test 5000 users CCU within 5 mins and hold for another 5 mins. All of them will continuously receive message through websocket, of course.</p>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (2) - Debugging Leaked Redis Pub/Sub Connections]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-2</id>
        <link href="https://blog.lzstock.app/blog/battle-test-2"/>
        <updated>2026-03-31T20:00:00.000Z</updated>
        <summary type="html"><![CDATA[Test Goal]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-goal">Test Goal<a href="https://blog.lzstock.app/blog/battle-test-2#test-goal" class="hash-link" aria-label="Direct link to Test Goal" title="Direct link to Test Goal" translate="no">​</a></h2>
<p>Following up on my last post, here is how to fix the Redis Pub/Sub connection leak.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.lzstock.app/blog/battle-test-2#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The leaking problem has been fixed. The system is ready for the larger scale test.</p>
<p>If you are interested in the debugging process, please continue reading.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="smoke-test-for-spike-test-round">Smoke Test for Spike Test Round<a href="https://blog.lzstock.app/blog/battle-test-2#smoke-test-for-spike-test-round" class="hash-link" aria-label="Direct link to Smoke Test for Spike Test Round" title="Direct link to Smoke Test for Spike Test Round" translate="no">​</a></h2>
<p>The parameters are the same as the last one.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="observations">Observations<a href="https://blog.lzstock.app/blog/battle-test-2#observations" class="hash-link" aria-label="Direct link to Observations" title="Direct link to Observations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-pubsub-connection-was-leaking-">Redis PubSub Connection was leaking ❌<a href="https://blog.lzstock.app/blog/battle-test-2#redis-pubsub-connection-was-leaking-" class="hash-link" aria-label="Direct link to Redis PubSub Connection was leaking ❌" title="Direct link to Redis PubSub Connection was leaking ❌" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/first-attempt-fixing-new-issues-45640438090066762528f618049af77d.png" width="463" height="260" class="img_ev3q"></p>
<p>Ideally, these two logs should be paired.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">2026-04-02 13:49:29.640 | 2026/04/02 17:49:29 Created Redis PubSub connection for BKR</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2026-04-02 13:49:29.640 | 2026/04/02 17:49:29 Closed Redis PubSub connection for BKR (no more subscribers)</span><br></span></code></pre></div></div>
<p>Based on the count of orphaned logs, I can confirm the issue.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Statistics:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Total 'Created' events: 1897</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Total 'Closed' events : 1804</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Net active (at log end): 93</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="debugging">Debugging<a href="https://blog.lzstock.app/blog/battle-test-2#debugging" class="hash-link" aria-label="Direct link to Debugging" title="Direct link to Debugging" translate="no">​</a></h2>
<p>Initially, I thought the reason may be multiple goroutine are trying to deactivateSession that cause race condition which block clean up process. So I spent a lots of time modify sessionManager lock scope. However, none of them are related. I skipped these attempts and demonstrated what was exactly happened.</p>
<p>Quick answer, there is actually a missing entry point of <code>deactivateSession()</code> that be triggered by close signal of websocket connection. And I accidiently put cleanup logic only in one of many exist returns and forget that the branch is not the only exist.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">u </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">StreamStockPriceUseCase</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">StreamPriceUpdates</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">dtos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StreamPriceUpdates</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stream pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RealTimePriceMonitoringService_StreamPriceUpdatesServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> price</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ok </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PriceStream</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">ok </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      batchMap</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">price</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ... logic ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">flushTicker</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">C</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">batchMap</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">continue</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// ... convert to proto ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">update</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">batchMap</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Should not be called here</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">    u</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deactivateSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="root-cause-analysis-the-missing-entry-point">Root Cause Analysis: The Missing Entry Point<a href="https://blog.lzstock.app/blog/battle-test-2#root-cause-analysis-the-missing-entry-point" class="hash-link" aria-label="Direct link to Root Cause Analysis: The Missing Entry Point" title="Direct link to Root Cause Analysis: The Missing Entry Point" translate="no">​</a></h2>
<p>Session may not be deactivated if <code>stream.Send()</code> returns an error. The function without calling <code>deactivateSesssion()</code> will leak the Redis Pub/Sub connection.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-put-deactivatesession-in-defer">Solution: Put <code>deactivateSession()</code> in defer<a href="https://blog.lzstock.app/blog/battle-test-2#solution-put-deactivatesession-in-defer" class="hash-link" aria-label="Direct link to solution-put-deactivatesession-in-defer" title="Direct link to solution-put-deactivatesession-in-defer" translate="no">​</a></h2>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">u </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">StreamStockPriceUseCase</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">StreamPriceUpdates</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">dtos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StreamPriceUpdates</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stream pb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RealTimePriceMonitoringService_StreamPriceUpdatesServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">  </span><span class="token keyword" style="color:#00009f">defer</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   u</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deactivateSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> price</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ok </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PriceStream</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">ok </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      batchMap</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">price</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ticker</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ... logic ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">flushTicker</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">C</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">batchMap</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">continue</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// ... convert to proto ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">update</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">batchMap</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain">stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Done</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain">     u</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deactivateSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="result">Result<a href="https://blog.lzstock.app/blog/battle-test-2#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-pubsub-connection-was-not-leaking-">Redis PubSub Connection was not leaking ✅<a href="https://blog.lzstock.app/blog/battle-test-2#redis-pubsub-connection-was-not-leaking-" class="hash-link" aria-label="Direct link to Redis PubSub Connection was not leaking ✅" title="Direct link to Redis PubSub Connection was not leaking ✅" translate="no">​</a></h3>
<p>Let's re-run the smoke test again.</p>
<p><img decoding="async" loading="lazy" src="https://blog.lzstock.app/assets/images/first-attempt-fixing-solution-905cefcdd68b1f5f0402eed5da9f9b36.png" width="468" height="259" class="img_ev3q"></p>
<p>The Pub/Sub connection number is back to baseline. The issue has been fixed!! Perfect!!</p>
<p>Next step, let's do the spike test with 10 times of traffic and see what will be happened.</p>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (1) - Debugging a Race Condition in SessionManager.]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-1</id>
        <link href="https://blog.lzstock.app/blog/battle-test-1"/>
        <updated>2026-03-30T21:00:00.000Z</updated>
        <summary type="html"><![CDATA[Test Goal]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-goal">Test Goal<a href="https://blog.lzstock.app/blog/battle-test-1#test-goal" class="hash-link" aria-label="Direct link to Test Goal" title="Direct link to Test Goal" translate="no">​</a></h2>
<p>To confirm system stability using a smoke test with a small number of VUs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.lzstock.app/blog/battle-test-1#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Spotting a race condition in SessionManager. Fixed it. The system is ready for the larger scale test.</p>
<p>If you are interested in the debugging process, please continue reading.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="smoke-test-for-spike-test-round">Smoke Test for Spike Test Round<a href="https://blog.lzstock.app/blog/battle-test-1#smoke-test-for-spike-test-round" class="hash-link" aria-label="Direct link to Smoke Test for Spike Test Round" title="Direct link to Smoke Test for Spike Test Round" translate="no">​</a></h2>
<p>I reduced the VUs to a small number to start</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">stages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Ramp-up: from 0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Steady state: observe baseline</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'30s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">150</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Spike: Sudden influx of concurrent users</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">150</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Sustained peak: test Lock Contention</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'10s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// Recovery: Rapid scale down</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="observations">Observations<a href="https://blog.lzstock.app/blog/battle-test-1#observations" class="hash-link" aria-label="Direct link to Observations" title="Direct link to Observations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="k6-test-results-">K6 Test Results ❌<a href="https://blog.lzstock.app/blog/battle-test-1#k6-test-results-" class="hash-link" aria-label="Direct link to K6 Test Results ❌" title="Direct link to K6 Test Results ❌" translate="no">​</a></h3>
<p>The success rate of HTTP sessions created (via Simple POST) is only 97%.</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="534" height="243" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-degradation-">Performance Degradation ❌<a href="https://blog.lzstock.app/blog/battle-test-1#performance-degradation-" class="hash-link" aria-label="Direct link to Performance Degradation ❌" title="Direct link to Performance Degradation ❌" translate="no">​</a></h3>
<p>The P99 latency for the registerSession endpoint spiked to nearly 400ms, indicating severe lock contention or that the system is struggling under load.
<img decoding="async" loading="lazy" src="data:image/png;base64,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" width="724" height="373" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="close-of-closed-channel-">Close of closed channel ❌<a href="https://blog.lzstock.app/blog/battle-test-1#close-of-closed-channel-" class="hash-link" aria-label="Direct link to Close of closed channel ❌" title="Direct link to Close of closed channel ❌" translate="no">​</a></h3>
<p>The Go server repeatedly threw a fatal error: panic: close of closed channel.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">2026/03/31 19:22:55 close of closed channel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2026/03/31 19:22:55 Stack: File: /build/mods/bc11-market-monitor/useCases/SessionManager.go:70 Func: (*sessionManager).registerSession</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /build/mods/bc11-market-monitor/useCases/SubscribeStockPrice.go:45 Func: (*SubscribeStockPriceUseCase).Executes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /build/mods/bc11-market-monitor/controllers/StockPrice.go:22 Func: (*Controller).StartPriceMonitoring</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /build/shared/go/protos/bc11_market_monitor/bc11_market_monitor.service.pb.go:464 Func: lzstock/shared/go/protos/bc11_market_monitor._RealTimePriceMonitoringService_StartPriceMonitoring_Handler.func1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /build/shared/go/infra/grpcServer/interceptor.go:18 Func: (*Server).UnaryInterceptor</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /build/shared/go/protos/bc11_market_monitor/bc11_market_monitor.service.pb.go:466 Func: lzstock/shared/go/protos/bc11_market_monitor._RealTimePriceMonitoringService_StartPriceMonitoring_Handler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /go/pkg/mod/google.golang.org/grpc@v1.75.0/server.go:1431 Func: (*Server).processUnaryRPC</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /go/pkg/mod/google.golang.org/grpc@v1.75.0/server.go:1842 Func: (*Server).handleStream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /go/pkg/mod/google.golang.org/grpc@v1.75.0/server.go:1061 Func: (*Server).serveStreams.func2.1()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /go/pkg/mod/google.golang.org/grpc@v1.75.0/server.go:1072 Func: (*Server).serveStreams.func2 in goroutine 102</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2026/03/31 19:22:55 start price monitoring: Error: register session: Error: close of closed channel</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="debugging">Debugging<a href="https://blog.lzstock.app/blog/battle-test-1#debugging" class="hash-link" aria-label="Direct link to Debugging" title="Direct link to Debugging" translate="no">​</a></h2>
<p>Thanks to the clear error logs, I can easily locate the issue. The message indicated the file path, line number, and function name.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2026/03/31 19:22:55 Stack: </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">File: /build/mods/bc11-market-monitor/useCases/SessionManager.go:70 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Func: (*sessionManager).registerSession</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If you are interested in the full stack trace, you can find a repo in LZStock github: <a href="https://github.com/LZStock-OS/stackerr" target="_blank" rel="noopener noreferrer" class="">stackerr</a>.</p></div></div>
<p>One of the entries calling deactivateSession is the registerSession function.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sm </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">registerSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">session </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Lock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">userSessions</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">maxSessionsPerUser </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Unlock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">  sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deactivateSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">oldestSessionID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Lock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Unlock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Inside the deactivateSession function, it is calling <code>close()</code> on a channel that has already been closed will instantly cause a panic.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sm </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">deactivateSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sessionID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RLock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  session </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessions</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">sessionID</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RUnlock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> session </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Lock for session modification</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Lock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IsActive </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  traderID </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TraderID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Remove Session Channel from RedisManager</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ticker </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Tickers </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">redisSubManager</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RemoveSubscription</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PriceStream</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token function" style="color:#d73a49">close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PriceStream</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Unlock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Lock for sessionsByUser map modification</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Lock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">delete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> userSessions</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> exists </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessionsByUser</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">traderID</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> exists </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> i</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> userSessions </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> id </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> sessionID </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessionsByUser</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">traderID</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">userSessions</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> userSessions</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token operator" style="color:#393A34">+</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessionsByUser</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">traderID</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function" style="color:#d73a49">delete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sessionsByUser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> traderID</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sm</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Unlock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>The root cause is there multiple goroutines as entries calling deactivateSession simultaneously. Let's break down the problem step by step.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="root-cause-analysis-the-race-condition">Root Cause Analysis: The Race Condition<a href="https://blog.lzstock.app/blog/battle-test-1#root-cause-analysis-the-race-condition" class="hash-link" aria-label="Direct link to Root Cause Analysis: The Race Condition" title="Direct link to Root Cause Analysis: The Race Condition" translate="no">​</a></h2>
<p>In this case, the issue is most likely generated by multiple goroutines calling deactivateSession simultaneously, leading to a classic Race Condition.</p>
<p>The Callers:</p>
<ul>
<li class="">API Goroutine (registerSession): When a user reaches their maximum allowed concurrent sessions, the system actively kicks out their oldest session.</li>
<li class="">Background Goroutine (cleanupExpiredSessions): A cron-like job that periodically scans for and removes timed-out sessions.</li>
<li class="">Websocket Connection Close: When a user closes the websocket connection, the system will call deactivateSession to clean up the session.</li>
</ul>
<!-- -->
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>The Race Condition Flow:</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">A specific session (S1) expires.</li>
<li class="">The background worker detects S1 is expired and calls deactivateSession("S1").</li>
<li class="">At the exact same time, the user logs in again. The API detects the connection limit is reached, targets the oldest session (S1), and also calls deactivateSession("S1").</li>
<li class="">Both goroutines bypass the initial if session == nil check because S1 has not been deleted from the map yet.</li>
<li class="">Goroutine A acquires the session.mu.Lock(), executes close(session.PriceStream), unlocks, and proceeds.</li>
<li class="">Goroutine B immediately acquires the lock and executes close(session.PriceStream) again.</li>
<li class="">💥 Result: panic: close of closed channel.</li>
</ul></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-idempotent-deactivation">Solution: Idempotent Deactivation<a href="https://blog.lzstock.app/blog/battle-test-1#solution-idempotent-deactivation" class="hash-link" aria-label="Direct link to Solution: Idempotent Deactivation" title="Direct link to Solution: Idempotent Deactivation" translate="no">​</a></h2>
<p>Instead of trying to prevent these callers from executing simultaneously, I modified deactivateSession to be idempotent—meaning it can be safely called multiple times without causing errors.</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sm </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">deactivateSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sessionID </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Acquire Session-level lock</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Lock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IsActive </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mu</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Unlock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain">   </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Session was already deactivated by another goroutine</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Mark as deactivated immediately</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IsActive </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  traderID </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TraderID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="result">Result<a href="https://blog.lzstock.app/blog/battle-test-1#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="k6-test-results--1">K6 Test Results ✅<a href="https://blog.lzstock.app/blog/battle-test-1#k6-test-results--1" class="hash-link" aria-label="Direct link to K6 Test Results ✅" title="Direct link to K6 Test Results ✅" translate="no">​</a></h3>
<p>The success rate of HTTP sessions created is now 100%.</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="580" height="227" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-degradation--1">Performance Degradation ✅<a href="https://blog.lzstock.app/blog/battle-test-1#performance-degradation--1" class="hash-link" aria-label="Direct link to Performance Degradation ✅" title="Direct link to Performance Degradation ✅" translate="no">​</a></h3>
<p>The P99 latency for the registerSession endpoint stayed low, indicating that all session creations finished without blocking.</p>
<p><img decoding="async" loading="lazy" src="data:image/png;base64,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" width="459" height="270" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="no-more-close-of-closed-channel-">No more close of closed channel ✅<a href="https://blog.lzstock.app/blog/battle-test-1#no-more-close-of-closed-channel-" class="hash-link" aria-label="Direct link to No more close of closed channel ✅" title="Direct link to No more close of closed channel ✅" translate="no">​</a></h3>
<p>No more close of closed channel panic. Perfect!!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-leaked-redis-pubsub-connections">Next: Leaked Redis Pub/Sub Connections<a href="https://blog.lzstock.app/blog/battle-test-1#next-leaked-redis-pubsub-connections" class="hash-link" aria-label="Direct link to Next: Leaked Redis Pub/Sub Connections" title="Direct link to Next: Leaked Redis Pub/Sub Connections" translate="no">​</a></h2>
<p>Everything looks solid. But new issues are beginning to surface. I found Redis Pub/Sub connections didn't close after all sessions dropped. Let's debug it.</p>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streaming Engine to 5k+ Users (0) - Set up]]></title>
        <id>https://blog.lzstock.app/blog/battle-test-0</id>
        <link href="https://blog.lzstock.app/blog/battle-test-0"/>
        <updated>2026-03-30T16:00:00.000Z</updated>
        <summary type="html"><![CDATA[Theory rarely aligns perfectly with production reality. I will write a series of articles that walk you through the exact process of how I hunted down a fatal lock contention bottleneck under a massive concurrency spike.]]></summary>
        <content type="html"><![CDATA[<p><em>Theory rarely aligns perfectly with production reality. I will write a series of articles that walk you through the exact process of how I hunted down a fatal lock contention bottleneck under a massive concurrency spike.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-goal">Test Goal<a href="https://blog.lzstock.app/blog/battle-test-0#test-goal" class="hash-link" aria-label="Direct link to Test Goal" title="Direct link to Test Goal" translate="no">​</a></h2>
<p>The primary goal of this load test is to prove that the real-time streaming engine remains stable and responsive under massive traffic. The test specifically evaluates the system's ability to seamlessly handle two core user flows simultaneously:</p>
<ul>
<li class="">Flow 1: Session Creation. Users successfully hitting the REST API to create a monitoring session for their chosen stock tickers.</li>
<li class="">Flow 2: Real-Time Streaming. Users establishing a WebSocket connection using that generated session ID to continuously receive live price updates.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="bc11-sub-flow" src="https://blog.lzstock.app/assets/images/bc11-sub-flow-09c97b3f882288ccc10055c1187c7b1b.svg#light-only" width="1229" height="565" class="img_ev3q">
<img decoding="async" loading="lazy" alt="bc11-sub-flow-dark" src="https://blog.lzstock.app/assets/images/bc11-sub-flow-dark-7233abc508433612446ae25da1d8accf.svg#dark-only" width="1229" height="565" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="bc11-stream-flow" src="https://blog.lzstock.app/assets/images/bc11-streaming-flow-81496e267b88f2ff9b3e3d022d72b54e.svg#light-only" width="1041" height="301" class="img_ev3q">
<img decoding="async" loading="lazy" alt="bc11-stream-flow-dark" src="https://blog.lzstock.app/assets/images/bc11-streaming-flow-dark-629f6ad51c5aa90bb2665a2823caa4a9.svg#dark-only" width="1041" height="301" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Recap</div><div class="admonitionContent_BuS1"><p>Check how I designed the Price Streaming Engine before the load test (Article: <a class="" href="https://blog.lzstock.app/app/backend/concurrency/price-streaming">Price Streaming Engine</a>).</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="metrics">Metrics<a href="https://blog.lzstock.app/blog/battle-test-0#metrics" class="hash-link" aria-label="Direct link to Metrics" title="Direct link to Metrics" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="dashboard overview" src="https://blog.lzstock.app/assets/images/dashboard-overview-c78567699c83570da4592495c8c2a48f.png" width="1036" height="815" class="img_ev3q"></p>
<p>To truly prove the architecture's resilience, I looked at specific Grafana charts to track my custom application metrics and OS-level hardware metrics...</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-active-websocket-sessions">1. Active WebSocket Sessions<a href="https://blog.lzstock.app/blog/battle-test-0#1-active-websocket-sessions" class="hash-link" aria-label="Direct link to 1. Active WebSocket Sessions" title="Direct link to 1. Active WebSocket Sessions" translate="no">​</a></h3>
<p><em>bc11_active_ws_sessions</em></p>
<ul>
<li class="">Definition: A Counter metric tracking the exact number of active monitoring sessions currently registered in the core engine.</li>
<li class="">Why do we want this metric: I need to know the exact capacity and load on the server at any given second.</li>
<li class="">What this metric can tell us: During the load test, this graph should scale perfectly in sync with the k6 Virtual Users (VUs) connecting. Most importantly, it must drop back to exactly zero when the test finishes. If it stays above zero, it tells me I have "zombie" sessions and a memory leak.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-active-redis-pubsubs">2. Active Redis Pub/Subs<a href="https://blog.lzstock.app/blog/battle-test-0#2-active-redis-pubsubs" class="hash-link" aria-label="Direct link to 2. Active Redis Pub/Subs" title="Direct link to 2. Active Redis Pub/Subs" translate="no">​</a></h3>
<p><em>bc11_active_redis_pubsubs</em></p>
<ul>
<li class="">Definition: A Counter tracking the number of active channels subscribed to the Redis server.</li>
<li class="">Why do we want this metric: To monitor the connection overhead on the database layer. Every connection takes up resources, and Redis has strict connection limits.</li>
<li class="">What this metric can tell us: This proves my 1-to-1 Ticker-to-Goroutine architecture is working. Even if 5,000 users subscribe to "TSLA", this gauge should only show 1. It tells me the system is successfully multiplexing and preventing database exhaustion.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-subscription-update-duration">3. Subscription Update Duration<a href="https://blog.lzstock.app/blog/battle-test-0#3-subscription-update-duration" class="hash-link" aria-label="Direct link to 3. Subscription Update Duration" title="Direct link to 3. Subscription Update Duration" translate="no">​</a></h3>
<p><em>bc11_subscription_update_duration_seconds</em></p>
<ul>
<li class="">Definition: A Histogram measuring the time (in seconds) it takes to process a user creating a session or changing their stock subscriptions.</li>
<li class="">Why do we want this metric: Because updating subscriptions requires a write lock (sync.RWMutex). I need to measure lock contention in the subscription flow.</li>
<li class="">What this metric can tell us: If the P99 latency spikes here, it means thousands of goroutines are waiting in line to read or write state. Keeping this under sub-millisecond levels tells me the lock granularity is optimized and the code is truly thread-safe.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-internal-fan-out--backpressure">4. Internal Fan-out &amp; Backpressure<a href="https://blog.lzstock.app/blog/battle-test-0#4-internal-fan-out--backpressure" class="hash-link" aria-label="Direct link to 4. Internal Fan-out &amp; Backpressure" title="Direct link to 4. Internal Fan-out &amp; Backpressure" translate="no">​</a></h3>
<p><em>bc11_fanout_messages_total</em></p>
<ul>
<li class="">Definition: A Counter tracking messages broadcasted from Redis into the internal Go channels, labeled by success or dropped.</li>
<li class="">Why do we want this metric: To observe the internal streaming engine's health and the effectiveness of the backpressure mechanism.</li>
<li class="">What this metric can tell us: A spike in the dropped line during extreme load is a feature, not a bug. It tells me the non-blocking channel design successfully sheds load. The system is intentionally dropping stale ticks for slow clients instead of blocking the main broadcast loop and crashing the server.</li>
</ul>
<blockquote>
<p><em>"What happens if a client is on a terrible 3G network, their WebSocket buffer fills up, and my Go server cannot push data to them fast enough?"</em></p>
</blockquote>
<p>If I use standard blocking channel operations, a single slow client could block my internal <code>listenToRedis</code> broadcasting goroutine. This would cause a cascading failure, delaying price updates for thousands of users with perfectly good internet connections.</p>
<p>To prevent this, I implemented <strong>Backpressure via Non-blocking Channels</strong>.</p>
<p>Instead of waiting, I use Go's <code>select</code> statement with a <code>default</code> case. If a user's specific channel buffer is full, I intentionally <strong>drop</strong> the message:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">bc11/redis_subscription_manager.go</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Fan-out broadcast to all channels subscribed to this Ticker</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sessionChannel </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">range</span><span class="token plain"> subscribers </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> sessionChannel </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain"> parsedPrice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Success: Buffer has space</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        metrics</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">FanoutMessagesTotal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithLabelValues</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"success"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Inc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// BACKPRESSURE: Channel is full. </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Drop the stale price rather than blocking the main broadcast loop.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        metrics</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">FanoutMessagesTotal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithLabelValues</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"dropped"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Inc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-messages-pushed-to-frontend">5. Messages Pushed to Frontend<a href="https://blog.lzstock.app/blog/battle-test-0#5-messages-pushed-to-frontend" class="hash-link" aria-label="Direct link to 5. Messages Pushed to Frontend" title="Direct link to 5. Messages Pushed to Frontend" translate="no">​</a></h3>
<p><em>bc11_messages_pushed_total</em></p>
<ul>
<li class="">Definition: A Counter tracking the total number of stock price updates successfully pushed out to the end users over the WebSocket.</li>
<li class="">Why do we want this metric: To measure the actual business throughput and verify data delivery.</li>
<li class="">What this metric can tell us: Watching this number climb steadily confirms the streaming engine is actively doing its job. It proves the server isn't just holding idle connections, but is successfully routing massive amounts of data to the clients.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-end-to-end-push-latency">6. End-to-End Push Latency<a href="https://blog.lzstock.app/blog/battle-test-0#6-end-to-end-push-latency" class="hash-link" aria-label="Direct link to 6. End-to-End Push Latency" title="Direct link to 6. End-to-End Push Latency" translate="no">​</a></h3>
<p><em>market_monitor_e2e_latency_ms</em></p>
<ul>
<li class="">Definition: A Histogram measuring the total time (in milliseconds) from when a price is generated to when it is successfully pushed to the WebSocket.</li>
<li class="">Why do we want this metric: This is the ultimate user experience metric. Having fast internal processing doesn't matter if the final delivery to the trader is slow.</li>
<li class="">What this metric can tell us: It proves the entire pipeline—from Redis injection to batching, and finally to the network flush—meets the strict real-time trading requirement. If the P95 stays under 50ms, the architecture is a success.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-system-errors--panics">7. System Errors &amp; Panics<a href="https://blog.lzstock.app/blog/battle-test-0#7-system-errors--panics" class="hash-link" aria-label="Direct link to 7. System Errors &amp; Panics" title="Direct link to 7. System Errors &amp; Panics" translate="no">​</a></h3>
<p><em>market_monitor_system_errors_total</em></p>
<ul>
<li class="">Definition: A Counter catching system-level errors and recovered panics, categorized by the component where the error occurred.</li>
<li class="">Why do we want this metric: Because silent failures in background goroutines are a nightmare to debug. I need a tripwire for unexpected crashes.</li>
<li class="">What this metric can tell us: If this increments during a load test, it exposes a flaw in the error handling or an unexpected edge case (like writing to a closed channel) that needs an immediate fix.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="system-health-metrics-cpu-ram-and-goroutines">System Health Metrics (CPU, RAM, and Goroutines)<a href="https://blog.lzstock.app/blog/battle-test-0#system-health-metrics-cpu-ram-and-goroutines" class="hash-link" aria-label="Direct link to System Health Metrics (CPU, RAM, and Goroutines)" title="Direct link to System Health Metrics (CPU, RAM, and Goroutines)" translate="no">​</a></h3>
<ul>
<li class="">container_cpu_usage_seconds_total (CPU): * Definition: A metric from the Docker Engine showing how many CPU cores the container is actively burning.<!-- -->
<ul>
<li class="">Why/What it tells us: It verifies that the high concurrency is handled efficiently by Go's scheduler. If latency is high but CPU is low, I know I have a lock contention issue, not a hardware limit.</li>
</ul>
</li>
<li class="">go_memstats_heap_inuse_bytes vs go_memstats_sys_bytes (RAM):<!-- -->
<ul>
<li class="">Definition: Tracks the gap between what the Go runtime is actively using (Heap) versus what the OS has reserved for the process.</li>
<li class="">Why/What it tells us: It allows me to observe the Garbage Collection (GC) sawtooth pattern. It confirms that my GOMEMLIMIT configuration prevents the process from experiencing an Out-Of-Memory (OOM) kill under peak load.</li>
</ul>
</li>
<li class="">go_goroutines:<!-- -->
<ul>
<li class="">Definition: Tracks the total number of goroutines currently existing in the Go runtime.</li>
<li class="">Why/What it tells us: A flat plateau during the test means stable concurrency. The count dropping back to the baseline immediately after the test proves zero goroutine leaks.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-load-test-scripts">Setting Up Load Test Scripts<a href="https://blog.lzstock.app/blog/battle-test-0#setting-up-load-test-scripts" class="hash-link" aria-label="Direct link to Setting Up Load Test Scripts" title="Direct link to Setting Up Load Test Scripts" translate="no">​</a></h2>
<p>To validate my system, I needed to simulate a highly volatile market opening. I used <strong><a href="https://k6.io/" target="_blank" rel="noopener noreferrer" class="">k6</a></strong> as my load-generation weapon of choice.</p>
<p>My goal was to saturate both the inbound WebSocket connections and the internal Redis Pub/Sub broadcasting channels simultaneously.
I prepared two test scripts to test the system under extreme load and capacity. Both scripts are use the same mock price injection and observability although they have slightly different test parameters that will be explained in the following sections.</p>
<ul>
<li class=""><strong>Mock Price Injection:</strong> My BC10 service injects 859 prices, randomly generates new prices within a 1% variation rate, and then inserts them into Redis.</li>
<li class=""><strong>Observability:</strong> Prometheus scraping Go runtime metrics, visualized via Grafana.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-spike-test-script">1. Spike Test Script:<a href="https://blog.lzstock.app/blog/battle-test-0#1-spike-test-script" class="hash-link" aria-label="Direct link to 1. Spike Test Script:" title="Direct link to 1. Spike Test Script:" translate="no">​</a></h3>
<p><strong>The Test Parameters:</strong></p>
<ul>
<li class=""><strong>Target Load:</strong> Scaling up to a peak of 1,500 concurrent Virtual Users (VUs) establishing WebSocket connections.</li>
<li class=""><strong>Traffic Behavior:</strong> Each Virtual User (VU) acts like a real, impatient trader. They run in a continuous loop: first, they hit the REST API to create a session for a random batch of <strong>1 to 5 tickers</strong>. Next, they open a WebSocket connection, listen to live price updates for a random period (<strong>5 to 20 seconds</strong>), and then abruptly disconnect. After a quick <strong>1 to 3-second break</strong>, they loop back and do it again (capped at 100 iterations per VU). This simulates massive "connection churn" to test if the server cleans up resources properly.</li>
<li class=""><strong>Traffic Stages:</strong>
<ul>
<li class=""><strong>Ramp-up:</strong> A gradual 3-minute climb to a baseline of 1,000 VUs.</li>
<li class=""><strong>Baseline Plateau:</strong> A sustained 1-minute steady state at 1,000 VUs.</li>
<li class=""><strong>The Spike:</strong> A sudden 30-second surge injecting 500 more users, pushing the total to 1,500 VUs.</li>
<li class=""><strong>Peak Plateau:</strong> Maintaining the extreme 1,500 VU load for 1 minute to test for lock contention.</li>
<li class=""><strong>Recovery:</strong> A rapid 10-second scale-down to 0 VUs to observe how quickly the system releases memory.</li>
</ul>
</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Tickers pool (from mockPriceInit.go)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">TICKER_POOL</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Helper function: Randomly select Tickers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getRandomTickers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> count </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Randomly select 1-5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> shuffled </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token spread operator" style="color:#393A34">...</span><span class="token constant" style="color:#36acaa">TICKER_POOL</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> shuffled</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">slice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Helper function: Generate random integer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">randomInt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">min</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> max</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">max </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> min </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> min</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Define stress test script: Extreme load test (Ramp-up -&gt; Spike -&gt; Recovery)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">stages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Ramp-up: 3 minutes to ramp up to 5000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Stable at 5000 to observe baseline performance</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'30s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1500</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Spike: 30 seconds to spike to 15000 concurrent</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1500</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Continue for 1 minute extreme load, test Lock Contention</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'10s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic">// Recovery: 10 seconds to recover from load</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Function 1: Responsible for calling HTTP API to get Session ID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">tickers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> apiUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'http://bc15:8080/v1/sub_stock_price'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> payload </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">tickers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> tickers </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> httpParams </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string-property property" style="color:#36acaa">'Content-Type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'application/json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string-property property" style="color:#36acaa">'Authorization'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">TOKEN</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> res </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">apiUrl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> httpParams</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">check</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">res</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'HTTP Session created (200)'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">[VU </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">exec</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">vu</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">idInTest</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">] HTTP Failed! Status: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">res</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">status</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">, Body: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">res</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">body</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'session_id'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">[VU </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">exec</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">vu</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">idInTest</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">] Failed to parse JSON. Error: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">e</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Function 2: Responsible for creating WebSocket and closing it at a random time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">runWebSocketTest</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">sessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> wsUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">ws://bc15:8080/ws?session_id=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">sessionId</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">&amp;token=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation constant" style="color:#36acaa">TOKEN</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> waitTime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">randomInt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Randomly stay 5-20 seconds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> wsRes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ws</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">wsUrl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'open'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// After a random number of seconds, actively disconnect</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> waitTime </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'message'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// console.log(`[VU ${exec.vu.idInTest}] Received message`);</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'websocket: close sent'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">[VU </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">exec</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">vu</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">idInTest</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">] WS Error: </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">check</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">wsRes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'WS status is 101'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">101</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Main Entry Point</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Each VU will continue to execute until the test ends</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> tickers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getRandomTickers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sessionId </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tickers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">runWebSocketTest</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// After each reconnection, take a short break</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">randomInt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Check if the test time has been exceeded</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__ITER </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Prevent infinite loop, actually controlled by options.duration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><em>(Note: To prevent my authentication microservice from bottlenecking the load test, I implemented a strict <code>BYPASS_AUTH</code> environment variable coupled with a non-production safety lock. This allowed k6 to instantly establish thousands of connections without dealing with heavy JWT handshakes.)</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-capacity-test-script">2. Capacity Test Script:<a href="https://blog.lzstock.app/blog/battle-test-0#2-capacity-test-script" class="hash-link" aria-label="Direct link to 2. Capacity Test Script:" title="Direct link to 2. Capacity Test Script:" translate="no">​</a></h3>
<p><strong>The Test Parameters:</strong></p>
<ul>
<li class=""><strong>Target Load:</strong> Scaling up to a massive peak of 5,000 concurrent Virtual Users (VUs) establishing long-lived WebSocket connections.</li>
<li class=""><strong>Traffic Behavior:</strong> Each Virtual User (VU) acts like a dedicated, long-term investor. Instead of aggressive churning, they connect once and stay online. First, they hit the REST API to create a session for a random batch of <strong>1 to 5 tickers</strong>. Next, they open a WebSocket connection and continuously listen to live price updates for the entire duration of the test (up to <strong>15 minutes</strong>). This simulates a sustained, high-volume data streaming scenario without connection drops, testing the absolute capacity of our broadcasting engine.</li>
<li class=""><strong>Traffic Stages:</strong> * <strong>Ramp-up:</strong> A gradual 5-minute climb from 0 to 5,000 VUs.<!-- -->
<ul>
<li class=""><strong>Baseline Plateau:</strong> A sustained 5-minute steady state maintaining the peak 5,000 VU load. This provides a clear, noise-free window to observe system performance under maximum capacity.</li>
<li class=""><strong>Recovery:</strong> A rapid 30-second graceful scale-down to 0 VUs to observe how efficiently the system releases memory.</li>
</ul>
</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">TICKER_POOL</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getRandomTickers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> count </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> shuffled </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token spread operator" style="color:#393A34">...</span><span class="token constant" style="color:#36acaa">TICKER_POOL</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> shuffled</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">slice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> count</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 1. Adjust script: Gradually ramp up to 5,000 users and maintain stability</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">stages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'5m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Gradual ramp-up to 5,000 users</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'5m'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5000</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Maintain 5,000 users stable (quiet period)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">duration</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'30s'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">target</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Test end, graceful shutdown within 30 seconds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">tickers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> apiUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'http://bc15:8080/v1/sub_stock_price'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> payload </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">tickers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> tickers </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> httpParams </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'Content-Type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'application/json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'Authorization'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">TOKEN</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> res </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">apiUrl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> httpParams</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">check</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">res</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'HTTP Session created (200)'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">[VU </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">exec</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">vu</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">idInTest</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">] HTTP Failed! Status: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">res</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">status</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'session_id'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">runWebSocketTest</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">sessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> wsUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">ws://bc15:8080/ws?session_id=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">sessionId</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">&amp;token=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation constant" style="color:#36acaa">TOKEN</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 2. Remove random disconnections, keep connections until test end (e.g. 10 minutes)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> waitTime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">900</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 600 seconds (10 minutes)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> wsRes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ws</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">wsUrl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">socket</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'open'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// Here we no longer randomly disconnect, keep it online</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setTimeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> waitTime </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'message'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// Silent receive</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        socket</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'websocket: close sent'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">[VU </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">exec</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">vu</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">idInTest</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">] WS Error: </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">check</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">wsRes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'WS status is 101'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">101</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 3. Entry Point：Remove while(true), each VU only executes once connection</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// =========================================================</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> tickers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getRandomTickers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> sessionId </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createSession</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tickers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">runWebSocketTest</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sessionId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Here we don't need while(true), k6 will automatically manage the lifecycle of VU based on options.duration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Ref: Ticker Pool</summary><div><div class="collapsibleContent_i85q"><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">TICKER_POOL</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"A"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AAL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AAP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AAPL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ABBV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ABEV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ABNB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ABT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ACGL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ACI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ACM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ACN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ADBE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ADI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ADM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ADP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ADSK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AEE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AEG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AEM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AEP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AER"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AES"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AFG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AFL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AGCO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AGL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AIG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AIZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AJG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AKAM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ALB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ALC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ALGN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ALL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ALLE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ALLY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ALNY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMAT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMCR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AME"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMGN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AMZN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ANET"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ANSS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AON"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AOS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"APD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"APH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"APO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"APP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"APTV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AQN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ARE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ARES"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ARGX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ARMK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ARW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ASML"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ASTI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ASX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ATEYY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ATO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AVB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AVGO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AVTR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AVY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AWK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AXP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AZN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AZO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BABA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BAC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BAH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BAM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BAP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BAX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BBD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BBVA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BBWI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BBY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BCE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BCH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BCS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BDX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BEN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BEP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BHP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BHVN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BIDU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BIIB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BILI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BILL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BIO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BIP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BJ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BKNG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BKR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BLDR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BLK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BMO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BMRN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BMY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BNS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BNTX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BRKR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BRO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BSAC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BSBR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BSX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BSY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BTI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BUD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BURL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BWA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BXP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"C"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CABO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CACC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CAE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CAG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CAH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CAR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CARR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CASY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CAT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CBOE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CBRE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CBSH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CCEP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CCI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CCJ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CCK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CCL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CDNS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CDW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CFG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CFR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CGNX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CHD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CHDN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CHE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CHKP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CHRW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CHT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CHTR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CHWY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CIEN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CINF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CLF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CLVT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CLX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CMA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CMCSA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CME"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CMG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CMI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CMS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CNA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CNC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CNI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CNP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CNQ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CNXC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"COF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"COIN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"COLD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CONOCOPHILLIPS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"COO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"COST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CPB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CPNG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CPRT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CPT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CQP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CRH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CRL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CRM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CRWD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CSCO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CSGP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CSL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CSX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CTAS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CTRA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CTSH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CTVA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CUBE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CUK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CVE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CVS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CVX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CZR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"D"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DAL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DAR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DASH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DBX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DDOG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DELL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DEO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DGX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DHI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DHR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DIS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DLB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DLO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DLR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DLTR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOCS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOCU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DOX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DPZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DRI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DTE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DUK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DVA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DVN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DXC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DXCM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"E"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EBAY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EBR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ECL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ED"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EDU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EFX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EIX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ELAN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ELP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ELS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EMN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EMR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ENB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ENPH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ENTG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EOG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EPAM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EPD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EQH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EQIX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EQNR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EQR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EQT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ERIC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ERIE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ES"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ESLT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ESS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ET"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ETN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ETR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ETSY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EVRG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EWBC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EXAS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EXC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EXPD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EXPE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EXR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"F"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FANG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FAST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FCX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FDS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FDX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FERG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FFIV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FHN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FICO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FIS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FITB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FMC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FMS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FMX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FNF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FNV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FOXA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FRFHF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FRT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FSLR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FTNT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FTS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FTV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"FUTU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"G"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GDDY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GDS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GFI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GFL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GFS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GGB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GGG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GIB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GILD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GIS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GLD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GLOB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GLPI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GLW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GMAB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GME"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GNRC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GOOGL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GPC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GPN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GRAB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GRFS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GRMN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GSK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GTLB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GWLIF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"GWW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"H"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HAL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HAS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HBAN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HCA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HDB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HEI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HES"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HIG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HII"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HLT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HMC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HOLX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HON"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HPE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HPQ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HRL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HSBC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HSIC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HSY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HTHT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HTZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HUBB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HUBS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HUM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HWM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IAU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IBKR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IBM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IBN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ICE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ICL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ICLR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IDXX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IEP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IEX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IFF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IFNNY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IHG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ILMN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IMO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"INCY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"INFY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ING"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"INTC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"INTU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"INVH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IPG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IQV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IRM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ISRG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ITUB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ITW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IVZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"IX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"J"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JAZZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JBHT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JBL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JCI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JHX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JKHY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JLL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JNJ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JNPR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"JPM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KBR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KDP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KELLANOVA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KEP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KEY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KEYS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KHC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KIM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KKR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KLAC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KMB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KMI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KMX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KNX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KOF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"L"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LAD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LAMR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LBRDA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LBTYA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LCID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LDOS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LEA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LECO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LEGN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LEN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LHX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LII"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LIN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LKQ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LLY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LMT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LNC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LNG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LNT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LOGI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LOW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LPLA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LRCX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LULU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LUMN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LUV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LVS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LYB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LYG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"LYV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MAA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MANH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MAR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MAS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MASI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MAT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MCD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MCHP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MCK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MCO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MDB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MDLZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MDT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MELI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MET"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MFC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MFG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MGA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MGM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MHK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MIDD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MKC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MKL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MKTX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MLM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MMC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MMM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MNST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MOH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MORN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MOS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MPC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MPLX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MPW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MPWR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MRK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MRNA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MRVL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MSCI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MSFT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MSI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MTB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MTCH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MTD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MTN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MUFG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NBIX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NDAQ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NDSN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NEE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NEM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NET"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NFE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NFLX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NGG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NICE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NIO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NKE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NLY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NMR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NNN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NOC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NOK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NOW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NRG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NSC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NTAP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NTES"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NTR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NTRS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NUE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NVCR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NVDA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NVO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NVR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NVS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NWG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NWL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NWSA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NXPI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NXST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"O"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ODFL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OGE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OGN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OHI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OKE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OKTA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OLN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OLPX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OMC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ON"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ORCL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ORI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ORLY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OTEX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OTIS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OVV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OXY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PAA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PAC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PAG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PANW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PATH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PAYC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PAYX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PBA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PBR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PCAR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PCG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PCTY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PDD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PEG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PEP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PFE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PFG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PFGC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PGR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PHG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PHM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PINS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PKG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PKX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PLD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PLTR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PLUG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PNC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PNR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PNW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PODD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"POOL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PPC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PPG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PPL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PRU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PSA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PSO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PSTG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PSX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PTC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PUK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PWR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"PYPL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"QCOM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"QGEN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"QRVO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"QSR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RACE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RBA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RBLX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RCI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RCL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RDY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"REG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"REGN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RELX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"REXR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RGA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RGEN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RGLD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RHI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RIO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RIVN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RJF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RKT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RMD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RNR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ROK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ROKU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ROL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ROP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ROST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RPM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RPRX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RRX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RSG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RTNTF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RTX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RYAAY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SAN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SAP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SBAC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SBSW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SCCO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SCHW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SCI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SEDG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SEE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SEIC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SEMPRA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SHG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SHW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SIRI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SJM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SKM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SLB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SLF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SMFG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNAP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNOW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNPS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SONY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SPG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SPGI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SPOT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SQM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SSL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SSNC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"STE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"STLA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"STLD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"STM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"STT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"STX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"STZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SUI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SUZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SWK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SWKS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SYF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SYK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SYY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"T"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TAK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TAP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TCOM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TDG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TDY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TEAM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TECH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TECK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TEF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TEL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TER"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TEVA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TFC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TFII"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TFX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TGT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TJX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TLK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TME"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TMO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TMUS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TOST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TPL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TPR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TRGP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TRI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TRMB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TROW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TRP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TRU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TRV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TSCO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TSLA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TSM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TSN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TTC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TTD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TTE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TTEK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TTWO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TU"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TW"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TWLO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TXN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TYL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"U"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UAL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UBER"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UBS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UDR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UELMO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UGI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UHAL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UHS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ULTA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UMC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UNH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UNM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UNP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UPS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"URI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"USB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"USFD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"USO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"UTHR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VALE"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VEEV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VFC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VICI"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VIPS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VIV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VLO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VMC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VOD"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VRSK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VRSN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VRTX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VTR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VTRS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"VZ"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WAB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WAL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WAT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WBA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WCN"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WDAY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WDC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WEC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WELL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WES"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WEX"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WFC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WFG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WHR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WIT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WLK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WMB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WMG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WMT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WOLF"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WPC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WPM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WPP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WRB"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WSC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WSM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WSO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WST"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WTRG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"WY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"XEL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"XOM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"XP"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"XPEV"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"XRAY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"XYL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YMM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YUM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YUMC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ZBH"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ZBRA"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ZG"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ZION"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ZM"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ZS"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ZTO"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ZTS"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-compose-setup">Docker-Compose Setup<a href="https://blog.lzstock.app/blog/battle-test-0#docker-compose-setup" class="hash-link" aria-label="Direct link to Docker-Compose Setup" title="Direct link to Docker-Compose Setup" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Ref: Docker-Compose Setup</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Infrastructure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">nats</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nats</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">2.10</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">alpine</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"4222:4222"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8222:8222"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"-js"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">8.0.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"6379:6379"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">redis-exporter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> oliver006/redis_exporter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">v1.58.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">exporter</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> REDIS_ADDR=redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">17</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">alpine</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">POSTGRES_USER</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">POSTGRES_PASSWORD</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> password</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">POSTGRES_DB</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lzstock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"5433:5432"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pgdata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/var/lib/postgresql/data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DB_ROOT_PATH</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">/schema/init</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">schema.sh</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/scripts/init</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">schema.sh</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Services</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">bc10</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.gitlab.com/lzstock/lzstock/bc10</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sync</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">JETSTREAM_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nats</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">4222</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">REDIS_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC10_DATA_SYNC_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HEALTH_CHECK_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50052"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> nats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">bc11</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.gitlab.com/lzstock/lzstock/bc11</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">market</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">monitor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50053:50052"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ulimits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">nproc</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">nofile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">soft</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">hard</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">sysctls</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> net.core.somaxconn=65535              </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">JETSTREAM_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nats</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">4222</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">REDIS_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC11_MARKET_MONITOR_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HEALTH_CHECK_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50052"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">MAX_SESSIONS_PER_USER</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">APP_DEBUG</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> nats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">bc13</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.gitlab.com/lzstock/lzstock/bc13</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">investor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">JETSTREAM_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nats</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">4222</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">REDIS_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PG_DB_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgresql</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//lzstock_dev_bc13_investor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">lzstock@pg/lzstock</span><span class="token punctuation" style="color:#393A34">?</span><span class="token plain">sslmode=disable</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC13_INVESTOR_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC1_INDICATOR_INSIGHTS_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bc1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HEALTH_CHECK_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50052"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> nats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> bc1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">bc15</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.gitlab.com/lzstock/lzstock/bc15</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8080:8080"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50052:50052"</span><span class="token plain">      </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ulimits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">nproc</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">nofile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">soft</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">hard</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">sysctls</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> net.core.somaxconn=65535         </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">healthcheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">           </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">disable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">JETSTREAM_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nats</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">4222</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC15_API_GATEWAY_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC1_INDICATOR_INSIGHTS_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bc1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC3_COMPANY_SELECTOR_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bc3</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC11_MARKET_MONITOR_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bc11</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC13_INVESTOR_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bc13</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HEALTH_CHECK_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50052"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BYPASS_AUTH</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">APP_DEBUG</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> nats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> bc1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> bc3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> bc11</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> bc13</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Dependencies (bc1, bc3)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">bc1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.gitlab.com/lzstock/lzstock/bc1</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">indicator</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">insights</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">JETSTREAM_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nats</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">4222</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">REDIS_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PG_DB_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgresql</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//lzstock_dev_bc1_indicator_insights</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">lzstock@pg/lzstock</span><span class="token punctuation" style="color:#393A34">?</span><span class="token plain">sslmode=disable</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC1_INDICATOR_INSIGHTS_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HEALTH_CHECK_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50052"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> nats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">bc3</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.gitlab.com/lzstock/lzstock/bc3</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">company</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">JETSTREAM_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nats</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">4222</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">REDIS_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PG_DB_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgresql</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//lzstock_dev_bc3_company_selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">lzstock@pg/lzstock</span><span class="token punctuation" style="color:#393A34">?</span><span class="token plain">sslmode=disable</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">BC3_COMPANY_SELECTOR_SERVICE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HEALTH_CHECK_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"50052"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> nats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Monitoring</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">prometheus</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> prom/prometheus</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"9090:9090"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./prometheus.yml</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/etc/prometheus/prometheus.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">grafana</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> grafana/grafana</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"3000:3000"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./grafana/data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/var/lib/grafana</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./grafana/dashboards</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/var/lib/grafana/dashboards</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./grafana/provisioning</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/etc/grafana/provisioning</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> prometheus</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">cadvisor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/cadvisor/cadvisor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">v0.49.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cadvisor</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">privileged</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8081:8080"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/rootfs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /var/run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/var/run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /sys</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/sys</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /var/lib/docker/</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/var/lib/docker</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /dev/disk/</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/dev/disk</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /sys/fs/cgroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/sys/fs/cgroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /var/run/docker.sock</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/var/run/docker.sock</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">devices</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /dev/kmsg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">k6</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> grafana/k6</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"load-test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./k6/</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/scripts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ulimits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">nproc</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">nofile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">soft</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">hard</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">65535</span><span class="token plain">     </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> lzstock</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">network</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">profiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> tools</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">lzstock-network</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">driver</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bridge</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pgdata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Daniel Lin</name>
            <uri>https://daniellin.app</uri>
        </author>
    </entry>
</feed>