Service Fabric如何选择托管服务的端口?

时间:2017-06-12 16:08:39

标签: c# azure azure-service-fabric grpc service-fabric-stateful

我正在使用C#在Service Fabric上实现GRPC。 GRPC服务器需要ServerPort(负责将ssl凭证绑定到端口)和服务定义(负责在路径上映射请求到方法委托)。我做了一个通信监听器,它报告分区和副本ID以及FQDN:端口。这允许客户端正确地确保其与正确的分区/副本进行通信。我在服务mainifest中声明了一个Endpoint资源,并将端口留空,表示我希望service fabric分配一个随机端口。我在本地开发中遇到的问题(我还没有把它推到天蓝色的集群中)是复制品似乎死了,因为它们被分配了相同的端口。我还应该注意,我告诉听众听二级副本。

我的问题是:

  1. 服务架构如何选择一个端口来托管服务副本?
  2. 辅助副本的端口共享问题只是我在同一台机器上的本地开发的问题吗? (我假设真实集群中的副本将放置在不同的故障/升级域上)

1 个答案:

答案 0 :(得分:1)

Service Fabric保留应用程序端口范围,该范围在群集设置中定义(如果您在Azure中托管,则在资源管理器模板中)。当您将端口空白留在端点资源中时,SF将从此范围中选择尚未分配给计算机上其他服务的端口。

需要注意的重要一点是,端口分配是每个主机进程,默认的host process mode共享主机进程,其中的副本是相同的服务类型可以共享主机进程。在这种情况下,同一主机进程中的副本将获得相同的端口。

有几种方法可以解决这个问题:

  1. 使用支持端口共享的网络堆栈。在Windows上,您拥有Windows HTTP Server API(由HttpListener使用,以及在其上构建的任何内容,例如Katana)和WCF。
  2. 使用exclusive host processes代替,在这种情况下,每个副本都有自己的主机进程,因此也有自己唯一的端口。进程隔离还具有许多其他好处(例如,如果副本崩溃主机进程,它不会使其中的其他副本失效),代价是机器上的资源消耗增加。