向在Service Fabric Cluster中的特定节点上运行的ASP.Net Core Web API发送请求

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

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

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

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

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

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

第一步 :第一次调用API时,可以生成GUID(或在DB中插入)并将此消息放入队列(即:Service Bus),然后将GUID返回给调用者。

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

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

  • 在multithreading版本中,您必须管理并发性以获得更好的性能,您可能必须考虑内存,CPU,磁盘等,否则您可能会在单个节点中承受过多的负载。

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

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

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

你需要一些存储才能做到这一点。

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

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