记录第一次带后端团队

在过去的一个半月里我第一次作为后端开发组长角色参与公司项目从0到1的开发,记录这一次开发的经历。

1、背景介绍

首先说明一下背景。我所在的公司是做智慧社区相关业务,开发的项目是系统升级工具,方便公司实施同事安装和升级系统。

参与后端开发一共四个人,包括我在内。其他三个同事有一个是应届生、两个做大数据的。按照公司的技术规划,对内项目开发节奏要短平快,用Python语言完成,对外的项目一律用Java语言完成。

项目经过正常开发生命周期,包括需求采集、产品设计、系统设计、详细设计、编码、测试等过程。其中详细设计就是针对接口做的详细设计,一共用时3天完成,设计了45个功能点,包括40个接口和5个初始化准备工作。编码用时计划为3周。最终在时间点之内完成了相关的开发。

我在这次开发过程中担任的是组长的角色,主要的任务包括:

(1)项目框架的搭建。本次开发是一个从0到1的过程,在此之前并没有Python项目的框架。

(2)关键技术的实现。包括通用接口,复杂的技术点。

(3)任务分配。所有接口根据任务量分配给指定的成员,完成最多的接口开发。


2、项目框架搭建

Python做web开发常用的项目框架其实并不是很多,我的候选项有三个:

Django 前后端不分离框架、Flask 最容易上手的框架、FastAPI 异步高性能框架。

对比这三个框架,我从业务逻辑、公司技术栈、复杂度等三个角度出发,选择了Flask。

业务逻辑

业务逻辑对性能并没有特别要求,就是通过接口调用运维的ansible脚本,没有高并发,计算密集等任务,所以三个都能满足。

技术栈

公司技术栈是前后端分离,所以Django这种前后端不分离的框架并不适合,虽然Django也可以做纯后端开发(防杠)。

复杂程度

复杂度来说肯定是Flask最简单。Django号称大而全,配置复杂。FastAPI是异步框架,需要学习异步编程,虽然用来做同步框架也很丝滑,但是学习成本需要增加很多。其他三个同事都没有做过Python项目,所以尽量减少学习成本。

经过这三个方向的衡量,最终确定了Flask框架,搭配peewee orm数据库框架。核心的技术包括:

(1)web框架 Flask

(2)数据库ORM框架 peewee

(3)数据库 sqlite

(4)运维脚本执行模块 subprocess

(5)WSGI服务 Gunicorn

(6)代码检查工具pre-commit

在编码前我已经准备好完整的项目框架,写好了数据库CRUD接口的demo,后续开发过程同事模仿相关接口,一定程度上提高了开发效率。


3、关键技术实现

带团队开发并且是带领成员第一次做Python项目,自然要将有挑战的任务安排给自己。在关键技术的实现上挑选三个有代表性的讲解。三个分别是:系统命令执行通用接口、流式日志、sqlite 多线程写问题解决。

系统命令通用接口

项目主要用于公司开发的其他系统安装和升级,因此需要调用运维人员用ansible编写的相关脚本。调用的ansible脚本格式如下:

ansible-playbook 03.mysql.yml
ansible-playbook 08.zk.yml

需要到指定的路径下执行如上的命令。在详细设计阶段就知道需要使用Python调用系统命令的工具,所以就让应届生同事调研了subprocess模块,输出相关文档。一来是给新人一个学习方向,再则借这个机会熟悉项目需要的技术。

在开发阶段根据对相关模块的理解,完成了通用接口的开发。写通用接口切忌朝令夕改,依赖它的代码也要随之变化。一两次还能接受,次数多估计要被问候祖宗了。所以该接口实现程度不仅仅是写完,而且是自己亲自调用,确认没有问题才宣告完成。

在没有完成之前耐着性子调试,直到没有任何问题才在群里告诉其他开发人员。整个系统中需要大量的调用该命令执行脚本,最终也都比较顺利的完成,没有因为接口造成的bug。

流式日志

按照产品的设计,当一个组件在安装时需要在web页面上展示日志,并且日志的格式要和终端中安装日志一样,也就是一行一行的滚动打印。产品对日志的要求是全量滚动展示,刷新页面要能够再次全量展示出来。为了实现该功能,调研了三个方案:

一、定时刷新。缺点:日志有几万行,每一次读取全部日志给前端,前端会卡顿,而且打印也不连续,体验不好。

