You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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();
}

关键细节说明

  1. 线程安全:用lock保护待处理列表,因为库存更新事件可能在多线程环境下触发,避免并发修改导致的异常。
  2. 异步处理:用Task.Run执行API调用,不会阻塞事件回调线程,保证后续的库存更新事件能正常接收。
  3. 双触发机制:
    • 阈值触发:攒够设定数量(比如20个)立刻发起批量请求,减少API调用次数。
    • 定时兜底:每隔固定时间(比如1秒)检查待处理列表,哪怕只有1个商品也会发起请求,不会出现遗漏。
  4. 参数可调:BatchThreshold和BatchIntervalMs可以根据Shopify的API限流规则灵活调整(比如Shopify的REST API通常限制每分钟600次请求,可根据这个设置合适的批量大小)。

内容的提问来源于stack exchange,提问作者Saghar Francis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:01:04