注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
本帖最后由 sd_6oahc 于 2024-9-10 19:23 编辑
最近我朋友面试了 Uber 的 Staff+ sde岗,碰到了一道挺难的系统设计题。题目是设计一个Event Lifecycle Management System(事件生命周期管理系统),系统需要从不同的服务中接收大量消息并进行分析。难点在于,数据量非常大,单一的磁盘或服务器根本装不下,而且事件的顺序可能是乱的(比如 endEvent 先到,而 startEvent 后到),甚至有时候事件会在实际发生几天后才到达系统。
刚开始,题目看起来还挺直观的:
1. startEvent(event_id, timestamp):记录事件开始,
2. endEvent(event_id, timestamp):记录事件结束,
3. getOngoingEvents(timestamp):查询某个时间点的进行中事件。
但是在问了一些澄清问题后,他发现真实的需求其实有点不同。比如,他们特别指出 getOngoingEvents(timestamp) 只能查询 24小时以前的数据。而且,事件最长只持续一个小时。
这个细节其实非常关键,因为它意味着我们不需要支持实时查询!我们有一天的缓冲时间,所以问题变得相对简单了。我们可以用 批处理 来解决问题,而不是实时更新,设计也因此简化了不少。
一开始,他考虑用常见的实时系统解决方案,比如bucketing time series data。但在更深入了解了面试官的真正要求后,他意识到批处理才是更合理的选择。
所以他提出了这样一个方案:
* 先将事件数据接收到一个分布式系统中(比如 Kafka),因为数据量太大,单台服务器无法处理。
* 然后,利用批处理来整理那些乱序到达的事件,并在执行查询您好! 本帖隐藏的内容需要积分高于 188 才可浏览 您当前积分为 0。 使用VIP即刻解锁阅读权限或查看其他获取积分的方式 游客,您好! 本帖隐藏的内容需要积分高于 188 才可浏览 您当前积分为 0。 VIP即刻解锁阅读权限 或 查看其他获取积分的方式 3acres.com/?url=https%3A%2F%2Fleetcode.com%2Fdiscuss%2Finterview-question%2Fsystem-design%2F3378926%2FSystem-Design-or-Uber-or-SSE" rel="nofollow noopener" target="_blank">https://leetcode.com/discuss/int ... sign-or-Uber-or-SSE |