mar*_*net 5 azure azure-service-fabric
我是服务架构的新手,并开始查看有关该主题的MSDN文章.我首先在这里实现了Hello World示例.
我将他们原来的RunAsync实现更改为:
var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<int, DataObject>>("myDictionary");
while (!cancellationToken.IsCancellationRequested)
{
DataObject dataObject;
using (var tx = this.StateManager.CreateTransaction())
{
var result = await myDictionary.TryGetValueAsync(tx, 1);
if (result.HasValue)
dataObject = result.Value;
else
dataObject = new DataObject();
//
dataObject.UpdateDate = DateTime.Now;
//
//ServiceEventSource.Current.ServiceMessage(
// this,
// "Current Counter Value: {0}",
// result.HasValue ? result.Value.ToString() : "Value does not exist.");
await myDictionary.AddOrUpdateAsync(tx, 1, dataObject, ((k, o) => dataObject));
await tx.CommitAsync();
}
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)
我还介绍了一种DataObject类型,并在该类型上公开了UpdateDate属性.
[DataContract(Namespace = "http://www.contoso.com")]
public class DataObject
{
[DataMember]
public DateTime UpdateDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序(Visual Studio 2015中的F5)时,在字典中找不到dataObject实例(键入为1),因此我创建了一个,设置UpdateDate,将其添加到字典并提交事务.在下一个循环期间,它找到dataObject(键入为1)并设置UpdateDate,更新字典中的对象并提交事务.完善.
这是我的问题.当我停止并重新启动服务项目(Visual Studio 2015中的F5)时,我希望在RunAsync的第一次迭代中,将找到dataObject(键入为1),但事实并非如此.我希望所有的国家都被冲到它的复制品上.
我是否必须为有状态服务执行任何操作才能将其内部状态刷新到其主副本?
从我读过的内容来看,它听起来好像所有这些都是由服务结构处理的,并且调用commit(在事务上)就足够了.如果我找到主副本(在Service Fabric Explorer-> Application View中),我可以看到RemoteReplicator_xxx LastACKProcessedTimeUTC在我提交事务后(当单步执行时)更新.
任何帮助是极大的赞赏.
谢谢!
-标记
这是 Visual Studio 中默认本地开发体验的功能。如果您在按 F5 后仔细观察“输出”窗口,您将看到如下消息:
部署脚本检测到存在已注册的相同类型和版本的现有应用程序,因此会将其删除并部署新的应用程序。在此过程中,与旧应用程序关联的数据将被删除。
您有几种选择来处理这个问题。
在生产中,您将执行应用程序升级以安全地推出更新的代码,同时维护状态。但是,在开发盒上进行快速迭代的同时不断更新版本可能会很乏味。
另一种方法是将项目属性“启动时保留数据”翻转为“是”。这将自动升级生成的应用程序包的所有版本(不影响源中的版本),然后代表您执行应用程序升级。
请注意,由于升级路径中固有的一些系统检查,此部署选项可能比默认的删除和替换要慢一些。然而,当您考虑重新创建测试数据所需的时间时,您会发现这通常是一次浪费。
归档时间: |
|
查看次数: |
1939 次 |
最近记录: |