Azure Service Fabric 可靠集合的并发安全旋转

Concurrency safe pivoting of Azure Service Fabric Reliable Collections

我有一个服务,它有一堆传入的订单,我将它们存储到 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();
        }

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

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

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

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

另一种选择是对 Order 数据使用 SQL 服务器,而不是可靠的集合。

您可以使用可靠的 collections 通知并存储在排序列表中。确保您不会错过与词典相关的活动。