工作记录
# 博智数源项目梳理
# 项目描述(自我介绍向)
该项目是为中国烟草做的 GIS 平台投放分析系统,项目组 8 个人,在其中我主要做了积分管理系统和品牌数字画像的功能开发,还有一部分的日常数据维护和功能优化。
项目主要用到的技术有Django REST Framework
框架,数据库为 MySQL,采用前后端分离技术,前端使用 Vue 和 Element UI。对于日常数据维护我们使用 pandas 进行数据处理。项目中我对一些数据表进行了优化,比如订单数据表的分表处理,对一些响应慢和卡顿的接口(返回数据太大,分页处理)进行了优化,使其满足用户使用要求。另外对部分内部接口实现进行优化,比如对之前爬虫的抓取数据和写入数据表的封装做了分离,从而降低接口耦合度。
日常开发中,我使用 postman 对接口进行测试;尽管项目组比较小,但在代码质量方面,我使用flake8
、isort
、yapf
进行代码质量控制。同时,我负责项目的上线和阿里云平台的资源管理。
# 简述遇到的问题以及如何解决
- dt 表(订单表)太大,数据查询太慢
按照月份进行水平分表,为什么呢?因为我们数据分析查询的时候是按照月份来进行查询的,对业务来说更加方便,直接命名为dt_xx_202112
数据库连接出现
Lost connection to MySQL server during query
应该保持每次操作时都重新初始化连接,而不是让连接一直保持住,否则,连接等待超时之后报错。
ref:Python 长期连接数据库的最不佳实践:Lost connection to MySQL server during query – 土豆不好吃 (opens new window)
接口设计不合理
在地图渲染零售户画像时,查询商户信息数据直接在渲染地图时查询返回,导致
Serializer
时耗时过大,只返回商户编码、经纬度信息即可,当点击商户点时再返回单个商户的信息。解耦
商圈信息获取和存入写在一个类中,拆分之后持久化单独存在
- 分页
使用分页之后返回数据变少,页面卡顿缓解(200k/3M)
- 使用分页之后多了一次查询,导致接口变慢
- count 时没有必要使用临时表,可以删除
group by
,或者使用子查询(先查询 id,然后根据 id 去 offset)
select * from orders_history where type=8 and id>=(select id from order_history where type =8 limit 10000,1) limit 100;
select * from orders_history where type =8 limit 10000,100;
2
# 服务器配置
- 云服务器 ECS
8核 64 GiB -- 之前是32G,但是增加Java应用之后内存90%+,所以升级
CentOS 7.6 64位
2
- 云数据库 RDS
-- MySQL 5.7
2核心8G内存 (60%)
最大连接数 6000 最大IOPS 10000 存储空间 300G
2
3
4
-- 事务级别
select @@global.tx_isolation;
REPEATABLE-READ
2
3
4
-- MySQL 8.0
4核心8G内存 (60%)
最大连接数 6000 最大IOPS 20000 存储空间 700G
2
3
4
select @@transaction_isolation;
-- READ-COMMITTED
2
3
# 鲸鲨项目梳理
# 项目
该项目是一套云存储管理系统,面向客户主要为军工、政企单位,我主要做的是 ipSAN 块存储的创建、管理、访问控制,文件存储用户配置以及基于 DRBD 实现的双机之间的块设备文件复制以及客户端连接工具的编写。
项目用到的框架是 web.py,数据库使用 MySQL,此外我接触过基于 CEPH 的二次开发(n 版)、Openstack(Cinder 组件对接)。
Cinder 服务
- cinder 组件作用
块存储服务,为运行实例提供稳定的数据块存储服务。 提供对 volume 从创建到删除整个生命周期的管理。
- cinder 组件构成
- API service:负责接受和处理 Rest 请求,并将请求放入 RabbitMQ 队列。
- Scheduler service: 处理任务队列的任务,并根据预定策略选择合适的 Volume Service 节点来执行任务。目前版本的 cinder 仅仅提供了一个 Simple Scheduler, 该调度器选择卷数量最少的一个活跃节点来创建卷。
- Volume service: 该服务运行在存储节点上,管理存储空间。每个存储节点都有一个 Volume Service,若干个这样的存储节点联合起来可以构成一个存储资源池。为了支持不同类型和型号的存储,当前版本的 Cinder 为 Volume Service 如下 drivers。当然在 Cinder 的 blueprints 当中还有一些其它的 drivers,以后的版本可能会添加进来。
此外,负责使用Flask
和Vue
开发前后端分离的管理系统,比如磁盘读写测速(fio),硬盘 SMART 测试(smartctl),硬件信息获取,系统概览,系统工具等。
一种基于 DRBD 实现的 ALUA 解决方案 | 别院牧志 (opens new window)
# 单例模式
系统日志功能(数据库连接)
资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置
- python Logger 模块单例模式 - ChnMig - 博客园 (opens new window)
- python logging 单例模式范例_全栈博客的技术博客_51CTO 博客 (opens new window)
# 其他
保存 emoji 需要使用
utf8emb4
后端数据校验: json-schema、marshmallow
# 桔家
负责商品展示功能,页面编写,后台管理系统维护以及部分黑盒测试,使用 Django+MySQL+图片云存储
# 开源
- redis 内存淘汰机制
- openstack cinder 工作原理
- 文件存储、块存储、对象存储区别
- deepcopy 什么时候用?实例
- 列表去重保持原来顺序
reg_items = [4,3,3,4,2,1,4,3,5]
ret = sorted(set(reg_items), key=reg_items.index)
print(ret)
2
3
- 什么时候不会用到索引
- 进程线程协程区别?
- MySQL 有关权限的表都有哪几个?
这些权限表分别 user,db,table_priv,columns_priv
- 常用魔法方法 魔法方法