picu后端架构总结

首先我们项目的定位是一个图片,音频为主体的分享应用,于是服务器对于大资源的存储有了常规数据库,nginx静态资源存储和对象存储服务的选型问题.常规数据库(如mysql)的业务存储不可避免的遇到服务器带宽问题和单点问题.于是我们选择了COS服务进行大对象存储,同时对于生成目录等用户关键信息进行云Redis存储并选择双机备份.项目开发,压测结束Redis只占用了2M内存空间,COS服务+CDN溯源提供了优秀的读写带宽和数据保持.

其次一开始我们两位后台开发同学对于架构的选型的第一目的其实是以”复杂装逼”为先,但是实际搭建过程中发现需要意识到每个组件选型的原因,因为每个组件的选型对于访问压力和安全都有可能有灾难性的错误,在具体架构图的体现上可能是”一粒老鼠屎”.因此我们转而明确我们需要什么样的服务器.阅读往年KM经验总结得到互联网服务器的核心在于可用容灾,简单点说要先解决每个服务的单点问题.举个项目过程中的接口例子:

我们COS的上传服务是客户端先向服务器请求一个临时Token而后利用这个临时Token存储,读取资源.由于COS不能设计给CVM的回调函数,于是基本设计是通过两条请求分离1. 取token和路径, 2. 校验,存Redis数据库当中.在这个流程中一开始我们的单机设计是在本地对于key做一个缓存,然后再确认请求中读取缓存;通过超时删除策略清理缓存池.这样的策略当接入多机时候需要cookie/session保持对单机的服务连接,接入弹性伸缩时候就完全不可用了.因此重构代码,将缓存信息存储到Redis里面,而后读取其中信息.这样配置了服务的开机自启之后就可以有效的进行弹性伸缩的业务可用性保证.总而言之服务器应该作为无状态服务,对于每个请求原子化操作.

进一步服务的解耦是在这次mini项目中理解的部分.对于python的sdk/api/算法实现,我们服务端最初解决的策略有二:

  1. 使用go-python包进行封装调用(如轨迹识别算法调用了opencv,go的opencv很不好用)
  2. hack python版本的sdk,模拟Python服务进行发包(如向cam申请cos的临时秘钥)

相对应的,遇到了以下问题:

  1. 用go-python包python内部业务出错难以定位,文档不全,内部业务更新需要宕机整个业务系统
  2. hack python sdk相当于把接口直接暴露在公网,安全问题和稳定性有待考究

于是我们分离核心模块与算法模块到内部服务器,类似外网负载均衡业务,接入内网负载均衡服务,内网弹性伸缩组通过内网ip调用算法弹性伸缩组,这样golang的代码看起来优雅(没有wrap和hack)许多,也进一步保证了安全性.另外可以对于不同服务设计不同弹性伸缩策略(业务服务设计CPU监控,图像算法服务设计内存监控)来进行伸缩组操作.

另外值得一提有三点:

  1. 备案域名申请https或者申请TLog(CLS)这样的内测服务周期对于mini项目而言压力较大,与具体业务相关性较小,需要尽早开始流程.
  2. AI时代云服务很多组件附带提供了内容安全(如CDN鉴黄,语音SDK敏感词屏蔽),DDOS服务,可以减轻业务模块接入这些服务的压力,也就是说前期SDK功能,调用的调研对于技术选型和设计十分重要.
  3. 镜像服务是一个很不错的免费功能,在这次mini项目中我们要求使用tlinux进行业务部署和实现,其中opencv,golang组件的安装可以短期(1h)租用高性能服务来完成,销毁服务之前花十分钟进行镜像备份就可以新建服务器时候选择自定义镜像定义.另一方面负载均衡,弹性伸缩组的请求对于镜像的更新要求更高;除了设置启动服务之外,我们还可以通过取出单个主机更新代码->制作镜像重启->更新弹性伸缩镜像->分批重装其他服务 这样的流程可以不关闭服务的时候修复代码,上线功能.

