服务结构服务是完全是单线程的吗?

时间:2016-09-30 22:19:46

标签: asp.net-web-api owin azure-service-fabric

我正试图掌握服务面料,我正在努力一点点。一些问题:

  • 是否所有服务结构服务实例都是单线程的?我创建了一个无状态的web api,一个实例,使用一个执行Task.Delay的方法,然后返回一个字符串。对此服务的两个请求是一个接一个地提供的,而不是同时提供的。那么我是否正确地认为可以提供的并发请求数量纯粹是应用程序清单中服务实例计数的函数? 编辑考虑到这一点,可能与设置OWIN Wep Api有关。难道它会被会话阻塞吗?我假设默认没有会话?

  • 我需要在服务结构中执行长时间运行的操作(可能需要几个小时)。我可以在服务面料中使用推荐的模式吗?这些当前使用触发webjob的存储队列进行处理。可能是Reliable Queues和RunAsync循环的东西?

3 个答案:

答案 0 :(得分:1)

您似乎处理了第一部分,因此我将对第二部分发表评论:“长期运行”。

我们可以看到长时间运行的操作/工作流程在服务结构出现之前就已处理完毕。出于这个原因,我们可以通过查看软件专家几十年来一直使用的设计模式来建立巨人的肩膀。例如,着名的全包Process Manager。请注意,这种模式有时候是一种矫枉过正。如果是你的情况,只需查看企业集成模式书中的其他相关模式(Gregor Hohpe)。

至于可靠集合的使用,在选择支持所选设计模式的数据结构时,这些是实现细节。

我希望有帮助

答案 1 :(得分:1)

关于你的第二点 - 这实际上取决于你长期任务的性质。

您的长时间运行任务是否是在依赖于本地OS / VM级别资源的隔离线程上运行的工作负载,并最终返回结果(A)?或者它是一种长期运行的任务,通过一系列持久的状态变化来构建结果模型(B)?

根据我对Service Fabric的理解,它并非真正用于运行长时间运行的工作负载(A),而是用于编写水平可扩展,高度可用的系统。

如果您非常热衷于使用服务结构(并且您的工作负载往往更像B而不是A),我肯定会找到一种方法来分解那些可以在整个集群中并行处理的长期运行任务。但即便如此,可能还有更适合的技术,例如Azure Batch?

P.S。如果要在RunAsync方法中放置一个长时间运行的进程,则应设计工作负载以使其可中断,并且可以以可从群集中的另一个节点恢复的方式保持其状态

  

在有状态服务中,只有主副本具有写访问权限   状态因此通常是在服务实际执行时   工作。有状态服务中的RunAsync方法仅在执行时执行   有状态服务副本是主要的。 RunAsync方法是   当主要副本的角色远离主要角色时取消,如   以及在关闭和中止事件期间。

P.s.s长时间运行操作是尝试编写可伸缩系统时的恶魔。现在尝试解决这个问题,并在可能的情况下为自己避免未来的痛苦。

答案 2 :(得分:0)

至于第一点 - 这纯粹是一个客户问题。 Chrome认为我的请求是不确定的,因此延迟了第二个请求,直到第一个请求得到响应。改变请求的参数允许它们同时提供。