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

时间:2018-02-05 10:08:54

标签: c# azure-service-fabric service-fabric-stateless

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

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

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

答案 1 :(得分:0)

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

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

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