服务结构是否为每个有状态分区创建单例实例?

时间:2018-06-19 11:53:00

标签: azure-service-fabric service-fabric-stateful

说我创建了一个有状态服务结构服务,该服务结构在5个节点的群集上具有5个分区。我看到每个节点每个节点得到1个分区。当我在VS中调试服务时,我注意到服务结构正在所有5个分区中创建5个有状态服务实例(每个分区实际上是1个静态实例)。客户端调用多少次无所谓,只有5个此类的实例可以处理来自其的请求。 以下说法正确吗?

  • 有状态服务中的任何类级别成员变量本质上都是静态的(因为它解析为该分区上的单例实例),因此在更新时需要“锁定”语义吗?

  • 由于客户端始终始终将给定分区解析为该类的“相同”实例,因此客户端可以重新使用“ proxy”实例吗?

  • 当许多客户端每秒调用同一服务实例数百次时,这种状态服务创建的“单例”模型如何影响性能和可伸缩性。 [重载下] 我了解在配置V2远程侦听器时存在一个设置,我们可以通过“ FabricTransportRemotingListenerSettings”指定“ MaxConcurrentCalls”。

2 个答案:

答案 0 :(得分:0)

这里有些误解:

实例不同于进程 ,当您说可以在Visual Studio上看到实例时,实际上看到的是进程。在某些情况下,您可以在一个流程中拥有多个实例,Visual Studio仅向您显示一个,但实际上有5个(在您的情况下)。这是由SF Hosting Model配置定义的,您在其中定义了行为方式,我已经回答了相关问题here #1here #2

另一个是 无状态服务具有实例,有状态服务具有分区和副本 。基于此,您看到的不是实例,它们是主副本(如果您定义复制> 1,则可能是辅助副本)。在文档here

中查看更多详细信息

鉴于先前的详细信息,当您对服务进行分区时,根据您使用的托管模型,它可以在同一进程中创建多个副本,或者在每个进程中创建一个副本。

这一切只有一个问题,来自同一分区的副本数每个节点受1个限制,有关此的更多信息,请查看this issue on github

关于您的问题:

  

没有多少次客户拨打电话,只有5个实例   这个类别的服务对象。以下是陈述   是真的吗?

不!

如果您正在谈论对ASP.NET终结点的请求或远程调用,这不会影响实例数,实例由SF配置定义,并且客户端请求不会影响它,它将在可用实例之间分配取决于您如何平衡这些请求。这些请求将影响实例计数的唯一方法是在服务中定义自动缩放功能。

当启动您的Stateless \ Stateful服务的新实例\副本时(在同一进程内或之外),将创建一个新对象。对这些服务的调用可能总是指向同一个对象,但并非总是如此,因为SF可能会重新平衡您的服务并杀死这些实例,以在其他地方或发生故障时创建新实例。

还有状态服务的情况,除非您指定对次要副本的读取,否则调用只会转到主副本。如果将辅助服务器提升为主要服务器,则新呼叫不会重定向到以前的主要副本。集群维护和应用程序更新很常见。

  

有状态服务中的任何类级别成员变量本质上都是静态的(因为它解析为该实例上的单例实例   分区],因此在更新时需要“锁定”语义吗?

如果使用共享托管模型,则所有静态对象将与同一进程中的任何实例共享。

  

由于客户端始终解析为类的“相同”实例   对于给定的分区,客户端可以一直使用“代理”   实例?

根据先前的答案,是的,任何单例课程将被共享。

  

这种有状态服务创建的“单一”模型如何影响   许多客户端调用同一服务时的性能和可伸缩性   实例每秒数百次。 [重载下]我了解   配置V2远程侦听器时存在一个设置   我们可以通过以下方式指定“ MaxConcurrentCalls”   “ FabricTransportRemotingListenerSettings”。

我在这里无法正确理解问题,也许以前的答案可能会为您解决,如果没有,请在下面留下评论,我会进行更新。

答案 1 :(得分:0)

Microsoft的确认。服务结构确实为每个分区创建1个“可靠服务”实例。此“单例”实例将为所有客户端远程处理/ http调用提供服务。如果副本发生故障转移,将创建一个新实例。