在 5 API 次调用 return 后触发函数(在分布式上下文中)

Trigger a function after 5 API calls return (in a distributed context)

我女朋友在面试中被问到以下问题:

We trigger 5 independent APIs simultaneously. Once they have all completed, we want to trigger a function. How will you design a system to do this?

我女朋友说她会用flag变量,但是面试官显然不满意。

那么,有没有一种可以处理这种情况的好方法(在分布式环境中)?请注意,5 个 API 调用中的每一个都由不同的服务器进行,​​并且要触发的函数在第 6 个服务器上。

如果有人问我这个问题,我的第一个想法是使用 promises/futures。它们背后的想法是您可以异步执行耗时的操作,并且它们会在完成时以某种方式通知您,无论是成功还是失败,通常是通过调用回调函数。所以第一步是生成五个异步任务并获得五个承诺。

那我就join the five promises together, creating a unified promise that represents the five separate tasks. In JavaScript I might call Promise.all(); in Java I would use CompletableFuture.allOf().

我想确保处理成功和失败。如果所有 API 调用都成功,则组合的 promise 应该成功,如果其中任何一个失败,则失败。如果有任何失败,应该有适当的错误 handling/reporting。如果多次调用失败会怎样?如何报告成功和失败的混合?这些是需要提及的设计要点,但不一定在面试中解决。

Promises 和 futures 通常具有模块化分层系统,允许通过将处理程序链接在一起来处理超时等边缘情况。如果处理得当,超时可能只是另一种错误情况,可以由已经存在的错误处理自然地处理。

此解决方案不需要在线程之间共享任何状态,因此我不必担心互斥或死锁或其他线程同步问题。


She said she would use a flag variable to keep track of the number of API calls have returned.

让出色的受访者脱颖而出的一件事是他们能够预测后续问题并在被问到之前解释细节。最佳答案已完全充实。他们证明了一个人已经详细考虑了一个人的答案,并且他们很少挥手。

当我阅读以上内容时,我有一系列后续问题:

  • 她如何知道每个 API 呼叫何时完成?return?她是在等待对 return 的函数调用、要调用的回调、要触发的事件还是要完成的承诺?
  • 她如何导致所有 API 调用同时执行?是否有多线程、fork-join 池、多处理或异步执行?
  • 标志变量是布尔值。她真的是在使用旗帜,还是说 计数器?
  • 什么是变量跟踪以及更新它的代码是什么?
  • 什么在监控变量,它在检查什么条件,达到条件时它在做什么?
  • 如果使用多线程,她如何处理同步?
  • 她将如何处理 API 调用失败或超时等极端情况?

标志变量可能导致可行的解决方案,也可能无处可去。如果面试官思考并主动讨论这些不同的问题,她就会知道这是哪一个。否则,面试官会不断追问她,很可能会降低对她的评价。

当我采访别人时,我的心理评分是这样的:

  • S — 解决方案有效,他们在没有提示的情况下解决了所有问题。
  • A — 解决方案有效,后续问题得到满意回答。
  • B — 解决方案有效,解释得很好,但更有经验的开发人员会找到更好的解决方案。
  • C — 说的还可以,就是知识深度不够
  • F — 他们的答案完全不正确,或者让他们解释他们的答案就像拔牙一样。

建议 Promises 的其他答案似乎假设所有这些请求都必然来自同一个客户端。如果这里的上下文是分布式系统,正如你所说的那样,那么我认为这些不是有效的答案。如果是,那么面试问题就和分布式系统无关了,除了测试你女朋友识别不是分布式系统问题的能力。

而且这个问题确实具有分布式系统中一些经典问题的形状。这听起来很像多线程、多进程或多客户端环境中的YouTube view counting: How do you achieve qualities like atomicity and consistency?没有意识到这一点,认为答案可以像“旗帜”一样简单,暴露了缺乏分布式系统经验。

关于这个答案的另一件事是它留下了许多歧义。国旗住在哪里?作为另一个变量(Java?)API?在数据库中?在文件中?即使在非分布式环境中,这些也是重要的问题。如果她继续解决这些问题,即使她对所有分布式系统的复杂性一无所知,她也可能会愉快地陷入对 D.S 类型的讨论。使用文件时出现的问题;以及如何使用符合 ACID 标准的数据库来解决这些问题,以及可能存在的权衡……她可能已经纠正了自己,说的是“计数器”而不是“标志”!