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

系统要求和范围

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

相关推荐
坏孩子的诺亚方舟3 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
桥田智能3 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
@insist1234 天前
系统架构设计师-5G 技术、冗余设计与分层架构
5g·架构·系统架构·软考·系统架构设计师·软件水平考试
风吹夏回4 天前
RabbitMQ 核心术语 + Python pika 方法完整讲解
分布式·python·rabbitmq
风吹夏回4 天前
RabbitMQ 三种模式入门:HelloWorld、WorkQueue、PubSub
分布式·rabbitmq·ruby
霸道流氓气质4 天前
分布式追踪与 RequestId 传播完全指南
分布式
cheems95274 天前
[RabbitMQ高级特性] 消息确认机制:从 Ready / Unacked 到 basicAck、basicReject、basicNack 的底层拆解
分布式·rabbitmq·ruby
枫华落尽4 天前
【Hadoop01-完全分布式运行模式】
分布式
隔壁阿布都4 天前
ShedLock 分布式定时任务锁框架介绍
spring boot·分布式
@insist1234 天前
系统架构设计师-网络存储 RAID 与 IPv6 协议全解析
网络·系统架构