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

系统要求和范围

背景:警员佩戴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自动从通知系统中删除。

相关推荐
该昵称用户已存在1 小时前
光储微网一体管控:MyEMS 开源平台打造分布式能源管理新底座
分布式·开源
庞轩px1 小时前
第六篇:Redis Cluster——分布式缓存的进阶方案
redis·分布式·缓存
marsh02061 小时前
44 openclaw分布式事务:跨服务数据一致性解决方案
分布式·ai·编程·技术
STAT abil2 小时前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
卧室小白2 小时前
ELK+Kafka实战
分布式·elk·kafka
能喵烧香2 小时前
鸿潮万相:全品类OpenHarmony定制发行版全景详解
linux·系统架构·开源
我命由我1234517 小时前
Windows 操作系统 - Windows 查看架构类型
运维·windows·笔记·学习·系统架构·运维开发·系统
2501_9127840821 小时前
TaoCarts 反向海淘系统架构实战:1688代采与高并发缓存设计全解析
缓存·架构·系统架构·跨境电商·taocarts
慧一居士1 天前
TDD(测试驱动开发) 介绍和详细实施步骤指南
系统架构