标签: service-fabric-stateful

发现System.Net.Http之间存在冲突

我的VS解决方案中有几个项目.每当我将"System.Net.Http"NuGet包添加到它显示为4.2.0.0版本的包时.然后我也这样做并添加相同的NuGet包,然而,另一个说版本.4.1.1.2

在此输入图像描述 在此输入图像描述

然后我收到警告:

发现System.Net.Http之间存在冲突

EDIT1:

Gathering dependency information took 1.7 sec
Attempting to resolve dependencies for package 'System.Net.Http.4.3.3' with DependencyBehavior 'Lowest'
Resolving dependency information took 0 ms
Resolving actions to install package 'System.Net.Http.4.3.3'
Resolved actions to install package 'System.Net.Http.4.3.3'
Retrieving package 'System.Net.Http 4.3.3' from 'nuget.org'.
Adding package 'System.Net.Http.4.3.3' to folder 'C:\...Service\packages'
Added package 'System.Net.Http.4.3.3' to folder 'C:\...Service\packages'
Added package 'System.Net.Http.4.3.3' to 'packages.config'
Successfully installed 'System.Net.Http 4.3.3' to ....Service
Executing nuget actions took 2.05 sec
Time Elapsed: 00:00:03.8937113
Run Code Online (Sandbox Code Playgroud)

请注意安装了正确的版本,但是=> Props =>版本说4.1.1.2

在此输入图像描述

.net c# nuget service-fabric-stateful

22
推荐指数
5
解决办法
2万
查看次数

升级到SDK 2.3.301后,Service Fabric Actor或Service变为无法访问

从Service Fabric SDK 2.0.135升级到2.3.301之后,我们开始遇到Service Fabric actor或服务无法在Service Fabric Explorer中显示为健康状态的情况.一旦处于此状态,通过ActorProxy或ServiceProxy对actor或服务的任何调用将挂起5分钟,最后给出TimeoutException.一旦处于这种状态,演员或服务就不会自行恢复 - 即使离开一小时.唯一的解决方案是重置actor或服务所在的节点,重新部署actor或服务(完全相同的EXE),重置整个集群或重新引导所有集群计算机.

在部署或重新部署SF应用程序后,它通常会进入此状态.

在使用Service Fabric的最后一年(从SDK v1.3开始),我们从未遇到过这个问题.它仅在移至2.3.301之后才开始.

它似乎随机而且不一致.我们解决方案中的13个SF应用程序中的哪个应用程序也是随机的.

有没有人对我们如何解决这个问题有任何想法?这似乎是Service Fabric最新版本中的一个错误,但也许我们在最后做错了.

任何帮助表示赞赏.

下面是很多额外的信息,我希望这些信息有助于理解我们在这个问题上面临的问题.

非常感谢

脚步

我真的没有采取措施来始终如一地重现这个问题.这就是我有时观察到的.

  1. 我编译然后从Visual Studio重新部署我的SF项目(Debug - > Start Without Debugging)
  2. Visual Studio说它成功部署了该项目
  3. Service Fabric Explorer将我的所有服务显示为Healthy,包括Data-Binding
  4. 有问题的SF项目有2个参与者,它们是单个EXE的一部分.Service Fabric Explorer显示在不同节点上运行的每个actor.
  5. Windows任务管理器显示EXE的两个运行副本,这是有道理的,因为有两个节点运行EXE.

同样,我们的QA在使用PowerShell直接部署到Azure后遇到了问题.(他不从Visual Studio部署.)

回顾一下

  • Visual Studio表示部署成功
  • Service Fabric Explorer显示一切都很健康
  • 任务管理器显示EXE的两个运行副本

当我看到失败

我有一个SF服务使用ServiceProxy或ActorProxy类调用另一个SF服务.我们在整个解决方案中实现了这一目标,结合了13种不同的应用程序和约25种不同的服务和参与者.自从我们于2015年11月开始使用Service Fabric SDK v1.3以来,它已经成功运行.

现在,在升级到2.3.301之后,我们定期出现一个随机Actor或Service进入一种状态,当从ServiceProxy或ActorProxy调用时,它无法响应对方法的调用.挂起5分钟后,我们收到System.Timeout异常,并显示以下消息:

如果在服务繁忙或其长时间运行操作时丢弃消息并且花费的时间超过配置的操作超时,则会发生这种情况.

请注意,该服务不忙,也不执行长时间运行.作为演员,该服务根本不进行任何正在进行的操作.它只是暴露了其他服务可以使用的公共方法.它从第一次调用失败.

