如何通过C#事件批量处理库存更新以避免Shopify API限流
解决Shopify API批量更新限流问题
核心方案:阈值触发+定时兜底
针对批量更新时API调用频繁限流、暂存列表不足数量不触发的问题,采用「攒够一定数量立刻发,到点没攒够也发」的策略,既减少API调用次数,又不会遗漏待更新商品。
代码实现
首先要修正之前的问题:不能把暂存列表放在方法内部,否则每次触发事件都会新建列表,根本存不住数据。需要把列表、锁对象和定时器放在类级别字段中:
// 类级别字段,全局复用 private readonly List<string> _pendingItems = new List<string>(); private readonly object _lockObj = new object(); private Timer _batchTimer; // 可根据Shopify API限流规则调整这两个参数 private const int BatchThreshold = 20; // 攒够20个就触发批量更新 private const int BatchIntervalMs = 1000; // 1秒兜底,到点不管多少都发 public void SubscribeToInventoryEvent(Events eventObj) { // 初始化定时器:首次延迟1秒,之后每隔1秒检查一次待处理列表 _batchTimer = new Timer(ProcessPendingItems, null, BatchIntervalMs, BatchIntervalMs); // 订阅库存更新事件 eventObj.InventoryStockUpdated += OnInventoryStockUpdated; } private void OnInventoryStockUpdated(string itemNo) { // 加锁保证线程安全,避免多线程并发修改列表 lock (_lockObj) { _pendingItems.Add(itemNo); // 达到阈值立刻批量处理 if (_pendingItems.Count >= BatchThreshold) { // 复制列表并清空原列表,避免阻塞后续事件回调 var itemsToProcess = _pendingItems.ToList(); _pendingItems.Clear(); // 异步执行API调用,不卡事件线程 Task.Run(() => ProcessBatch(itemsToProcess)); } } } // 定时器触发的兜底处理逻辑 private void ProcessPendingItems(object state) { lock (_lockObj) { if (_pendingItems.Count == 0) return; var itemsToProcess = _pendingItems.ToList(); _pendingItems.Clear(); Task.Run(() => ProcessBatch(itemsToProcess)); } } // 实际调用Shopify API的批量处理方法 private void ProcessBatch(List<string> itemNos) { try { // 替换为实际的Shopify批量更新API调用 // ShopifyApi.BatchUpdateInventory(itemNos); Console.WriteLine($"完成批量更新:共 {itemNos.Count} 个商品"); } catch (Exception ex) { // 异常处理:记录日志、重试(需避免死循环)等 Console.WriteLine($"批量更新失败:{ex.Message}"); // 可选:将失败的商品重新加入待处理队列 // lock (_lockObj) { _pendingItems.AddRange(itemNos); } } } // 类销毁时记得释放定时器,避免内存泄漏 public void Dispose() { _batchTimer?.Dispose(); }
关键细节说明
- 线程安全:用
lock保护待处理列表,因为库存更新事件可能在多线程环境下触发,避免并发修改导致的异常。 - 异步处理:用
Task.Run执行API调用,不会阻塞事件回调线程,保证后续的库存更新事件能正常接收。 - 双触发机制:
- 阈值触发:攒够设定数量(比如20个)立刻发起批量请求,减少API调用次数。
- 定时兜底:每隔固定时间(比如1秒)检查待处理列表,哪怕只有1个商品也会发起请求,不会出现遗漏。
- 参数可调:
BatchThreshold和BatchIntervalMs可以根据Shopify的API限流规则灵活调整(比如Shopify的REST API通常限制每分钟600次请求,可根据这个设置合适的批量大小)。
内容的提问来源于stack exchange,提问作者Saghar Francis
相关产品推荐
相关产品推荐

