在一次采访中,我的女朋友被问到了以下问题:
我们同时触发5个独立的API。一旦它们都完成了,我们想要触发一个函数。你将如何设计一个系统来做到这一点?
我女朋友回答说她会用一个旗子变量,但是面试官显然对此并不满意。
那么,是否有一种很好的方法可以(在分布式上下文中)处理这个问题?请注意,5个API调用中的每个调用都是由不同的服务器进行的,要触发的函数在第6服务器上。
发布于 2021-06-13 23:08:14
如果有人问我这个问题,我的第一个想法是使用许诺/期货。它们背后的想法是,您可以异步执行耗时的操作,当它们成功或不成功地完成时,它们将以某种方式通知您,通常是通过调用回调函数。因此,第一步是生成五个异步任务,并得到五个承诺。
然后,我会将这五个承诺放在一起,创建一个代表五个独立任务的统一承诺。在JavaScript中,我可能会调用Promise.all();在Java中,我将使用CompletableFuture.allOf()。
我要确保成功和失败都要处理好。如果所有API调用都成功,则组合承诺应该成功;如果任何API调用失败,则组合承诺应该成功。如果有任何故障,应该有适当的错误处理/报告。如果多个呼叫失败会发生什么?如何报告成功和失败的混合?这些将是设计要点,但不一定要在面试中解决。
承诺和未来通常有模块化的分层系统,它允许诸如超时这样的边缘情况由链接处理程序一起处理。如果操作正确,超时可能成为另一个错误条件,由已经到位的错误处理自然处理。
这个解决方案不需要在线程之间共享任何状态,所以我不必担心互斥锁、死锁或其他线程同步问题。
她说她将使用一个标志变量来跟踪返回的API调用的数量。
有一件事能让优秀的受访者脱颖而出,那就是他们在被问到之前能够预见后续问题并解释细节。最好的答案是充分充实的。他们证明了一个人已经仔细考虑了一个人的答案,并且他们只有很少的挥手。
当我读到上面的内容时,我有很多后续的问题:
一个标志变量可能导致一个可行的解决方案,或者它可能没有任何结果。如果面试官思考并主动讨论这些问题,那么面试官就会知道这是什么。否则,面试官将不得不向她提出后续问题,很可能会降低他们对她的评价。
当我采访别人时,我的心理成绩就像是:
发布于 2021-06-14 00:33:56
其他的答案表明Promises似乎认为所有这些请求都来自同一个客户端。如果这里的上下文是分布式系统,正如您所说的,那么我不认为这些是有效的答案。如果是的话,那么面试问题将与分布式系统无关,只会说明你的女朋友是否能识别出一些并不是真正的分布式系统问题的能力。
在分布式系统中,这个问题确实有一些经典问题的形式。这听起来很像YouTube视图计数:如何在多线程、多进程或多客户端环境中实现像原子性和一致性这样的质量?没有意识到这一点,认为答案就像“旗子”一样简单,暴露了分布式系统缺乏经验。
这个答案的另一件事是,它留下了许多含糊之处。国旗住在哪里?作为另一个变量(Java?)API?在数据库里?在文件里?即使在非分布式的情况下,这些也是重要的问题。如果她继续解决这些问题,即使她对所有分布式系统的复杂情况都是无辜的,她也可能很高兴地陷入了一场讨论:当你使用一个文件时,会发生什么样的D.S.问题;以及如何使用兼容酸的数据库来解决这些问题,以及可能存在哪些权衡.她可能已经纠正了自己,说了“计数器”而不是“旗子”!
https://stackoverflow.com/questions/67963121
复制相似问题