为什么VPS打开网站的速度如此缓慢,建立网站的花费是否合理?

摘要:vps打开网站很慢,创建一个网站的费用,集安网站制作,广东seo教程在过去的一个半月里我第一次作为后端开发组长角色参与公司项目从0到1的开发,记录这一次开发的经历。 1、背景介绍 首先说明一下背景。我所在的公司
vps打开网站很慢,创建一个网站的费用,集安网站制作,广东seo教程在过去的一个半月里我第一次作为后端开发组长角色参与公司项目从0到1的开发#xff0c;记录这一次开发的经历。 1、背景介绍 首先说明一下背景。我所在的公司是做智慧社区相关业务#xff0c;开发的项目是系统升级工具#xff0c;方便公司实施同事安装和升级系统。 参与后…在过去的一个半月里我第一次作为后端开发组长角色参与公司项目从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数据库框架。核心的技术包括 1web框架 Flask 2数据库ORM框架 peewee 3数据库 sqlite 4运维脚本执行模块 subprocess 5WSGI服务 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 fevent: message\ndata: {content}\n\ntime.sleep(0.05)return Flask_response(generate(), mimetypetext/event-stream 效果 sqlite3 多线程写问题 在数据库存储这一块领导钦定用sqlite3咱也据理力争过用MySQLbut无效。领导说该项目只需要一个轻量的数据库即可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构建到页面设计与传统软件开发几乎没有差异只是通过低代码可视化模式减少了构建“增删改查”功能的重复劳动。