本题是典型的图上状态查询:微服务之间的依赖构成一张有向无环图(题面保证无环),每个服务还带有「在哪些服务器上运行」的实例集合。
维护三份信息:
running[service]:该服务当前有实例的服务器集合;onServer[server]:该服务器上正在运行的服务集合(便于重启时批量下线);deps[from]:from 的直接依赖集合。实现类 ServiceMgrSys:维护若干命名服务在多台服务器上的运行实例,以及服务之间的有向依赖(保证无环)。
规则:
| 方法 | 说明 | 返回值 |
|---|---|---|
ServiceMgrSys() |
初始化,清空状态 | 无(输出 null) |
rebootServers(serverIds) |
所列服务器上全部实例停止,且不自动重启 | 无(null) |
startService(serverId, serviceName) |
在该服务器启动该服务;若已在运行则 false,否则启动并 true |
bool |
addDependency(fromServiceName, toServiceName) |
令 from 依赖 to;已存在则 false,否则 true |
|
isServiceAvailable(serviceName) |
该服务当前是否可提供服务 |
签名与平台一致(Python / Java / C++ 同名方法),此处从略。
每行一次函数调用;首行必为 ServiceMgrSys()。累计调用次数不超过 1000。
addDependency 不会成环。每次调用一行:无返回值输出 null;布尔输出小写 true / false。
输入
ServiceMgrSys()
startService(1, "A")
startService(1, "B")
addDependency("B", "A")
isServiceAvailable("B")
rebootServers([1])
isServiceAvailable("A")
startService(2, "A")
startService(2, "B")
isServiceAvailable("B")
输出
null
true
true
true
true
null
false
true
true
true
说明
先在服务器 1 启动 A、B,并令 B 依赖 A,此时 B 可用。重启服务器 $1 后无实例,A 不可用。再在服务器 $2 启动 A、B 后,B 再次可用。
输入
ServiceMgrSys()
startService(1, "X")
startService(2, "X")
startService(2, "X")
addDependency("Y", "X")
rebootServers([2])
isServiceAvailable("X")
startService(2, "Y")
isServiceAvailable("Y")
rebootServers([2, 1])
isServiceAvailable("X")
输出
null
true
true
false
true
null
true
true
true
null
false
说明
X 在 1、2 各有实例;重复在 2 启动返回 false。重启 $2后X仍在 $1$ 上可用。启动依赖X的Y后Y可用;两台都重启后X` 不可用。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册