xxx收票子模块无服务器改造
============================================ ### 背景描述
xxx收票子模块基于Springcloud构建,主要用于移动端发票上传,发票识别,ERP前端展示的处理流程。系统在高并发场景运行时偶尔发生宕机事件。
采用AWS serverless改造,通过使用托管服务的原生功能可以简化系统架构,实现自动扩展,减少人工运维,提升系统稳定性的目标。
### 改造前后架构对比
原系统架构,采用ERP前端与socketIO建立websocket连接,实现发票信息推送; 采用RabbitMQ实现socketio与发票识别模块的进程间通信。为简化系统设计,一次报销过程对应一个RabbitMQ队列。RabbitMQ为单点部署,应用上尚未支持集群扩展。实际运行过程中,在高并发场景RabbitMQ队列超出上限,导致系统挂起
改造前
使用serverless改造,使用websockAPI替换原有的socketIO。ERP前端与之建立连接后,将connectID保存至dynamoDB;发票识别模块使用Lambda替换,完成识别后从DynamoDB获取connectID,可以直接向websocketAPI post消息,完成双向通讯
改造后
方案优势:
- 简化架构
Lambda向Websocket API直接Post请求,摒弃RabbitMQ消息通知机制,大幅简化业务逻辑
- 提升稳定性
全部采用托管服务,避免单点故障和集群扩展操作.APIGateway & Lambda支持自动扩展及高并发突增
- 简化运维
托管serverless服务,自动扩展,无server运维投入
- 成本节省
按照调用次数/连接总分钟数收费,无业务调用不收费,避免预制成本
### 部署架构
POC构架如下
架构图
### 代码说明
- template.yaml:SAM部署脚本
- statemachine:Stepfunction状态机构造脚本,用于模拟移动端扫描发票,后端获取发票信息后将信息发送前端页面并等待人工确认的过程。 - functions: Lambda函数实现过程 stepfunction的效果: stepfunction
### 效果展示
###### Alternate Text