<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Linh A. Nguyen | Qilin.Cloud</title>
	<atom:link href="https://qilin.cloud/author/l-nguyen/feed/" rel="self" type="application/rss+xml" />
	<link>https://qilin.cloud</link>
	<description>Technology Platform for composable e-commerce</description>
	<lastBuildDate>Wed, 25 Mar 2026 13:15:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://qilin.cloud/wp-content/uploads/2023/08/cropped-QilinCloud-Logo-32x32.png</url>
	<title>Linh A. Nguyen | Qilin.Cloud</title>
	<link>https://qilin.cloud</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Bulk Requests &#038; Long-Running Tasks: Scaling Without Turning Your API Into a Lottery</title>
		<link>https://qilin.cloud/bulk-requests-long-running-tasks-scaling-without-timeout-lottery-2/</link>
		
		<dc:creator><![CDATA[Linh A. Nguyen]]></dc:creator>
		<pubDate>Wed, 30 Apr 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[Product Updates]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[bulk processing]]></category>
		<category><![CDATA[long-running tasks]]></category>
		<category><![CDATA[throughput]]></category>
		<guid isPermaLink="false">https://qilin.cloud/?p=3643</guid>

					<description><![CDATA[<p>April’s update: bulk requests handled asynchronously. Less overhead, better pacing, clearer progress tracking—built for real-world catalog and offer volumes.</p>
<p>The post <a rel="nofollow" href="https://qilin.cloud/bulk-requests-long-running-tasks-scaling-without-timeout-lottery-2/">Bulk Requests &amp; Long-Running Tasks: Scaling Without Turning Your API Into a Lottery</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="et_pb_section et_pb_section_0 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_0">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_0  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_0  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p>Every integration team eventually discovers a painful truth:</p>
<p><strong>APIs that only work “one object at a time” don’t scale in real commerce.</strong></p>
<p>They’re fine for demos. <br />They’re fine when volume is small. <br />They’re fine until you need to push 20,000 product updates and your rate limits start laughing at you.</p>
<p>So April’s theme is a classic engineering upgrade—one you’ll recognize from marketplaces and large platforms:</p>
<p><strong>Bulk requests + asynchronous processing.</strong></p></div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_1">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_1  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module pac_divi_table_of_contents pac_divi_table_of_contents_0">
				
				
				
				
				
				
				<div class="et_pb_module_inner">
					
        <div class="pac_dtoc_main_container"
        data-allow_collapse_minimize="on"
        data-allow_collapse_minimize_tablet="on"
        data-allow_collapse_minimize_phone="on"
        data-ss="2000"
        data-sah="100"
        data-collapse_when_sticky="off"
        data-collapse_when_sticky_tablet="off"
        data-collapse_when_sticky_phone="off"
        data-skh="off"
        data-mtocai="off"
        data-mtocai_tablet="off"
        data-mtocai_phone="off"
        data-alh="off"
        data-ds="closed"
        data-dst="closed"
        data-dsp="closed">
            <div class="pac_dtoc_title_area click_on click_tablet_on click_phone_on">
                <div role="heading" aria-level="2" id="pac_dtocm_title" class="pac_dtoc_title">Table of Contents</div>
                
                <div class="pac_dtoc_icon_responsive">
                    <div class="pac_dtoc_opened_icon">2</div>
                    <div class="pac_dtoc_closed_icon">3</div>
                </div>
                
            </div>
            <div role="navigation" aria-labelledby="pac_dtocm_title" class="pac_dtoc_body_area inside">
                
                <div class='divi_table_of_contents' role="tree" ><ul class="pac_dtoc_heading_level_1" role="group" ><li class="pac_dtoc_li_heading_level_1" role="treeitem" ><div role="presentation" ><span data-href='#pac_remove_first_heading' data-hl='1'></span><a href='#pac_remove_first_heading' id='pac_remove_first_heading_toc_headding'>FirstHeading</a></div></li><ul class="pac_dtoc_heading_level_2" role="group" ><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Thetraditionalpatternthatmarketplacesgotright' data-hl='2'></span><a href='#Thetraditionalpatternthatmarketplacesgotright' id='Thetraditionalpatternthatmarketplacesgotright_toc_headding'>The “traditional” pattern that marketplaces got right</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#WhyQilinprefersbulkevenwhenobjectsareprocessedindividually' data-hl='2'></span><a href='#WhyQilinprefersbulkevenwhenobjectsareprocessedindividually' id='WhyQilinprefersbulkevenwhenobjectsareprocessedindividually_toc_headding'>Why Qilin prefers bulk (even when objects are processed individually)</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whathappenswhenyousubmitabulkrequest' data-hl='2'></span><a href='#Whathappenswhenyousubmitabulkrequest' id='Whathappenswhenyousubmitabulkrequest_toc_headding'>What happens when you submit a bulk request?</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Trackingprogresswithoutguesswork' data-hl='2'></span><a href='#Trackingprogresswithoutguesswork' id='Trackingprogresswithoutguesswork_toc_headding'>Tracking progress without guesswork</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Pollingvscallbacksthepragmaticapproach' data-hl='2'></span><a href='#Pollingvscallbacksthepragmaticapproach' id='Pollingvscallbacksthepragmaticapproach_toc_headding'>Polling vs callbacks: the pragmatic approach</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Fordevelopers' data-hl='2'></span><a href='#Fordevelopers' id='Fordevelopers_toc_headding'>For developers</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Formerchantsandagencies' data-hl='2'></span><a href='#Formerchantsandagencies' id='Formerchantsandagencies_toc_headding'>For merchants and agencies</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Forinvestors' data-hl='2'></span><a href='#Forinvestors' id='Forinvestors_toc_headding'>For investors</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#Whatsnext' data-hl='2'></span><a href='#Whatsnext' id='Whatsnext_toc_headding'>What’s next</a></div></li><li class="pac_dtoc_li_heading_level_2" role="treeitem" ><div role="presentation" ><span data-href='#BigjobsdeservegrownupAPIs' data-hl='2'></span><a href='#BigjobsdeservegrownupAPIs' id='BigjobsdeservegrownupAPIs_toc_headding'>Big jobs deserve grown-up APIs</a></div></li></ul></div>
            </div>
        </div>
        
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_6">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_6  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_10  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>The “traditional” pattern that marketplaces got right</span></h2>
						<div class="et_pb_blurb_description"><p>If you’ve integrated with marketplace APIs before, you’ve likely seen this pattern:</p>
<ul>
<li><strong>Single entity request</strong> → synchronous response (fast, under a second)</li>
<li><strong>Bulk request</strong> → asynchronous response:
<ul>
<li>you get an immediate technical “accepted”</li>
<li>plus an ID (or a status URL)</li>
<li>then you check progress later</li>
</ul>
</li>
</ul>
<p>Why?</p>
<p>Because bulk work is expensive:</p>
<ul>
<li>it takes time</li>
<li>it consumes resources</li>
<li>it needs controlled throughput</li>
<li>and it shouldn’t block a client connection while it runs</li>
</ul>
<p>This is exactly the pattern we’re strengthening in Qilin.Cloud.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div><div class="et_pb_row et_pb_row_7">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_7  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_blurb et_pb_blurb_11  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Why Qilin prefers bulk (even when objects are processed individually)</span></h2>
						<div class="et_pb_blurb_description"><p>Here’s the honest part.</p>
<p>Even if a bulk request is eventually split into individual objects internally, bulk is still better because:</p>
<ul>
<li>one authentication handshake instead of thousands</li>
<li>one connection setup instead of thousands</li>
<li>one request envelope to track</li>
<li>controlled scheduling on the backend</li>
<li>fewer “client-side retry storms” when timeouts happen</li>
</ul>
<p>In other words: less overhead, better pacing, and fewer ways to accidentally melt your own integration.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_12  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What happens when you submit a bulk request?</span></h2>
						<div class="et_pb_blurb_description"><p>The key idea is simple:</p>
<ol>
<li>You send many items in one request.</li>
<li>Qilin accepts it quickly.</li>
<li>Qilin processes the items asynchronously.</li>
<li>You track progress via a request/execution identifier.</li>
</ol>
<p>This keeps the client experience clean and keeps server throughput manageable.</p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_13  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Tracking progress without guesswork</span></h2>
						<div class="et_pb_blurb_description"><p>Bulk work without tracking is just a black box with a timer taped to it.</p>
<p>So Qilin’s approach ties bulk operations into observability:</p>
<ul>
<li>each bulk job can be linked to a workflow / execution context</li>
<li>progress can be queried without guessing which step is currently running</li>
<li>results can be inspected in a way that’s compatible with Data Flow Tracking</li>
</ul>
<p>This is the difference between:</p>
<ul>
<li>“Maybe it finished?” <br />and</li>
<li>“Here is the exact status, with logs, per object.”</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_accordion et_pb_accordion_1">
				
				
				
				
				<div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_1  et_pb_toggle_open">
				
				
				
				
				<h5 class="et_pb_toggle_title"></h5>
				<div class="et_pb_toggle_content clearfix">We invite you to share your experiences and lessons learned with Qilin.Cloud’s innovative technology platform for composable e-commerce. Your story can inspire others and help the whole community to improve.</p>
<p>&nbsp;</p>
<h4><strong>Share your Qilin.Cloud Success Story</strong><br />
<span> </span></h4>
<div class="et_pb_button_module_wrapper et_pb_button_0_wrapper  et_pb_module "><a class="et_pb_button et_pb_button_0 et_pb_bg_layout_light" href="https://qilin.cloud/share-your-story/">Your Journey</a></div></div>
			</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_14  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Polling vs callbacks: the pragmatic approach</span></h2>
						<div class="et_pb_blurb_description"><p>In a perfect world, every async job would call you back the moment it finishes.</p>
<p>In the real world, callbacks create their own operational costs:</p>
<ul>
<li>workers watching task completion states</li>
<li>outbound calls to user endpoints</li>
<li>retries, security, and delivery guarantees</li>
</ul>
<p>So the core model remains intentionally straightforward:</p>
<ul>
<li>return an ID</li>
<li>provide a general endpoint for checking status</li>
<li>allow consumers to check when they need to</li>
</ul>
<p><em>(If you’ve lived through webhook delivery edge cases, you know why this choice is… quietly wise.)</em></p></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_15  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For developers</span></h2>
						<div class="et_pb_blurb_description"><p>Bulk + async isn’t just a performance feature.</p>
<p>It’s a design contract:</p>
<ul>
<li>you can import at scale without playing rate-limit roulette</li>
<li>you can model “big changes” as long-running tasks</li>
<li>you can build resilient clients that don’t time out and retry endlessly</li>
<li>you can integrate this cleanly with CI/CD and automation</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_16  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For merchants and agencies</span></h2>
						<div class="et_pb_blurb_description"><ul>
<li>large catalog updates become practical</li>
<li>onboarding a new channel doesn’t require “slow rolling” data for days</li>
<li>agencies can deliver faster because they’re not fighting API throughput limits</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_17  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>For investors</span></h2>
						<div class="et_pb_blurb_description"><p>This is platform leverage again:</p>
<ul>
<li>bulk endpoints reduce per-object overhead</li>
<li>async processing allows controlled throughput and predictable resource consumption</li>
<li>better tracking reduces support cost and increases trust</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_18  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>What’s next</span></h2>
						<div class="et_pb_blurb_description"><p>Once bulk processing is in place, the next question is:</p>
<p><strong>How do we integrate with the outside world more flexibly?</strong></p>
<p>Next month we’ll dive into two new building blocks that make pipelines far more adaptable:</p>
<ul>
<li><strong>Webhook Entry Processor</strong> (event-driven starts)</li>
<li><strong>HTTP Request Processor</strong> (call external services mid-pipeline)</li>
</ul></div>
					</div>
				</div>
			</div><div class="et_pb_module et_pb_blurb et_pb_blurb_19  et_pb_text_align_left  et_pb_blurb_position_top et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_blurb_content">
					
					<div class="et_pb_blurb_container">
						<h2 class="et_pb_module_header"><span>Big jobs deserve grown-up APIs</span></h2>
						<div class="et_pb_blurb_description"><p>Bulk operations are where “toy integrations” stop and real systems begin.</p>
<p>If you’ve been doing this the hard way &#8211; one request at a time &#8211; Qilin.Cloud is building the kind of primitives you’ve probably wished you had years ago.</p></div>
					</div>
				</div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>
<p>The post <a rel="nofollow" href="https://qilin.cloud/bulk-requests-long-running-tasks-scaling-without-timeout-lottery-2/">Bulk Requests &amp; Long-Running Tasks: Scaling Without Turning Your API Into a Lottery</a> appeared first on <a rel="nofollow" href="https://qilin.cloud">Qilin.Cloud</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
