【问题标题】:Concurrency safe pivoting of Azure Service Fabric Reliable CollectionsAzure Service Fabric 可靠集合的并发安全旋转
【发布时间】:2018-11-06 14:05:25
【问题描述】:

我有一项服务,其中包含大量传入订单,我将这些订单存储到 IReliableDictionary 中。随着新订单的到来,我需要在程序的整个生命周期内更新和维护这些订单的单独排序列表。

我如何有效地并发地将 IReliableDictionary 中的数据转入不同的排序集合,这样我就可以避免死锁并且不必在每次新订单进入时都从头开始重建排序列表?

编辑:查看文档后,我相信我可以通过在提交前更新后更新本地内存排序集合来实现这一点。

        using (var tx = this.StateManager.CreateTransaction())
        {
            bool addOk = await orderDictionary.TryAddAsync(tx, 123, someOrderToAdd);
            if (addOk)
            {
                this.SortedOrders.Add(someOrderToAdd);
            }
            await tx.CommitAsync();
        }

有人可以确认我对文档的理解是正确的,并且类似上面的实现不会导致并发问题吗?

【问题讨论】:

    标签: azure azure-service-fabric service-fabric-stateful


    【解决方案1】:

    您可以使用可靠的集合通知并存储在排序列表中。这将确保您不会错过与字典相关的事件。

    【讨论】:

    • 推荐的用法是什么?通知按顺序/并发是否安全?或者,我应该锁定排序列表然后插入(假设可靠字典在通知期间不保持某种更新锁定)?
    • 如果你使用并发字典,你不需要锁。您确实需要一个用于排序列表的锁。事件按顺序到达。不要在事件处理程序中执行昂贵的操作。
    【解决方案2】:

    如果它只是用于进程的生命周期,并且如果分区内只有Orders 没有问题,也许您可​​以使用常规并发收集。对于example,一个ConcurrentQueue<Order>

    您还可以使用event driven approach,在每次收到Order 时发出带有时间戳的OrderReceivedEvent。然后,您可以在将这些事件存储在某处的单独服务中订阅这些事件。

    或者您可以使用像Redis(在Container 中)这样的分布式缓存来临时保留Orders

    另一种选择是使用 SQL Server 处理 Order 数据,而不是可靠的集合。

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2016-08-09
      • 2017-12-07
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 2020-04-05
      • 2016-03-14
      • 2022-06-18
      相关资源
      最近更新 更多