使用 Azure Service Fabric 构建微服务的权衡和最佳实践

Trade offs and best practices building microservices with Azure Service Fabric

我想构建一个基于 Azure Service Fabric 的微服务应用程序。对于一些有状态的服务或参与者,我想通过网络从外部访问状态 api.

此类 Service Fabric 项目在以下方面的一般权衡和最佳实践是什么:

  1. 在单个应用程序中使用一项服务还是多项服务?因此,如果我为每个应用程序使用一项服务,我的项目就会有多个应用程序。什么时候每个应用程序使用一项服务有用?

  2. 在单一服务中使用一个与多个参与者?什么时候每个服务有多个 actor 有用?

  3. 为整个项目使用一个无状态 Web api 服务与为每个有状态服务或每个应用程序使用多个无状态 Web 服务?

我知道这些决定是基于具体的项目。但或许以上三点总有优缺点。

权衡不同的选项是一个棘手的问题,因为它们不一定相互排斥,但这里是您提到的一些要点的开始,而且我知道这不一定能解决您的问题Service Fabric 问题,但我希望它仍然有用。

从代码的角度来看,微服务环境很棒,它让开发人员的生活变得轻松。通过将功能集中到一项服务,这意味着他们可以专注于问题,而无需考虑不必要的依赖性。例如,如果您要将所有方法分组在一个项目中,并且您必须更改接口,您可能会决定创建一个新的端点。在此示例中,您可能必须考虑未更改方法的消费者,我们是否要强制他们提升,或者我们是否乐于让他们指向以前的版本,但当然您支持多个版本。

最大的问题是微服务滋生了孤立的知识,并且通过采用一种服务的开发人员不需要知道谁或什么正在使用它的方法,这意味着您无法回答通常非常重要的事情谁或什么在消费这项服务的问题,我们是否需要强迫他们提升到一个新的终点。实际上,这可能会使您的网络服务器变得有些混乱,因为旧服务正在敲打不需要的东西。

无论您的解决方案是什么,我总是会尝试对您的逻辑进行分组,并将类似的方法放在同一个项目中。我认为你必须接受你在没有完全了解解决方案未来将如何发展的情况下做出决定,因此你可能不得不重新考虑。

另一个考虑因素是需求管理和并行开发。使用微服务,您可能比使用单一服务更容易管理业务需求。假设您收到 10 项要求,并被要求在下个月交付 5 项,并在下个月交付另外 5 项。例如,前 5 个需求集中在业务逻辑 a 中,下一批需求集中在业务逻辑 b 中,如果你有两个开发人员,你可以让他们并行处理这个问题,而无需分支和合并。这显然是一个很好的例子来说明这一点,但是如果它们被拆分到不同的服务上,这是一个相对容易的对话,因为很容易向业务人员说您的业务逻辑 A 更改需要一起进行。

有状态的网络服务可能很难快速测试,诚然你可以绕过这个但我总是喜欢能够发出请求服务并获得响应,如果我必须准备事情它会减慢我的速度,这可以在诊断现场问题时感到沮丧。

Simon Houlton 在他的回答中很好地涵盖了 trade-offs 围绕微服务的问题,因此这里有一些专门针对您的 Service Fabric 问题的答案:

  1. 应用程序是服务的分组结构。从理论上讲,协同工作以产生一组内聚功能或完成单个业务目标的服务通常被分组到一个应用程序中。在实践中:

    • 在应用程序级别应用升级。一般需要一起升级的服务应该在同一个应用中。但是您仍然可以单独升级应用程序内的服务。
    • 运行状况在应用程序级别汇总,因此您可以获得应用程序内服务的all-up运行状况概览。
    • Visual Studio 工具使得使用具有多个服务的应用程序变得非常容易。
  2. 通常一个服务承载一个参与者类型的多个实例。换句话说,您通常将一个 actor type 映射到一种服务类型。然后您可以在服务中实例化该参与者类型的多个实例。

  3. 取决于你真正想要什么。无状态服务在做什么?如果您的用户需要一个入口点,那么您应该为整个项目准备一个无状态 Web api。这很标准。也许你有第二个无状态服务在不同的端口上监听,只是为了管理员之类的。如果每个有状态服务都有一个无状态 Web api 服务,那么您必须担心将用户路由到正确的无状态服务。