Python后端架构演进(python后端技术)
off999 2024-10-19 07:13 31 浏览 0 评论
做了3年的后端开发, 经历一款SaaS产品从0到10(还没有到100, 哈哈哈)的过程, 3年间后端的架构逐步演变, 在微服务的实践过程中遇到的问题也越来越多, 在这里总结下.
产品是一款服务于人力资源的SaaS在线服务, 面向HR有Web Android/iOS 小程序多个客户端, 后端采用RESTful风格API来提供服务. 主要使用Python语言, 方便快速迭代.
架构的演进经历了4个大的阶段: 1. MVC 2. 服务拆分 3. 微服务架构 4. 领域驱动设计.
1. MVC
项目刚开始的时候, 后端同事不超过5个, 这个阶段主要的工作是实现产品的原型, 没有太多的考虑架构, 使用Django来快速实现功能, DB的表结构设计好之后, 抽象出功能View, 由于产品设计也很不完善, 后端需要很多的预留设计, 避免产品逻辑的变更带来整个表结构的变动, 在这个阶段代码上最重要的是确定适合团队的代码规范, 代码检查规则.
整体上架构如上图, Nginx负责负载均衡, 分发流量到多个Django服务, Django处理逻辑, 需要异步任务就交给Celery, 然后数据量比较大的地方使用Redis做缓存. 同时还有实时消息通知的需要使用了Nginx Push Module.
问题与优化方式:
Django并发性能差 使用uWSGI Master+Worker 配合 gevent 携程支持高并发
Redis连接数过多 使用redis-py自带的连接池来实现连接复用
MySQL连接数过多 使用djorm-ext-pool连接池复用连接
Celery配置gevent支持并发任务
随着开发的功能越来越多, Django下的app也越来越多, 这就带了发布上的不方便, 每次发布版本都需要重启所有的Django服务, 如果发布遇到问题, 只能加班解决了. 而且单个Django工程下的代码量也越来越多, 不好维护.
2. 服务拆分
随着后端团队的壮大, 分给每个同事的需求也越来越细, 如果继续在一个工程里面开发所有的代码, 维护起来的代价太高, 而我们的上一个架构中在Django里面已经按模块划分了一个个app, app内高类聚, app之间低耦合, 这就为服务的拆分带来了便利. 拆分的过程没有遇到太大的问题, 初期的拆分只是代码的分离, 把公用的代码抽离出来实现一个公用的Python库, 数据库, Redis还是共用, 随着负载的增加, 数据库也做了多实例.
如上图, 服务之间尽量避免相互调用, 需要交互的地方采用http请求的方式, 内网的调用使用hosts指向内网地址.
问题与优化方式:
Nginx Push Module由于长时间没有维护, 长连接最大数量不够, 使用Tornado + ZeroMQ实现了tormq服务来支撑消息通知
服务之间的调用采用http的方式, 并且要求有依赖的服务主机配置hosts指向被调用的地址, 这样带来的维护上的不方便. 以及在调用链的过程中没有重试, 错误处理, 限流等等的策略, 导致服务可用性差. 随着业务拆分, 继续使用Nginx维护配置非常麻烦, 经常因为修改Nginx的配置引发调用错误. 每一个服务都有一个完整的认证过程, 认证又依赖于用户中心的数据库, 修改认证时需要重新发布多个服务.
3. 微服务架构
首先是在接入层引入了基于OpenResty的Kong API Gateway, 定制实现了认证, 限流等插件. 在接入层承接并剥离了应用层公共的认证, 限流等功能. 在发布新的服务时, 发布脚本中调用Kong admin api注册服务地址到Kong, 并加载api需要使用插件.
为了解决相互调用的问题, 维护了一个基于gevent+msgpack的RPC服务框架doge, 借助于etcd做服务治理, 并在rpc客户端实现了限流, 高可用, 负载均衡这些功能.
在这个阶段最难的技术选型, 开源的API网关大多用Golang与OpenResty(lua)实现, 为了应对我们业务的需要还要做定制. 前期花了1个月时间学习OpenResty与Golang, 并使用OpenResty实现了一个短网址服务shorturl用在业务中. 最终选择Kong是基于Lua发布的便利性, Kong的开箱即用以及插件开发比较容易. 性能的考量倒不是最重要的, 为了支撑更多的并发, 还使用了云平台提供的LB服务分发流量到2台Kong服务器组成的集群. 集群之间自动同步配置.
饿了么维护一个纯Python实现的thrift协议框架thriftpy, 并提供很多配套的工具, 如果团队足够大, 这一套RPC方案其实是合适的, 但是我们的团队人手不足, 水平参差不齐, 很难推广这一整套学习成本高昂的方案. 最终我们开发了类Duboo的RPC框架doge, 代码主要参考了weibo开源的motan.
4. 领域驱动设计
在这一架构中我们尝试从应用服务中抽离出数据服务层, 每一个数据服务包含一个或多个界限上下文, 界限上下文类只有一个聚合根来暴露出RPC调用的方法. 数据服务不依赖于应用服务, 应用服务可以依赖多个数据服务. 有了数据服务层, 应用就解耦了相互之间的依赖, 高层服务只依赖于底层服务.
在我离职时领域驱动设计还在学习设计阶段, 还没有落地, 但是我相信前公司的后端架构一定会往这个方向继续演进.
总结
架构的设计, 技术的选型, 不能完全按照流行的技术走, 最终还是服务于产品, 服务于客户的需求. 设计过程中由于团队, 人员的结构问题, 有很多的妥协之处, 如何在妥协中找到最优解才是最大的挑战.
最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资料的可以关注私信小编“01”即可,希望能对你有所帮助
相关推荐
- pubg加速器免费版(pubg加速器免费版无广告)
-
现在加速吃鸡的游戏加速器是有专线路线的比较好,专线的稳定很多,不过目前是没有完全免费的加速软件,很多都可以先体验,注册就可以体验的,可以多去体验几款,对比一下。目前的加速器可以分为三个等级第一等级:全...
-
- 如何用u盘重装电脑系统win7(用u盘怎样重装系统win7)
-
u盘怎么装win7系统步骤如下:1、先下载Windows7镜像,根据自己需求选择下载的版本:简化版、家庭基础版、家庭高级版、企业版等。2、下载工具软碟通。直接在搜索引擎中输入“软碟通”,选择合适的下载地址,直接下载安装即可。3、制作系统U...
-
2025-12-27 08:51 off999
- 系统驱动怎么安装(系统驱动的安装)
-
首先进入系统的设备管理器,检查一下是否存在有没有正确安装或者找不到的驱动程序的设备,然后进入硬件生产厂商官网去下载对应的操作系统的驱动程序,进行安装。如果嫌麻烦,可下载第三方软件进行辅助安装。1、如果...
-
- 设置bios密码(银河麒麟怎么设置bios密码)
-
想电脑BIOS开机密码,其实很简单,只要进入BIOS设置界面,然后选择“security”选项卡,在“security”内设置好开机密码即可。下面就跟随小编一起来学习一下具体提设置步骤吧!1、首先开机,然后快速按“F2”或者“F12”进入B...
-
2025-12-27 07:51 off999
- 华硕售后服务中心查询(华硕售后维修服务网点查询)
-
首先查看包装盒、保修卡、机器底部。三个地方的SN码及机器的序列号是不是一致。如果不一致那一定是有问题的。2然后,如果一致,我们可以拨打华硕的客服,通过机器的序列号,查询机器的基本情况,然后与说明书上的...
- 如何更改硬盘分区(硬盘怎么更改分区)
-
要修改磁盘分区,首先需要使用磁盘管理工具,如DiskManagement(Windows)或DiskUtility(Mac)。在工具中,选择要修改的磁盘并右键点击,然后选择“修改分区”选项。接着,...
- 无线路由器当交换机使用(路由器当交换机用无线wifi还可以上网吗)
-
若您想将无线路由器用作交换机,您可以按照以下步骤操作:1.确保您的无线路由器具有交换器功能。不是所有的无线路由器都具备此功能,请先确保您的设备支持。2.将您的无线路由器与网络中的其他设备连接。通常...
- computer(computer lab)
-
"电脑"这个名称实际上是人们对具有计算功能电子设备的俗称。而计算机(Computer)则是这个设备的正式名称,因为"计算"是其核心功能。在英文中,Computer是指可...
- 电脑重置20多个小时了(重置电脑一直12%)
-
重置电脑时间太长了解决办法如下1、将电脑关机然后开机或者直接点击重启,然后按住DELETE键,电脑会自动进入到BIOS;2、电脑屏幕上会显示两个选项,两个选项一般都在电脑屏幕的右方;3、其中一个选项是...
- 电脑虚拟机是什么(电脑虚拟机有啥用)
-
电脑虚拟机(VirtualMachine,VM),也称为虚拟计算机,是一种软件模拟的计算机,它在现有的计算机硬件上创建一个虚拟的计算机环境。这个虚拟环境可以用来运行操作系统、应用程序等软件,就像是在...
- 键盘图片大图(键盘图片大图清晰)
-
这个是仿苹果机上的无线键盘(妙控一代)的,属于山寨产品。1、在手机的微信或者短信或者其他可以打开键盘的应用中打开键盘,点击键盘左上角的输入法设置图标,页面显示输入法的各种设置功能;2、在输入法的设置...
- win11系统可以更新吗(w11系统可以用了吗)
-
可以1.点击“开始”,打开“设置”。2.找到“更新和安全”,选择“预览体验计划”。3.点击“开始”,需要登录微软账户。4.登录完成后弹出一个升级的渠道,选择dev进行下载win11即可。方法二:首...
- winxp安装系统镜像iso下载(xp的镜像系统怎么安装)
-
要安装一个ISO镜像文件,首先需要将ISO文件挂载到计算机上。在Windows系统中,可以右键点击ISO文件,并选择“挂载”选项,然后打开文件资源管理器就能看到ISO文件被挂载的虚拟驱动器。在Linu...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
