设计一个Distributed Tasks Management System

最近面试遇到的一道题,不是特别有思路,想听听老师的见解,感谢感谢

QPS: 1000 modified tasks per second
一个task同时只能被一个用户modify
每个用户可以拥有自己的task pool
需要对所有的tasks 状态进行汇总,类似于dashboard 进行状态监控

类似于Git design

根据你提的几点,需要设计几个部件:

  • Task 数据库(需要 Read-write Lock,SQL 更合适)
  • Task 服务 (实现 Task Pool,返回跟某一用户相关的所有 Task)
  • Task 状态监控服务(实时监控 + Async 监控)

能不能说一下跟 Git 的关系?

感谢老师回复,面试官就拿git和JIRA给我举的例子,说是tasks可以被分发到多个branch,而且task可以被schedule, 每个task的状态可以在dashboard上进行monitor, 我确实没见过这个问题,当时答得不是很好,所以想听听老师您的看法,其实我的理解是让你设计JIRA System,他说的这些需求听起来更像JIRA

面试官可能说的是 Github 里面 track issue 的机制,Jira 确实是一个更好的例子。Jira 的特点就是一份数据可以用很多种方式来查看,可以根据 Team 来查看,或者根据 Epic 来查看等等。听起来比较偏向数据库设计。

谢谢老师回我,基于您的思路,怎么样能把整体的ticket状态汇总到一起从而监控,老师能不能详细说一下这一块,还有有一个问题就是concurrency,怎么样能解决如果同时两个人同时请求一个task的问题?

先定义一下汇总的方式吧。如果说监控目标是实时追踪当前有多少 ticket 分别是 open, in progress, close 的。可以使用一个 Counter Service 来实现,每次更新就更新对应的 counter。如果监控目标是 Offline 汇总每个人都有多少个任务,那么考虑用 HiveQL 来统计。
Concurrency 使用 Lock 来处理就好,根据情况可以用 Read-write Lock.