实际上,跟踪向我们表明,即使是actor中方法的第一行也永远不会被调用.就像Service Fabric通信基础设施无法传递消息一样.

什么时候开始

在过去的12个月里,我们从未见过这个问题.

现在,自上周升级Service Fabric以来,我们经常在各种条件下看到这个问题.

我们升级到Service Fabric SDK 2.3.301.9590和Service Fabric 5.3.301.9590.

起初,团队中的每个开发人员都独立地遇到了这个问题,每个人都认为这只是我们机器的一个短暂问题.Service Fabric确实存在一些问题,所以我们接受这个并继续前进.但后来我们开始互相抱怨,意识到我们都在看到它.即便是我们的QA也会在我们的环境中看到它即将投入生产.

同样,这只是在我们上周升级到Service Fabric的最新版本时才开始的.

以前,我们运行的是Service Fabric SDK 2.0.135.

我们通过安装SDK v 2.3.301升级了我们的代码库,打开了我们的每个解决方案并允许Visual …

c# azure visual-studio-2015 azure-service-fabric service-fabric-stateful

14
推荐指数
1
解决办法
2685
查看次数

在服务结构中获取错误"应用程序URL未设置或不是HTTP/HTTPS URL,因此浏览器不会打开到应用程序"

尝试在服务结构群集中运行我的服务时,"输出"窗口会显示

"应用程序URL未设置或不是HTTP/HTTPS URL,因此浏览器不会打开到应用程序".

我错过了配置步骤吗?

azure azure-service-fabric service-fabric-stateful

12
推荐指数
2
解决办法
6800
查看次数

Service Fabric Stateful Service Remoting V2

我在Visual Studio 15.4上运行的.Net Standard Asp.net Core 2.0中有一个无状态服务调用的状态服务.我无法使Service Remoting V2工作.