反思

  1. 内网模块:当时设计两层服务器模块其实是因为sdk和图像包对于golang友好度很差..虽然hack了golang版本的python cos sdk,但是测试过程中发现及其不稳定,于是换回了原生的python服务.但是内网的模块应该更加微服务,我当时的实现是每台主机flask路由到两个业务(sdk+opencv), 但是这两个模块应该进一步解耦,原因在于sdk交互是需要外网ip的,尽管设置了端口防火墙,但是运维成本比解耦高很多.
  2. 内网CLB: 图像识别和调用外部sdk的网络耗时会使得整个系统的qps变低,应该加入CMQ进行限流削锋.
  3. 云Redis存储: 腾讯云redis不支持跨地,也就是没有云sql的异地容灾.
  4. COS存储: 权限管理由于hack的sdk不稳定,做的不够细致.另外没有考虑利用归档存储做冷热分离.
  5. 监控虽然接入了内测的tlog,但是后期开发量还是很大,包括对于客户端日志的收集,邮件通知服务
  6. (TODO)WNS接入: 对于腾讯云部署的业务是免费的~~
  7. 准备移植小程序,用nodejs做后端试试。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

【飞起】手把手教你如何前端页面秒开!!

没有最快,只有更快!世上武功,唯快不破!新能源汽车百公里加速4.x秒!...,可以说,人类对于速度的追求是永无止境的。在网页上也是一样,网页打开的速度快点,再快...

1513
来自专栏WeTest质量开放平台团队的专栏

微信小程序之提高应用速度小技巧

小程序科普类的文章已经很多了,今天这里讲的是针对小程序的优化方法,可以有效提高小程序的响应速度和用户体验。当然,开发体验也提高不少。

2.3K0
来自专栏韩伟的专栏

经典的服务器结构概述(中)

. 经典的服务器结构概述(中) 今天将和大家详细探讨分服模型,本文结构如下: ? 1模型描述 分服模型是游戏服务器中最典型,也是历久最悠久的模型。其特征是游...

4387
来自专栏智能算法

一文看懂npm、yarn、pnpm之间的区别

原文:Understanding differences between npm, yarn and pnpm 作者:Alex Kras 翻译:雁惊寒 本文作者...

38610
来自专栏ThoughtWorks

聊一聊契约测试 | 洞见

如果从契约产生的阶段来说,现有资料表明最早要追溯到西周时期的《周恭王三年裘卫典田契》,将契约文字刻写在器皿上,就是为了使契文中规定的内容得到多方承认、信守,“万...

1445
来自专栏开源FPGA

Modelsim10.2c使用教程(一个完整工程的仿真)

 这学期在玩Altera的板子,不不, 现在应该叫intel PSG。在QuartusII13.0上老喜欢用modelsim_ae做仿真,小工程用起来也方便,...

8275
来自专栏抠抠空间

webpack基础

1580
来自专栏前端架构

web统计原理及实现方法汇总总结—网站统计中的数据收集

在php、jsp、asp后端总揽一切的时代,网站统计基本是后台的事情——其实web开发,也没有前端这个职位,网站设计(现在的UI)不仅要前途还要用dreamwa...

4242
来自专栏小樱的经验随笔

Python爬虫笔记(一):爬虫基本入门

最近在做一个项目,这个项目需要使用网络爬虫从特定网站上爬取数据,于是乎,我打算写一个爬虫系列的文章,与大家分享如何编写一个爬虫。这是这个项目的第一篇文章,这次就...

3946
来自专栏程序员互动联盟

编程高手为啥都喜欢耍脚本?

脚本编程几乎在每一个平台上都存在,这是因为利用脚本常常会简化、加快很多批量处理的工作,它能实现很多传统编程语言的功能,但是对编写者却不需要关心什么编译器、解释器...

3485

扫码关注云+社区

领取腾讯云代金券