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