我们部门的开发规范-《付钱拉开发规范手册》
以下是我们部门的开发规范
前 言
《付钱拉开发规范手册》是付钱拉技术团队对日常项目实战经验的总结,经历付钱拉技术平台多次的技术架构演进和实战总结整理而来,目的是能够帮助团队成员避免走过的一些坑。开发人员提供的代码质量越高,产品功能上线后发生的问题越少,付钱拉团队要求通过开发人员自身来保证代码质量,而不是完全依赖测试阶段。比如经常在项目中遇到的代码性能问题、线程安全问题、数据库SQL问题、操作问题等等。本规范手册通过付钱拉最为关注的编程规范、性能规范、安全规范、操作规范和支付相关几个方面来分享,在能帮助到付钱拉团队的同时希望也能帮助到其他开发人员。
一 编程规范
(1)防御式编程,根据有限枚举先处理断言,再处理错误,最后处理正常逻辑,正常逻辑外尽可能多的处理异常分支;
(2)开发自测代码必须有单元测试用例;
(3)新方案引进或者重大变更需要上级审核,比如表结构修改增加、中间件的引进、新项目的搭建等;
(4)上线任何功能都必须考虑实时监控埋点数据;
(5)上线任何功能都必须满足标准日志轨迹输出,把业务日志打印成表格的形式,方便通过实时日志解析展示可视化日志轨迹,方便快速问题订单跟踪;
(6)业务代码中所有SQL耗时打印耗时;
(7)业务代码中关键方法打印耗时;
(8)业务代码中异常栈禁止吃掉,需要打印到输出日志中,方便实时异常字抓取报警;
(9)和第三方接口交互,发生网络异常的地方需要抓取IOException处理,同时打印发生网络异常的URL,便实时异常字抓取报警;
(10)和第三方接口交互,需要设置连接超时和读取超时时间,避免同步线程阻塞;
(11)和第三方接口交互,需要考虑是否需要通过代理出网;
(12)和第三方接口交互,需要考虑是否要相互添加白名单;
(13)和第三方接口交互,需要考虑设置合适的work线程符合第三方并发数量限制;
二 安全规范
(1)页面请求参数严格限制或者校验处理,防止SQL注入;
(2)页面URL请求做细粒度的权限拦截,防止访问权限过大;
(3)部署在公网的应用做好防止XSS攻击的防范措施;
(4)和第三方系统交互需要互加白名单确保安全;
(5)系统全站提供HTTPS服务;
(6)和第三方系统交互报文需要加密传输;
(7)用户敏感数据做数据脱敏;
(8)预防页面被频繁请求,占用系统资源;
(9)预防API被频繁请求,占用系统资源;
三 性能规范
(1)常见OOM预防
1) 禁止应用中显示创建线程,避免不可控出现unable to create new native thread;
2) 控制select/update/delete/insert的数据级和可变集合的size,避免随着业务增加内存数据量不可控;
3) 页面查询不推荐全表查询,查询通过查询条件限制查询条数;
4) 页面下载条数和下载次数做限制,避免请求过多导致OOM;
(2)SQL优化目标必须满足range、ref或者consts,不可以是all类型,避免慢SQL导致连接数耗尽影响业务功能;
(3)代码书写中考虑MySQL中共享锁和排它锁场景,预防产生死锁;
(4)代码中不建议使用@Transactional,因为一般业务场景中用不到,它影响数据库性能并且多个操作可能在并发下导致数据库死锁;
(5)数据库单表达到一定数据量级需要做分库分表或者冷热数据隔离,避免业务增加带来的性能问题;
(6)尽量避免使用全局变量防止并发出现线程安全问题,从而影响业务;
(7)定时器问题预防
1) 定时器浪打浪情况下,任务重复处理会导致资金风险,建议使用redis避免;
2) 定时器浪打浪情况下,启动多个定时器即默认启动多个线程,影响系统性能;
3) 定时器浪打浪情况下,如果定时任务处理过慢会导致内存耗尽;(8)避免系统中出现单点故障,包括中间件和应用程序等所有的节点;
(9)能异步处理的别同步处理,异步可以释放线程资源,避免阻塞,提高响应效率;
(10)随着业务量的增加,考虑功能拆分和数据库表拆分,除此支付系统建议按照通道拆分,不同的通道指定独立的work线程,分而治之,避免相互之间影响;提高并发的一个思路就是拆分,拆分后通过异步提高并发效率;
四 操作规范
(1)上线功能模块必须进行灰度发布环境,以确保上线不会影响线上交易;
(2)上线功能模块判断是否需要进行额外的压力测试;
(3)上线功能模块判断是否需要考虑模块之间的先后上线顺序;
(4)上线功能模块判断是否需要运营提供额外支持,比如运营后台参数配置等事项;
(5)上线功能模块判断是否需要运维提供额外支持,比如配置网络环境、添加证书秘钥、创建文件目录、添加和删除jar包等事项;
(6)上线功能模块判断是否需要DBA提供额外支持,比如新增模块添加数据库访问白名单、增加数据库连接数等;
(7)上线功能模块判断是否添加了报警功能,包括业务监控、关键字监控、响应码监控等;
(8)上线功能模块判断是否需要执行额外SQL和有执行顺序;
(9)上线后产品是否需要进行业务点验收;
(10)线上功能模块发生事故或者bug,第一响应动作是通过灰度环境恢复系统而不是定位问题;
五 支付相关的注意点
(1)对于第三方查询接口查询订单不存在的情况需要设置单独响应码,做特殊报警提醒处理,付款类的交易不可以设置为失败状态,这样可以避免资金重付支付;查询操作本身失败代码异常处理中不可以设置订单失败;
(2)资金类交易订单状态设置是根据第三方响应码设置的,订单状态的设置采用保守策略,对于不确定的状态不可以直接设置失败,这样可以避免资金重付支付;
(3)资金类交易订单需要有额外的主动查询和核对查询,以避免第三方接口异常情况;
(4)资金类交易需要有自动路由切换功能,当第三方接口发生宕机的时候,确保后续交易可以引流到成功的通道;
(5)资金类订单需要考虑并发情况下的重复提交,收款类的交易可以重复提交订单提高成功率然后后续通过补偿机制处理,付款的类交易绝对不可以;
(6)资金类订单需要通过数据库乐观锁库和更新条数来避免并发修改同一条记录,进而避免重复支付产生的资金风险;
(7)核心交易系统需要做到7*24监控室轮流值班,确保交易系统第一时间发现问题修复问题;
(8)核心交易系统需要每天做日志巡检,这种弥补机制可以二次帮助确认系统问题,同时让每个同学更加了解系统;
转载于:https://www.cnblogs.com/zhangzhi19861216/p/6645317.html
我们部门的开发规范-《付钱拉开发规范手册》相关推荐
- Android开发技术框架和编码规范
Android开发技术框架和编码规范 2017年11月23日 目录 第一章 绪论.................................................... ...
- css宋体代码_前端开发必备的CSS命名规范与常用CSS代码集合
编辑 | web前端开发 来源 | web前端开发 我们在用html+css进行网页的排版布局时,经常会遇到CSS命名,如果是在团队多人协作开发时,团队里都会有自己的命名规范与要求. 但如果是自己在个 ...
- 肖锰:浪潮GS开发平台学习札记(三)——规范介绍
1.元数据命名规范 为了在不同的应用环境下更好的识别和管理元数据,我们制定了元数据开头命名规范,所有的元数据,应该以"开头+模块名称_实际含义"相结合的方式. 在填写编号和名称时, ...
- [Git] 拉开发分支的代码报错
Git拉开发分支的代码报错: fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型 转载于:https://github.com/Meowv/Blog 在实际开发过程中,每个公司可能不尽 ...
- mysql 开发规范_专业级的MySQL开发设计规范及SQL编写规范
在团队开发过程中为了项目的稳定,代码的高效,管理的便捷制定内部种开发设计规范是必不可少的, 这里分享一份我们定义MySQL开发设计规范包括表设计规范,字段设计规范,SQL编写规范 数据库对象命名规范 ...
- 阿里php开发规范,【PHP开发规范】老生常谈的PSR开发规范你懂多少?
这几天看了一下阿里技术发布的一套Java开发规范<阿里巴巴Java开发手册>,里面写了阿里内部的Java开发规范标准,写的很好.这套Java统一规范标准将有助于提高行业编码规范化水平,帮助 ...
- 【安全开发】IOS安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
- 前端规范 - 前端项目开发规范
0 前言 好好做业务,提高自己的工程能力 [强制] 1 开启eslint 根据团队的习惯,制定适合自己的rules 比如 no-console no-debugger可以关闭 [强制] 2 新项目使用 ...
最新文章
- 一个开源工作者对开源与赚钱的一些想法
- 目标检测再次革新!图灵奖得主团队提出Pix2Seq,将Detection变成了Image Captioning...
- Robotframework--随机选取下拉框的字段值进行搜索
- MySQL 时间戳转换成秒
- Vue Element校验validate
- 3.自编码器(变分自编码器,VAE)
- android控制wifi,基于 Android 手机操作和控制的 Wifi 小车程序设计
- ActionForm的详解
- Oracle表被锁死如何解锁
- 美国TJX公司 - MBA智库百科
- linux reboot 实现流程
- mysql 查询本月所有天数统计对应数据
- 北京智源大会 | AI + 医疗的下一个十年:从公共卫生预警到人类基因密码破解 道翰天琼认知智能api机器人接口。
- 「地图神器」MapOnline : ArcGIS在线地图加载插件
- 史上最强最逼真的游戏
- python图片保存_Python中读取,显示,保存图片的方法
- CAXA 2020电子图板设计从入门到精通视频教程
- 为什么网络钓鱼攻击仍然有利可图----以及如何阻止它
- LINUX去掉“哔哔叫”的方法
- python爬取新闻并汇总_【python】 爬虫-爬取新闻
热门文章
- java毕业设计Steam游戏平台系统mybatis+源码+调试部署+系统+数据库+lw
- 在执行zookeeper命令时,提示mntr is not executed because it is not in the whitelist
- SecureCRT 自定义标签
- 7种最常用数据分析思维,解决90%分析难题
- CSS中背景图定位方法
- e2fsck -y 故障_【计算机论文】非线性编辑系统构建及其故障维护
- 进阿里真的很难吗?看看我的阿里巴巴CTO线Java开发面经!
- Git Pull failed: Failed to start Git process…\JetBrains\IntelliJIdea2021.1\tmp\intelliji-git-askpass
- photoshop自动批阅_如何使用Photoshop智能对象自动执行多对象编辑
- 神奇的字符串-包含26个字母