二、websocket。可以完成后端向前端的主动推送,但是刷新页面并不会从头开始推送。

三、流式响应。可以将大块文件切分成小块分批传给前端,刷新页面时会再次从头开始推送,符合要求。

经过对比最终使用了流式响应,也就是ChatGPT那种响应的方式。但是需要解决一个问题:什么时候结束推送?因为安装一边向文件中写入日志,流式日志一边读出日志,如果日志已经读完了安装还没结束,那这个时候肯定需要等待而不是停止响应。

解决办法是在安装完成之后插入标记字符,当流式日志读取到标记字符时就表明结束了,没有读取到标记字符则等待。核心代码如下:

def log_flow():query = request.valueslog_path = query["log_path"]def generate():with open(log_path, "r") as f:while True:chunk = f.read(800)if not chunk or chunk.isspace():time.sleep(0.1)if chunk == 800 * "-":breakcontent = json.dumps({"content": chunk})yield f"event: message\ndata: {content}\n\n"time.sleep(0.05)return Flask_response(generate(), mimetype="text/event-stream"

效果:

sqlite3 多线程写问题

在数据库存储这一块,领导钦定用sqlite3,咱也据理力争过用MySQL,but无效。领导说该项目只需要一个轻量的数据库即可,sqlite3轻量,所以就很合适。而且其他项目中已经使用的非常成熟了。好吧,既然领导坚持,我也只能硬着头皮上了。

开始还没问题,到了项目开发中后期就发现问题了,接口经常报错:

File "/home/ljk/.virtualenvs/idt_dev/lib/Python3.8/site-packages/peewee.py", line 3246, in execute_sql
cursor.execute(sql, params or ())
File "/home/ljk/.virtualenvs/idt_dev/lib/Python3.8/site-packages/peewee.py", line 3014, in __exit__
reraise(new_type, new_type(exc_value, *exc_args), traceback)
File "/home/ljk/.virtualenvs/idt_dev/lib/Python3.8/site-packages/peewee.py", line 192, in reraise
raise value.with_traceback(tb)
File "/home/ljk/.virtualenvs/idt_dev/lib/Python3.8/site-packages/peewee.py", line 3246, in execute_sql
cursor.execute(sql, params or ())
peewee.OperationalError: database is locked

查询之后发现是sqlite3不支持多线程写。sqlite3支持事务,是用库锁来完成的。当一个写入开始后,整个数据库都加锁了,再次有写操作就会报错。

这个问题首先从技术上是不好解决的,sqlite3的架构设计就是如此,还能让它支持多线程写吗?只能通过业务逻辑解决。经过一次会议讨论之后,得出几个解决方法:

  • 分库。将写操作分到不同的库里完成。既然写操作会锁库,那就分出不同的库,就能避免锁库的问题。
  • 全局写队列。将所有的写放到一个消息队列里面,将多线程的写变成串行的写。
  • 全局写标识。所有的写操作开始前判断是否有可写标识,能写入就写入,否则接口返回,告诉前端数据库繁忙。

经过投票,大家一致决定用第三种方式实现,技术难度最小,代码侵入性最少。因为第三种方案是我提出来的,所以最终由我来完成。具体的过程可参见另一篇文档《peewee操作sqlite锁表问题分析》。

最终是解决了该问题,虽然不是优雅,但是在目前的时间成本和风险控制上局部是最优解了。后续将调研peewee这个ORM框架提供的sqliteQueueDatabase实现写队列。

摘录于peewee扩展插件playhouse:

SqliteQueueDatabase可作为常规SqliteDatabase。如果你想简单点 read and write 从访问sqlite数据库多线程.

SQLite在任何给定的时间只允许一个连接写入数据库。因此,如果您有一个多线程应用程序(例如Web服务器)需要写入数据库,当一个或多个尝试写入的线程无法获取锁时,您可能会偶尔看到错误。

SqliteQueueDatabase 旨在通过一个长期存在的连接发送所有写查询,从而简化操作。好处是,您可以看到多个线程在向数据库写入时没有冲突或超时。但是,缺点是您不能发出包含多个查询的写事务——本质上,所有写操作都在自动提交模式下运行。


4、个人感受

第一次带团队开发,才明白很多事情。

做项目的主人公

第一真正理解什么叫主人公意识。各种文章都说要对项目有主人公意识才能成长更快。我感觉只有站在这样一个位置上才能感受到这种意识。

项目进度的第一责任人就是你,项目中出现了大大小小的问题都是找你。领导会问题项目进度如何,有没有阻塞,能不能按期完成?队员会问这个校验框架是否ok?这个语法有没有问题?测试会找你说这个bug该给谁的?所以你必须对这个项目了如指掌,小到代码的一个配置项,大到工程进度的把控。开发过程中有任何问题都得及时顶上,组长就是一块砖,哪里需要哪里搬~

团队和谐

再说说团队的和谐。以前做一个小开发,只要完成自己的任务就可以了,团队的氛围影响我写代码的速度吗?带团队开发就不一样。团队中有各种特点的同事,有埋头苦干不汇报进度的、有能力强脾气差的、有脾气好进度慢的。总之各种性格的人都会存在。

本次开发中就遇到了一个能力强脾气差的,看到技术上小问题就直接群里开怼,谁不是热血小青年?第一次遇到这种情况可想而知。领导不得不为此找我们谈话一两次,甚至惊动了大部门领导。那段时间团队氛围特别差,没有人说话。我也不敢多说什么,害怕气氛更差,项目不能如期完成,到那个时候不是我的问题也变成我的问题了。所以只能选择忍一忍,尽量回避分歧。好在领导的谈话起到很大的作用,该安抚的安抚,该批评的批评,后来也没有发生语言的冲突,顺利按期完成项目。


5、总结

第一次带团队做项目对我来说是一次挑战和提高。从技术层面讲让我以后面对技术选型时能以更高的角度看待问题;从个人角度讲这是一次难得的机会让我负责开发团队,对接测试团队、前端团队、运维团队等。这对我的沟通交流都是一次锻炼。

最后,希望下一次做的更好,让所有组员都能有一些进步。

开发工具推荐

JNPF,很多人都用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

原理是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。

官网:www.jnpfsoft.com/?csdn,如果你有闲暇时间,可以做个知识拓展。

这是一个基于Java Boot/.Net Core构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,满足快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的Demo方便直接使用;后端框架支持Vue2、Vue3。

为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机考算法题:分奖金

题目部分 题目分奖金难度难题目说明公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字…

JAVAWEB,tomcat,MVC

注意,这里有三大语言来实现动态网页技术 如果用户访问的是静态内容,比如固定html页面,web服务器就够了 其中,中间件帮忙处理很多东西,复杂的东西他来帮忙完成 正常来说,搭建web服务需要web服务器,web容器两个东西,但是tomcat相当于集成了这两个,不过有些项目里不会把tomcat当做…

zemax优化功能

1、三种优化方法 zemax的三种优化方法中,局部优化会找到局部的极小值点,全局优化会找到整体的最小值点。 锤形优化适用于先用全局优化找到大概值后,进一步完善光学系统 对于评价函数单调或者局部最小值就是全局最小值的情况,使…

java可以跨平台的原因是什么?

因为不同平台可以安装对应的JVM(Java Virtual Machine),它是C/ C写的,JVM可以屏蔽所有和平台相关的信息,并帮助把Java文件经过编译后生成的和平台无关的class类文件(也就是字节码)从硬盘读取到内…

Kafka3.1部署和Topic主题数据生产与消费

文章目录 前言一、Kafka3.1X版本在Windows11主机部署二、Kafk生产Topic主题数据1.kafka生产数据2.JAVA kafka客户端消费数据 总结 前言 本章节主要讲述Kafka3.1X版本在Windows11主机下部署以及JAVA对Kafka应用: 一、Kafka3.1X版本在Windows11主机部署 1.安装JDK配…

微服务·架构组件之服务注册与发现-Nacos

微服务组件架构之服务注册与发现之Nacos Nacos服务注册与发现流程 服务注册:Nacos 客户端会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。 Nacos Server接收到注册请求后,就会…

四川百幕晟科技有限公司:抖音名称最多多少字?

在抖音上,用户可以为其帐户选择昵称,该昵称显示在用户的个人资料中。不过,很多人好奇,一个抖音昵称到底能有多少个字?本文将深入探讨抖音昵称长度限制以及一些最吸引人的昵称示例。 1、抖音昵称长度限制 抖音昵称的长度…

虚拟机的ubuntu 22.04无法联网问题解决

问题:虚拟机的ubuntu 22.04无法联网 解决: 找到一种配置的方式,使用命令:sudo dhclient -v

Python中的包管理方法

在Python开发中,包管理与依赖问题一直是开发者头疼的问题之一。随着项目规模的增大和复杂性的增加,管理各种依赖包和解决版本冲突变得尤为重要。本文将分享解决Python中的包管理与依赖问题的方法和工具,帮助开发者更好地管理项目中的依赖关系…

基于python+txt的学生成绩管理系统

基于pythontxt的学生成绩管理系统 一、系统介绍二、效果展示三、其他系统实现四、获取源码 一、系统介绍 录入学生信息查找学生信息删除学生信息修改学生信息排序统计学生信息显示所有学生信息 基于python的学生成绩管理系统,具备基本的增删改查功能,包…

宠物行业如何进行软文营销

如今,宠物已经成为了人们生活中不可或缺的一部分,大众对于萌宠的喜爱与日俱增,随着“萌宠经济”升温,越来越多的商机开始出现,伴随着宠物市场竞争的日益激烈,宠物行业的营销光靠硬广告很难吸引受众&#xf…

基于FPGA的图像二值化处理,包括tb测试文件和MATLAB辅助验证

1.算法运行效果图预览 将FPGA的数据导入到matlab进行显示 2.算法运行软件版本 Vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps ............................................................................. module test_image;reg i_clk; reg i_rst; r…

使用亚马逊云科技人工智能内容审核服务,打造安全的图像生成和扩散模型

生成式人工智能技术发展日新月异,现在已经能够根据文本输入生成文本和图像。Stable Diffusion 是一种文本转图像模型,可让您创建栩栩如生的图像应用。您可以通过 Amazon SageMaker JumpStart,使用 Stable Diffusion 模型轻松地从文本生成图像…

轻松搭建本地知识库的ChatGLM2-6B

近期发现了一个项目,它的前身是ChatGLM,在我之前的博客中有关于ChatGLM的部署过程,本项目在前者基础上进行了优化,可以基于当前主流的LLM模型和庞大的知识库,实现本地部署自己的ChatGPT,并可结合自己的知识…

GC 算法与种类

对于垃圾收集(GC), 我们需要考虑三件事情:哪些内存需要回收?如何判断是垃圾对象?垃圾回收算法有哪些? 一、GC的工作区域 1、不是GC的工作区域 (1)程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的&…

yolov8 模型部署--TensorRT部署-c++服务化部署

写目录 yolov8 模型部署--TensorRT部署1、模型导出为onnx格式2、模型onnx格式转engine 部署 yolov8 模型部署–TensorRT部署 1、模型导出为onnx格式 如果要用TensorRT部署YOLOv8,需要先使用下面的命令将模型导出为onnx格式: yolo export modelyolov8n.p…

FPGA时序分析与约束(2)——时序电路时序

一、前言 在之前的内容中,我们介绍了组合电路的时序问题和可能导致的毛刺,强烈推荐在阅读前文的基础上再继续阅读本文, 前文链接:FPGA时序分析与约束(1)——组合电路时序 这篇文章中,我们将继续…

MySQL表空间

MySQL表空间 文章目录 MySQL表空间1. MySQL中的表1.1 IOT表1.2 InnoDB逻辑存储结构2. 独立表空间2.1 段 segment2.1.1 段的概念2.1.2 段的分类2.1.2.1 叶子节点段主要结构2.1.2.2 非叶子节点段2.1.3 碎片区2.2 区2.2.1 区的概念2.2.2 区的结构2.2.2.1 XDES Entry结构2.3 页2.3.…

基于51单片机的称重电子秤proteus仿真设计

一、设计背景 随着微电子技术的应用,市场上使用的传统称重工具已经满足不了人们的要求。为了改变传统称重工具在使用上存在的问题,在本设计中将智能化、自动化、人性化用在了电子秤重的控制系统中。本系统主要由单片机来控制,测量物体重量部分使用称重传…

Activiti7工作流引擎:在线流程编辑器Activiti Modoler5.x

一&#xff1a;简介 有的时候我们的流程图需要业务人员自己绘制&#xff0c;然后使用自己绘制的流程图&#xff0c;此时就需要一个在线流程图编辑器需要集成到我们的web系统中。Activiti Modoler是Activiti官方推出的在线流程编辑器。 二&#xff1a;pom.xml <dependency…