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

系统要求和范围

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

相关推荐
懂软件的胡子个哥2 小时前
微信工单系统如何基于 WechatApi 做消息分流和状态流转
运维·分布式·微信·架构·企业微信
毅炼10 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
九皇叔叔20 小时前
从本地事务到分布式事务
java·分布式·分布式事务·cap·base
刃神太酷啦1 天前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
风123456789~1 天前
【架构专栏】第10章 软件架构演化与维护 1/2
系统架构
PHP实战开发录1 天前
PHP接口怎么防重复提交
系统架构·php·开发
海宇大数据1 天前
分布式网关架构实战:基于海宇数据公安二要素认证即时版构建自动化司机准入网关
人工智能·分布式·架构·自动化
在世修行1 天前
干货:三合一架构:GUI/HTTP/引擎如何共用一条任务队列
系统架构·ai编程·任务队列·trae work
木圭的AI时代指南2 天前
Spark-X2.5 长输入 Agent 实测:全量读取陷阱与解释器寻找死循环复盘,附可复现任务
大数据·分布式·spark
风123456789~2 天前
【架构专栏】第9章 软件可靠性基础知识 1/2
系统架构