系统设计练习 - 实时警员安全报警系统

系统要求和范围

背景:警员佩戴body camera

功能要求:

  1. 实时接收body cam视频流

  2. 自动检测危险事件

  • 枪支出现

  • 人员倒地

  • "help"等高危语音

  • 奔跑/追逐

  1. 2秒内向附近警员和dispatch center发出alert

  2. 所有视频必须被保存为legal evidence

  3. AI模型会持续迭代升级

  4. 全球数十万设备同时在线

非功能需求:

  1. 对危险响应近乎实时 - 2秒内

  2. 高可靠性 - 系统功能要高度available

  3. scalable

API设计

  • POST /camera/{id}/video:start - 和后端service打开视频

request body:

复制代码
{
    "camId": "abc"
}

response: 200OK. 如果是open视频的请求,在response里应该带有后端media service的address。在系统架构设计进行详细描述。

  • POST /camera/{id}/video:stop - 关闭视频

response:200OK.

  • POST /camera/{id}/status - 报告camera信息

    {
    "id": "abc",
    "location": {
    "lat": 123,
    "log": 456
    },
    "status": "normal"/"error"
    }

系统架构设计

对此系统架构进行说明:

  1. device通过API gateway向后端video service发送请求,要求建立video连接。video service通过edge service DB查询到相关edge service的信息返回给device。这一部分是信令传递,用来进行authentication和传递媒体流连接需要的信息。

  2. device和edge service建立媒体流连接,向edge service传递视频流。edge service将视频流存储到video storage。video processing service通过CDC感知新的媒体被创建,对其进行取样处理,并将样本的meta信息发送到video stream。

  3. FLINK job consume video 样本信息,通过inference service调用AI model对video sample进行处理。如果AI model返回了敏感信息,FLINK生成相关event,分别写入到event DB以便进行日后审查,和写入到event stream里。

  4. device通过connection gateway向后端update自己的location信息。indexing service consume设备的地点信息,并更新geoHash(由redis支持)。alert service在从stream获取event后,通过查询geoHash获取附近的device,并通过connection gateway向相关的device 发送通知。

讨论

在上面的设计里,我们讨论如下几点:

  1. 整体系统应该进行分区。这样每个区域内部的服务可以满足traffic的要求。

  2. 信令的建立和媒体流的建立是分开的,因为它们对时延和overload的要求完全不同。

  3. 和设备的连接由connection gateway单独维护。好处是可以让后端其他service变成stateless的,易于scale和failure recover。

  4. 基于地点查询由redis geoHash支持。在设备较多,地点比较大的情况下需要考虑增加shard和多个redis cluster。同时redis不是地点信息的source of truth,因为redis是基于memory的,信息一般不能持久。但是我们可以通过device location stream来重新建立geoHash。

  5. AI model 通过inference service调用,以便维护AI的独立升级和替换。

扩展讨论:

  1. 考虑到device在某些环境下网络可能不稳定,我们可以考虑在device端加入buffer。这样device在上传失败的情况下可以先保存在local buffer,然后在网络回复后再进行上传。

  2. 为了满足强实时性的要求,我们需要connection gateway和device之间保持connection。但是如果connection失败,connection gateway可以fallback到connectless的通信方式下。如果connectless通信仍然失败,connection gateway可以考虑增加queue或者buffer,然后多次尝试向设备发送相关通知。

  3. redis geoHash加入TTL以使offline的device自动从通知系统中删除。

相关推荐
Zach_菠萝侠29 分钟前
【deepseek harness研究】进化方向7:分布式与远程执行 思考、设计与实现
分布式·深度学习·deepseek
希赛网2 小时前
2026年下半年软考系统架构设计师考试案例模拟题汇总
系统架构·系统架构设计师·软考系统架构设计师·系统架构设计师考试·2026年下半年软考·系统架构设计师考试案例题
Sayai2 小时前
Kafka 集群开启 SASL 认证实战(二):外置 ZooKeeper 之 kafka 与 zk 间认证
分布式·zookeeper·kafka
Sayai2 小时前
Kafka 集群开启 SASL 认证实战(一):内置 ZooKeeper 场景,JAAS 配置全流程
分布式·zookeeper·kafka
海兰3 小时前
【Kafka进阶6】顺序消费深度解析
分布式·kafka·linq
Cicada1285 小时前
复杂度到底从哪来的?
系统架构
郝学胜-神的一滴6 小时前
《C++11 工程级应用01:告别冗长类型,开启简洁高效编码新时代》深度解读
开发语言·c++·算法·软件开发·系统设计
YH行业报告分析6 小时前
2026年直流配电网市场结构性增长解析:分布式能源并网与智能电网升级驱动下的技术路线博弈
分布式·能源
剑胆琴心静水深流15 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
KAIWEILIUCC19 小时前
Ray:高性能、易扩展的Python分布式计算框架
分布式·llm