系统设计几乎可以实时汇总,过去五分钟,最后一小时和最后一天的N个共享次数最多的文章?

时间:2019-06-12 19:27:27

标签: redis apache-kafka system-design

最近在一次采访中有人问我这个系统设计问题:

  

让我们假设一个应用程序允许用户共享3rd的文章   派对网站及其联系。假设所有共享操作都执行   通过应用程序站点上的通用代码路径(由多个服务器提供服务)   在不同的地理位置)。设计一个系统进行汇总   最近五分钟内,N个共享次数最多的文章,   最后一小时和最后一天。假设唯一共享文章的数量   每天介于1M到10M之间。

所以我想出了以下组件:

  • 处理共享事件的现有服务层
  • 聚合服务
  • 数据存储
  • 一些传输机制,用于将共享事件的通知发送到聚合服务

现在,我开始讨论处理共享事件的现有服务层中的数据如何到达聚合服务器?可能的解决方案是在此处使用任何消息队列(例如Kafka)。

  

面试官问我,为什么您在这里选择Kafka,以及Kafka的工作方式,例如您将创建的主题以及将创建多少个分区。由于我感到困惑,所以无法正确回答。基本上,他试图在点对点,发布,订阅或推送与拉取模型上获得一些想法?

现在,我开始讨论聚合服务的运行方式。我提供的一种解决方案是在过去24小时内按5分钟的存储时段为每个共享的URL保留一个计数器集合(每个URL 244个存储桶)随着每个共享事件的发生,增加当前存储桶并重新计算5分钟,小时和日期总计。根据需要更新前N个列表。当每个新共享的URL进入时,推出24小时内未更新的所有URL。现在我认为所有这些都可以在一台机器上完成。

  

采访者问我这一切可以在一台机器上完成吗?还可以在一台机器上维护1M-10M跟踪的份额吗?如果没有,您将如何分区?如果崩溃,会发生什么,您将如何恢复?基本上,我很困惑聚合服务在这里实际上如何工作?它如何从Kafka获取数据以及这些数据实际上将如何处理。

现在是数据存储部分,我认为这里不需要持久性数据存储,因此我建议我们可以将Redis用于分区和冗余。

  

采访者问我,您将如何在此处进行分区和冗余?以及如何从整个流程中更新Redis实例以及如何构造Redis?我对此也感到困惑。我告诉他,我们可以将Aggregation服务的输出写入这些Redis实例。

由于我对整个流程的工作方式感到困惑,所以我无法回答的事情很少。有人可以帮助我了解我们如何以分布式方式设计这样的系统吗?对于面试官问我的问题,我应该回答什么。

1 个答案:

答案 0 :(得分:1)

这些问题的目的不是为了最终解决问题。而是检查受访者的能力和思考过程。在面对这些棘手的跟进问题时,回答这些善良的问题是没有必要惊慌的。后续问题的目的是指导您或给受访者一些提示。

对于这个问题,我将尝试分享一个可能的答案。假设我有一个像Cassandra这样的分布式持久系统。而且我将随时使用我的Cassandra基础结构保持共享的状态。我将在持久层之前维护Redis集群以进行LRU缓存,并将存储桶维护5分钟,1小时零一天。将使用到期集配置驱逐。现在,我的聚合器服务仅需要处理Redis LRU缓存中存在的最少数据。设置高吞吐量分布式Kafka集群将从共享处理程序中抽取数据。然后,Kafka将数据馈送到Redis集群,再从那里馈送到Cassandra。为了保持接近实时的输出,我们必须保持与之匹配的Kafka集群吞吐量。