旧的代码,对V1的工作状态服务是无效的

  protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
    {
        return new List<ServiceReplicaListener>()
            {
                new ServiceReplicaListener((context) =>this.CreateServiceRemotingListener(context))
            };
Run Code Online (Sandbox Code Playgroud)

我尝试按照本教程,但示例是针对无状态的.

我试图改变这里的代码没有成功.

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
    {
        return new List<ServiceReplicaListener>()
            {
                new ServiceReplicaListener((c) =>new FabricTransportServiceRemotingListener(c, this))
            };
    }
Run Code Online (Sandbox Code Playgroud)

此外,没有关于如何或在何处使用本教程中此代码的说明

var proxyFactory = new ServiceProxyFactory((c) =>
   {
       return new FabricTransportServiceRemotingClientFactory();
   });
Run Code Online (Sandbox Code Playgroud)

我被卡住了,有人能告诉我如何让它发挥作用吗?

azure-service-fabric service-fabric-stateful

9
推荐指数
1
解决办法
3445
查看次数

分区是法定人数损失

我有一个Service Fabric应用程序,它具有无状态Web api和带有两个分区的有状态服务.无状态web api定义了一个web api控制器,用于ServiceProxy.Create获取有状态服务的远程代理.远程调用将消息放入可靠的队列中.

有状态服务将每隔X分钟从队列中出列消息.

我正在查看Service Fabric资源管理器,过去几天我的应用程序一直处于错误状态.当我深入了解详细信息时,有状态服务会出现以下错误:

错误事件:SourceId ='System.FM',Property ='State'.分区是法定人数损失.

看看资源管理器,我看到我的主副本启动并运行,它看起来像一个ActiveSecondary,但其他两个副本显示IdleSecondary,它们继续进入Standby/In Build状态.我无法弄清楚为什么会这样.

我的其他辅助人员未能进入ActiveSecondary状态导致法定人数减少的原因是什么?

在此输入图像描述

azure-service-fabric service-fabric-stateful

6
推荐指数
1
解决办法
5158
查看次数

将Visual Studio中的C#Stateful Service Fabric应用程序部署到Linux

编辑04/06/18 =>更新了上次状态的问题


所以我有这个工作.Net 4.6状态服务,目前在我部署在Azure上的Windows Service Fabric集群上运行.

从2017年9月开始,我应该可以转到Linux:https://blogs.msdn.microsoft.com/azureservicefabric/2017/09/25/service-fabric-6-0-release/

所以我试图在Linux上部署它,这样我就可以节省成本.

  1. 首先,我将所有代码从.Net 4.6迁移到.Net Core 2.0.现在我可以毫无问题地编译我的二进制文件.我基本上创建了新的.Net Core项目,然后将我的所有源代码从.Net 4.6项目移动到新的.Net Core项目.

  2. 然后我更新了我的Service Fabric应用程序.我从我的sfproj中删除了以前的SF服务,然后我添加了新的.Net Core服务.

在此输入图像描述

看起来有一个警告(虽然输出窗口上没有任何内容),但无论如何,如果我尝试通过Service Fabric Tools 2.0(beta)提供的模板使用.Net core 2.0创建一个新的空Statful服务,它就在这里:

在此输入图像描述

所以我会忍受它.

  1. 在我的开发机器上,我修改了包含我的有状态服务的2个csproj项目,以便它们可以作为Windows可执行文件在本地运行.我用过win7-x64 runtimeIdentifier.

在我的Windows机器上本地运行我的SF群集很好.

  1. 然后我稍微改变了以前用于Linux的csproj文件.我使用的是ubuntu.16.10-x64 runtimeIdentifier.

我还更改了ServiceManifest.xml文件以定位与linux兼容的二进制文件:

  <!-- Code package is your service executable. -->
  <CodePackage Name="Code" Version="1.9.6">
    <EntryPoint>
      <ExeHost>
        <Program>entryPoint.sh</Program>
      </ExeHost>
    </EntryPoint>
  </CodePackage>
Run Code Online (Sandbox Code Playgroud)

entryPoint.sh 是最终执行的基本脚本:

dotnet $DIR/MyService.dll
Run Code Online (Sandbox Code Playgroud)
  1. 然后我从Visual Studio成功部署到我的安全SF Linux集群.不幸的是,我的状态服务有以下错误:

在此输入图像描述

错误事件:SourceId ='System.Hosting',Property ='CodePackageActivation:Code:EntryPoint'.CodePackage激活期间出错.服务主机以退出代码终止:134

看起来我的二进制文件在启动时崩溃了.所以这是我的问题:

  • 从Visual Studio在Linux上部署C#.Net Core SF有状态服务的方法是否正确?

编辑:查看LinuxsyslogVer2v0表,我收到以下错误:

starthost.sh [100041]:未处理的异常:System.IO.FileLoadException:无法加载文件或程序集'System.Threading.Thread,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

我发现下面的错误报告: …

c# linux azure azure-service-fabric service-fabric-stateful

6
推荐指数
1
解决办法
916
查看次数

如何从现有备份恢复可靠服务状态?

我有一个有状态服务,根据相应的文档实现了备份逻辑

就像这样:

protected override async Task RunAsync(CancellationToken cancellationToken)
{
  // ...

  while (true)
  {
    cancellationToken.ThrowIfCancellationRequested();
    BackupDescription myBackupDescription = new BackupDescription(BackupOption.Full, this.BackupCallbackAsync);
    await this.BackupAsync(myBackupDescription);

    // ...

    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
  }
}

private async Task<bool> BackupCallbackAsync(BackupInfo backupInfo, CancellationToken cancellationToken)
{
  var backupId = Guid.NewGuid();
  // backup files copied to external storage here ...
  return true;
}
Run Code Online (Sandbox Code Playgroud)

文档只建议了一种恢复备份的OnDataLossAsync方法-方法。但是我不能激发对这个方法的调用。

所以,问题是:如果数据完全丢失,我如何从备份中恢复服务状态?

例如,所有 Service Fabric 集群节点都已被销毁。我唯一拥有的是我的备份。重新部署后我应该怎么做才能恢复我的服务状态?

我检查DataLog服务织物集群管理器的目录,但数据格式似乎是比较不同的备份。

c# azure azure-service-fabric service-fabric-stateful

5
推荐指数
1
解决办法
780
查看次数

为什么我的 Service Fabric 参与者使用比预期更多的磁盘空间?

我试图理解为什么我们的演员服务使用的磁盘空间比预期的多。我们的服务目前包含分布在 10 个分区上的大约 80,000 个参与者。每个参与者存储大约 150Kb 的状态。

查看我们集群中的一个(10 个)节点,我希望看到:

  • 用于大约 3 个分区的磁盘空间(一个作为主分区,两个作为辅助分区)
    • 这是预期的
  • 深入到一个分区文件夹中,我希望只看到一个副本 ID
    • 不像预期的那样:
      • 我看到了预期的一个(与 Service Fabric Explorer 中节点部分下列出的副本匹配的那个)。副本 ID 以前缀为前缀R_
      • 在同一个分区文件夹中,我看到其他 3 个文件夹的副本 ID 以 prefix 开头S_。这些副本 ID 与 Service Fabric Explorer 中“应用程序”节点下列出的任何值都不匹配。
  • 查看以 R_ 开头的副本文件夹,我希望该文件夹包含不超过 8000 个演员的大小,每个演员占用大约 150 Kb,因此大约 1.14 Gb 的数据。
    • 不像预期的那样:
      • 该文件夹包含一个文件ActorStateStore,其大小为 5.66Gb

我试图理解的另一件事如下:

  • 我们应用程序的版本 1 没有清理未使用的 actor。正如您所料,我们看到每个节点上的磁盘使用量稳步增长。
  • 我们应用程序的第 2 版开始删除未使用的角色。由于此新代码将超过一半的活跃参与者,因此部署后我预期总体使用的磁盘大小将显着下降。
    • 没有发生,增长停止了,但使用量并没有减少。

所以我的问题是:

  1. 我的期望是否正确?
  2. 什么可以解释我的观察?

azure-service-fabric service-fabric-stateful service-fabric-actor

5
推荐指数
1
解决办法
741
查看次数

ProtoBuf-Azure服务结构

我正在寻找替换ASF中RPC的默认序列化器。这涉及实现一些接口,其中一个接口在通过RPC进行通信的服务之间传递

 public interface IServiceRemotingResponseMessageBody
  {
    void Set(object response);

    object Get(Type paramType);
  }
Run Code Online (Sandbox Code Playgroud)

由于实现需要可序列化,因此显而易见的ProtoBuf实现类似于

    [ProtoContract]
    public class ProtoBufRemotingResponseBody : IServiceRemotingResponseMessageBody
    {
        [ProtoMember(1)]
        public object Value { get; set; }

        public void Set(object response)
        {
            Value = response;
        }

        public object Get(Type paramType)
        {
            return Value;
        }
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这失败了

没有为类型定义序列化器:System.Object

这里有解决方法吗?System.Object的没有合同,但开箱即用的DataContract串行器可以,如可以MessagePack 这里,但这些都不是系统化它可以创建时的版本头痛可靠的集合。我试过使用常见的基本类型,但Value可以是IEnumerable<T>T等。

有人可以帮忙吗?谢谢,KH

protobuf-net protobuf-csharp-port azure-service-fabric service-fabric-stateful

5
推荐指数
1
解决办法
306
查看次数

客户端正在尝试连接Service Fabric ServiceProxy上的无效地址

我在Service Fabric 6上有一个Asp.net Core 2.0无状态服务和一个Asp.net Core 2.0状态服务,有10个分区计数.

我按照本教程

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-add-a-web-frontend

我遵循所有步骤,除了我在Visual Studio中使用模板,其中CreateServiceReplicaListeners使用KestrelCommunicationListener

 protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
    {
        return new ServiceReplicaListener[]
        {
            new ServiceReplicaListener(serviceContext =>
                new KestrelCommunicationListener(serviceContext, (url, listener) =>
                {
                    return new WebHostBuilder()
                                .UseKestrel()
                                .ConfigureServices(
                                    services => services
                                        .AddSingleton<StatefulServiceContext>(serviceContext)
                                         .AddSingleton<IReliableStateManager>(this.StateManager))
                                .UseContentRoot(Directory.GetCurrentDirectory())
                                .UseStartup<Startup>()
                                .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
                                .UseUrls(url)
                                .Build();
                }))
        };
    }
Run Code Online (Sandbox Code Playgroud)

当我使用以下代码在Asp.net Core 2.0无状态服务中调用我的服务时:

var service = ServiceProxy.Create<IStorageService>(new Uri("fabric:/MyCluster/Storage"), new ServicePartitionKey(Fnv1aHashCode.Get64bitHashCode(User.Id)));
await service.MyMethod();
Run Code Online (Sandbox Code Playgroud)

调用"MyMethod"时会出现异常

客户端试图连接到无效的地址的http://本地主机:58352 /等 ..

异常中存在的URL存在于Service Fabric Explorer中,并且Port和PartitionKey是正确的.ServiceManifest中没有设置端点,因为有状态服务基本上只是添加了IService接口和MyMethod方法的模板,如上所述.

我在这里缺少什么?Asp.net Core 2.0的文档不是最新的.

我试图不使用分区,设置 ServicePartitionKey(0)但结果相同.

我不知道该怎么办.

azure-service-fabric service-fabric-stateful

4
推荐指数
1
解决办法
708
查看次数