【发布时间】:2018-10-12 08:35:57
【问题描述】:
我正在考虑使用面向服务的架构 (SOA) 构建应用程序。
这种架构不像微服务解决方案那样复杂和混乱(我认为),但我面临着类似的设计问题。想象一下,我有 ServiceA 类型的服务,它们将工作发送到 ServiceB 类型的服务。我想,如果我使用队列,那么负载平衡将不会成为问题(因为消费者将从队列中获取他们可以处理的内容)。但是队列往往会在代码中产生一些不良的异步性,需要额外的努力来修复。所以,我更倾向于在服务之间使用 HTTP 调用,使用 C# 的高效和惊人的async/await 特性。但这会在共享工作负载和检测饱和或失效的服务方面产生问题。
所以我的问题是:
- 是否有一个队列支持某种
async/await功能,并且其功能类似于 HTTP 调用,在您需要的地方返回结果,而不是在无法继续原始执行流程的回调中? - 如何在使用 HTTP 时对服务之间的流量进行负载平衡并检测不适合新分配的节点?我的意思是,我可能可以自己从头开始设计一些东西,但现在应该有一些标准的方法或库或框架来做到这一点。我在网上找到的最好的是this,但它是为微服务构建的,所以我不确定我是否可以毫无问题地使用它。
更新: 我现在发现了这个问题,它也要求等待队列:awaitable Task based queue ...并且还发现了 Kubernetes、Marathon 等。
【问题讨论】:
-
所有队列和调用都可以是异步的。这只是网络IO。问题是图书馆是否支持它,但很可能支持。另一个问题是你是否真的受限于线程。如果不是,异步 IO 的优势为零,但开发和性能成本。
-
如果您将每个服务置于负载均衡器之后,您只需调用 LB 端点。如果每个服务在服务过载的情况下拒绝额外的客户端请求,那么调用者可以很容易地检测到不可用的服务。短暂的超时也很有用。
-
我没有在队列顶部实现请求/回复的经验,但是您可以编写自己的异步代码来隐藏机制并使其像
await CallServiceByQueueAsync(...)一样简单。也就是说,如果您需要同步结果,队列似乎毫无意义。对负载平衡器的 HTTP 调用似乎更容易做到。 -
@usr 是的。我主要是在寻找队列的请求/回复功能。一个优点是,使用负载均衡器时,您必须在拒绝回复时回退到其他服务,而使用队列时,服务会在可以处理工作时接手工作。我觉得这可以通过减少调用次数或降低复杂性来节省时间,因为您没有负载均衡器来如此频繁地跟踪每个服务的状态。但似乎像 Kubernetes 这样的现有解决方案可以解决这个问题。不过,设计一个等待队列会很有趣。
标签: c# .net architecture load-balancing soa