2

我正在开发一个 Service Fabric 应用程序,我在其中运行包含一堆 ASP.NET Core Web API 的应用程序。现在,当我在配置有 5 个节点的本地 Service Fabric 集群上运行我的应用程序时,该应用程序成功运行,并且我能够发送公开的 Web API 的发布请求。实际上,我想通过对该特定节点上公开的 API 的不同发布请求来命中在同一集群节点上运行的代码。

为了进一步解释,例如在节点“0”上公开了一个接受发布请求并执行作业的 API,还有一个中止正在运行的作业的 API。现在,当我请求执行作业时,它开始在节点“0”上执行,但是当我尝试中止作业时,服务结构集群将请求转发到另一个节点,例如节点“1”。结果我无法中止正在运行的作业,因为节点“1”上没有可用的正在运行的作业。我不知道如何处理这种情况。

对于状态,我使用的是 ASP.Net Core Web API 类型的无状态服务,并在本地服务结构集群的 5 个节点上运行该应用程序。

请建议什么应该是最好的方法。

4

2 回答 2

2

您的问题是因为您正在运行 API 来执行 Worker 任务。

您应该使用您的 API 在后台(Process\Worker)中安排工作并向用户返回令牌或操作 ID。用户将使用此令牌来请求状态或取消任务。

第一步:当您第一次调用您的 API 时,您可以生成一个 GUID(或插入 DB)并将此消息放入队列(即:服务总线),然后将 GUID 返回给调用者。

第二步:一个工作进程将在您的集群中运行,侦听来自该队列的消息,并在消息到达时处理这些消息。您可以将其设为在循环中逐条处理消息的单线程服务,或者将其设为对每条消息使用一个线程处理多条消息的多线程服务。这将取决于您想要的复杂程度:

  • 在单线程侦听器中,要扩展应用程序,您必须跨越多个实例,以便多个任务并行运行,您可以在 SF 中使用简单的 scale 命令执行此操作,SF 将在您的可用节点上分发服务实例。

  • 在多线程版本中,您必须管理并发以获得更好的性能,您可能必须考虑内存、cpu、磁盘等,否则您将面临单个节点负载过多的风险。

第三步,取消:取消过程很简单,有很多方法:

  • 使用类似的方法并将取消消息排入队列
    • 您的服务将在单独的线程中侦听取消并取消正在运行的任务(如果正在运行)。
    • 使用不同的队列发送取消消息会更好
    • 如果运行多个侦听器实例,您可能会考虑使用主题而不是队列。
  • 使用缓存键存储作业状态并检查每次迭代是否已请求取消。
  • 包含作业状态的表,您可以在其中检查每次迭代,就像使用缓存键一样。
  • 创建远程端点以直接调用服务并触发取消令牌。

有很多方法,这些都很简单,您可以结合使用多种方法来更好地控制您的任务。

于 2018-02-05T15:55:11.133 回答
0

你需要一些存储空间来做到这一点。

创建一个表(例如JobQueue)。在开始处理作业之前,您将存储在数据库中,存储状态(例如Running,它可能是一个枚举),然后将 ID 返回给调用者。一旦您需要中止/取消作业,您可以从 API 调用 abort 方法,发送您想要中止的 ID。在 abort 方法中,您只需将作业的状态更新为Aborting。在第一个方法(运行作业)中,您需要在一段时间内检查此表,如果它正在 aborting,那么您停止作业(并将状态更新为Aborted)。或者,您可以在作业中止或完成后从数据库中删除。

或者,如果您希望数据是临时的,您可以使用第六台服务器作为缓存服务器并将数据存储在那里。这个缓存服务器也可以是一个集群服务器,但是你需要使用类似Redis的东西。

于 2018-02-05T10:39:46.663 回答