【问题标题】:Migration to Azure Service Fabric - Architectural considerations迁移到 Azure Service Fabric - 架构注意事项
【发布时间】:2016-12-29 19:33:53
【问题描述】:

我们从 2010 年开始使用 Azure,并从我们应用程序的性能和可靠性中受益匪浅。 Azure 提供了很多企业级服务,我认为新的“Azure Service Fabric”很棒。

通过阅读文档,我无法理解将“旧”云服务迁移到新 Service Fabric 的方法。我们为什么要迁移?用于水平缩放和更高的可靠性。

目前我们有一个单实例云服务,它启动了很多子服务。这些子服务非常适合微服务。唯一的问题是这些子服务中的一些是“运行者”,即它们只是在我们的用户数据库上循环并决定是否必须为特定用户运行操作(服务)。 考虑到可能有多个实例运行此服务,您将如何迁移此类服务?

谢谢

【问题讨论】:

    标签: azure architecture azure-service-fabric


    【解决方案1】:

    首先要记住的是,一旦服务启动,它就会一直运行,并且它的生命周期和正常运行时间由 Service Fabric 控制(例如:如果它崩溃,它将自动重新启动它)。要记住的第二件事是,您最终会同时运行多个服务实例(在不同节点上),因此它们最终会在集群的不同节点上执行完全相同的操作。

    您的第一个反应可能是为每个运行器“子服务”提供一个无状态服务类型/实例,该子服务保持运行并利用 RunAsync (https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-advanced-usage)。就个人而言,我不会采用这种方法,因为这可能需要在服务之间进行某种同步以防止无用的并发,因为它们独立地做完全相同的事情。

    更好的方法是让您的运行器服务在充当协调器的“主”服务请求时只运行一次,您可以采用基于队列的方法,其中“主”服务提交任务(消息)由运行者处理,他们在同一个队列上同时侦听,确保最多一个服务实例可以完成任务。

    对于队列,请考虑服务总线或可靠并发队列 (https://docs.microsoft.com/enus/dotnet/api/microsoft.servicefabric.data.collections.preview.ireliableconcurrentqueue-1)。

    【讨论】:

    • 您好西蒙,感谢您的回复。您的想法与我对基于队列的子服务的想法完全一致。但问题仍然存在:“主要”服务应该是什么?我不能建模为 Service Fabric 服务,因为它会在不同的实例上成倍增加,结果是将相同的消息放在队列中。你会如何解决这个问题?
    • 这取决于,“主要”服务行为的触发因素是什么?是基于时间还是基于事件?请注意,您对现有云服务的水平扩展也有同样的担忧,
    • 是的,我知道!这就是为什么我试图了解我们应该花费多少精力来迁移到云服务。对于每个用户,主要服务通常是基于时间的。例如,每个用户必须每 X 分钟与 Web 服务进行通信(其中 X 是基于用户的变量)。与 web 服务的通信被封装在一个侦听队列的“子服务”中。我不知道如何为这种每 X 分钟输出一次消息的“主要”服务建模。
    • 我会尝试使用 Actors: 1) 创建一个无状态服务来为进入您的 Web 服务的 HTTP 请求提供服务。 2) 每次调用 Web 服务时,更新一个代表您的用户的 Actor,并为该用户维护一个计时器或提醒,只要完成新的 Web 服务调用,该计时器或提醒就会重新启动。链接:3)在计时器到期时,排队等待您的跑步者服务处理的消息。
    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 2019-01-17
    • 2018-08-29
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2020-01-07
    • 2019-11-30
    相关资源
    最近更新 更多