我正在开发一个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个节点上运行应用程序。
请建议什么是最好的方法。
答案 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之类的内容。