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

Posted

技术标签:

【中文标题】服务结构服务完全是单线程的吗?【英文标题】:Are service fabric services entirely single-threaded? 【发布时间】:2017-02-09 14:01:31 【问题描述】:

我正在努力掌握服务结构,但我有点挣扎。一些问题:

所有服务结构服务实例都是单线程的吗?我创建了一个无状态的 web api,一个实例,使用一个执行 Task.Delay 的方法,然后返回一个字符串。对该服务的两个请求一个接一个地被处理,而不是同时处理。那么我是否正确地认为可以服务的并发请求数纯粹是应用程序清单中服务实例计数的函数? 编辑 想一想,大概是和OWIN Wep Api的设置有关。会不会是被会话阻塞了?我假设默认情况下没有会话?

我需要在服务结构中执行长时间运行的操作(这可能需要几个小时)。我可以在服务结构中使用推荐的模式吗?这些当前使用触发 Web 作业的存储队列来处理。也许有 Reliable Queues 和 RunAsync 循环?

【问题讨论】:

【参考方案1】:

看来您处理了第一部分,所以我将评论第二部分:“长时间运行的操作”。

我们可以看到在 Service Fabric 出现之前就已经处理了长时间运行的操作/工作流。出于这个原因,我们可以通过查看软件专家几十年来一直使用的设计模式来建立巨人的肩膀。比如著名的包罗万象的Process Manager。请注意,这种模式有时过于矫枉过正。如果是您的情况,只需查看 Enterprise Integration Patterns book(Gregor Hohpe 撰写)中的其余相关模式。

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

希望对你有帮助

【讨论】:

【参考方案2】:

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

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

根据我对 Service Fabric 的了解,它并不是真正为运行长时间运行的工作负载 (A) 而设计的,而是更适合编写可水平扩展的高可用性系统。

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

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

在有状态服务中,只有主副本对 状态,因此通常是在服务执行实际时 工作。有状态服务中的 RunAsync 方法仅在以下情况下执行 有状态服务副本是主要的。 RunAsync 方法是 当主副本的角色从主副本更改时取消,如 以及在关闭和中止事件期间。

P.s.s 尝试编写可扩展系统时,长时间运行的操作是魔鬼。现在尝试解决这个问题,如果可能的话,可以为自己避免未来的痛苦。

【讨论】:

这些进程更像 B。但是它们主要涉及 IO 和一个非常快乐的服务 (SharePoint Online)。所以我限制了我可以使处理并发多少。这些任务也是由用户启动的,因此不是真正的批处理。【参考方案3】:

首先,这纯粹是客户问题。 Chrome 认为我的请求是相同的,因此延迟了第二个请求,直到第一个得到响应。改变请求的参数允许它们同时被服务。

【讨论】:

以上是关于服务结构服务完全是单线程的吗?的主要内容,如果未能解决你的问题,请参考以下文章

[UE4]UE4是单线程的吗?

redis特点单进程单线程高性能服务器,Redis为什么是单线程?高并发响应快?

redis特点单进程单线程高性能服务器,Redis为什么是单线程?高并发响应快?

redis特点单进程单线程高性能服务器,Redis为什么是单线程?高并发响应快?

node真的是单线程模式吗

netty4的udp服务端怎么是单线程