Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure service fabric 将IReliableQueue更改为IReliableConcurrentQueue对现有部署有什么影响?_Azure Service Fabric - Fatal编程技术网

Azure service fabric 将IReliableQueue更改为IReliableConcurrentQueue对现有部署有什么影响?

Azure service fabric 将IReliableQueue更改为IReliableConcurrentQueue对现有部署有什么影响?,azure-service-fabric,Azure Service Fabric,我在一个使用IReliableQueue的服务结构应用程序中工作。对于该系统的用例,使用是有意义的,并且一些本地测试(即,基本上只需将代码更改为使用ireliablecocurrentqueue而不是IReliableQueue-队列名称不会更改)显示了极大的性能改进。然而,我担心在生产系统中改变这一点(即升级)的影响。我找不到关于这些注意事项的任何文档或在线问题(除非我错过了它们)。例如,在这个系统中,现有的IReliableQueue几乎总是包含项。那么,当我升级SF应用程序时,这些数据会发

我在一个使用IReliableQueue的服务结构应用程序中工作。对于该系统的用例,使用是有意义的,并且一些本地测试(即,基本上只需将代码更改为使用ireliablecocurrentqueue而不是IReliableQueue-队列名称不会更改)显示了极大的性能改进。然而,我担心在生产系统中改变这一点(即升级)的影响。我找不到关于这些注意事项的任何文档或在线问题(除非我错过了它们)。例如,在这个系统中,现有的IReliableQueue几乎总是包含项。那么,当我升级SF应用程序时,这些数据会发生什么变化呢?是否可以在IReliableConcurrentQueue中退出队列?还是数据会丢失?我知道我可以“试一试”,但我想看看是否有人也这样做了,或者可以提供指向现有资源的指针。谢谢

很抱歉回答晚了(你可能不再需要了,但仍然需要)

当我们在
IReliableStateManager
上调用
GetOradAsync
方法时,我们并不是检索接口来存储值,而是实际创建了一个可靠集合的实例。这基本上意味着我们指定的接口类型非常重要

考虑到这一点,如果我们这样做:

服务。1.0

// Somewhere in RunAsync for example
await this.StateManager.GetOrAddAsync<IReliableQueue<long>>("MyCollection")
请注意,此代码只是一个说明性示例,在将其应用于实际应用程序之前应进行适当的测试。

很抱歉回答得太晚(您可能不再需要,但仍然需要)

当我们在
IReliableStateManager
上调用
GetOradAsync
方法时,我们并不是检索接口来存储值,而是实际创建了一个可靠集合的实例。这基本上意味着我们指定的接口类型非常重要

考虑到这一点,如果我们这样做:

服务。1.0

// Somewhere in RunAsync for example
await this.StateManager.GetOrAddAsync<IReliableQueue<long>>("MyCollection")

请注意,此代码只是一个说明性示例,在将其应用于实际应用程序之前应进行适当测试。

谢谢,这非常有用。我仍然需要答案,所以我真的很感激。我喜欢你建议的方法,我的另一个想法是创建一个新队列,将旧队列留在原地,以便在所有新工作进入新队列时将其排干。谢谢,这非常有帮助。我仍然需要答案,所以我真的很感激。我喜欢你建议的方法,我的另一个想法是创建一个新队列,让旧队列在所有新工作进入新队列时被排干。
var migrate = false; // This flag indicates whether the migration was already done.
var migrateValues = new List<long>();

var applicationFlags = await this.StateManager
    .GetOrAddAsync<IReliableDictionary<string, bool>>("application-flags");
using (var transaction = this.StateManager.CreateTransaction())
{
    var flag = await applicationFlags
        .TryGetValueAsync(transaction, "queue-to-concurrent-queue-migration");
    if (!flag.HasValue || !flag.Value)
    {
        var queue = await this.StateManager
            .GetOrAddAsync<IReliableQueue<long>>("value-collection");
        for (;;)
        {
            var c = await queue.TryDequeueAsync(transaction);
            if (!c.HasValue)
            {
                break;
            }

            migrateValues.Add(c.Value);
        }
        migrate = true;
    }
}

if (migrate)
{
    await this.StateManager.RemoveAsync("value-collection");

    using (var transaction = this.StateManager.CreateTransaction())
    {
        var concurrentQueue = await this.StateManager
            .GetOrAddAsync<IReliableConcurrentQueue<long>>("value-collection");

        foreach (var i in migrateValues)
        {
            await concurrentQueue.EnqueueAsync(transaction, i);
        }

        await applicationFlags.AddOrUpdateAsync(
            transaction,
            "queue-to-concurrent-queue-migration",
            true,
            (s, b) => true);
    }
    await transaction.CommitAsync();
}