我最近在一次采访中被问到这个系统设计问题:
假设一个应用程序允许用户与他们的连接共享来自第三方站点的文章。假设所有共享操作都通过应用程序站点上的一个公共代码路径(由地理位置不同的colos中的多个服务器提供服务)。设计一个系统,以近乎实时的方式聚合过去五分钟、最后一小时和最后一天中n篇最常共享的文章。假设每天唯一共享文章的数量在100万到1000万之间。
所以我想到了以下几个部分:
处理共享事件的现有服务层
聚合服务
数据存储器
一些传输机制将共享事件的通知发送到聚合服务
现在我开始讨论处理共享事件的现有服务层的数据将如何到达聚合服务器?可能的解决方案是在这里使用任何类似kafka的消息传递队列。
面试官问我为什么选择Kafka,Kafka将如何工作,比如你将创建什么主题,它将有多少个分区。因为我很困惑,所以无法正确回答。基本上,他是想了解点对点、发布-订阅或推-拉模型的一些概念?
现在我开始讨论聚合服务是如何运行的。我给出的一个解决方案是,在每个共享事件发生时,将每个共享url的计数器集合在过去24小时内保留5分钟(每个url有244个存储桶),将当前存储桶递增,然后重新计算5分钟、小时和天的总数。根据需要更新前n名列表。当每个新共享的url进来时,把24小时内没有更新的url推出来。现在我认为所有这些都可以在一台机器上完成。
面试官问我这些都能在一台机器上完成吗?也可以在一台机器上维护1m-10m的履带式份额吗?如果没有,你会怎么划分?如果它崩溃了会发生什么?您将如何恢复?基本上,我不知道聚合服务在这里实际如何工作?它是如何从Kafka那里得到数据的,以及这些数据的实际用途。
现在对于数据存储部分,我认为我们不需要持久的数据存储,所以我建议我们可以使用带有分区和冗余的redis。
面试官问我,你们在这里如何划分和裁员?以及如何从整个流程中更新redis示例,以及如何构建redis?我也很困惑。我告诉他,我们可以将聚合服务的输出写入这些redis示例。
有几件事我不能回答,因为我对整个流程将如何工作感到困惑。有人能帮我理解如何以分布式方式设计这样的系统吗?以及面试官问我的问题我应该回答什么。
1条答案
按热度按时间s71maibg1#
这些问题的目的不是为了得到问题的最终答案。而是检查被采访者的能力和思维过程。在面对棘手的后续问题时,回答这些问题时,没有必要惊慌失措。后续问题的目的是引导你或给面试者一些提示。
对于这个问题,我将尝试分享一个可能的答案。假设我有一个像cassandra这样的分布式持久系统。我将使用我的cassandra基础设施随时保持共享状态。我将在持久层之前维护一个redis集群,用于lru缓存,并每天维护5分钟1小时的bucket。将使用expire set配置逐出。现在,我的聚合器服务只需要处理redis lru缓存中存在的最小数据。设置一个高吞吐量的分布式kafka集群将从共享处理程序中抽取数据。Kafka将数据传输到redis集群,再从那里传输到cassandra。为了保持接近实时的输出,我们必须保持kafka集群的吞吐量与之匹配。