程序常用的设计技巧 - 编程一生

xiexj 2021-11-16 原文


程序常用的设计技巧


一、背景

程序的定义:程序=数据+算法+接口

 

二、常用技巧

技巧1 – 按目标设计接口做幂等设计

– 场景

背景:做任务赚积分。前端发出增加积分请求,如果收不到响应会重试。

 

后台开发人员:怎么判断是重试还是另一次请求?

 

解决方案:接口定义中需要传入原来积分是多少,增加到多少。开发人员直接将目标结果入库。

 

疑问:那实际生产环境发现了原来积分一样,增加到多少不一样的结果怎么办?

 

答疑:这说明上线的产品中肯定有漏洞或bug。怎么办?改bug呗!

 

– 解析

幂等性设计的定义:一次和多次请求某一个资源应该具有相同的副作用。直白点讲就是多次重试可以多次查询,但是修改更新应该只进行一次。

 

作为开发正确的观念应该是外部调用失败是常态,并且失败之后必然有重试。

不要靠巧合编程  –《程序员修炼之道》

 

技巧2 – 多版本并发控制解决并发问题

– 场景

背景:上文中的做任务赚积分,后台收到了增加积分请求。

 

开发人员:为了避免重试,我该怎么写代码呢?

 

解决方案:update XXX set score=XX where score=X

 

– 解析

多版本并发控制MVCC(MultiVersion Concurrency Control)的定义:该策略主要使用update with condition(更新带条件来防止)来保证多次外部请求调用对系统的影响是一致的。这也是「乐观锁」的主要思想。

 

乐观锁的定义:假设最好的情况,数据在变更的时候不会被别人更新,如果更新了,某个值就会改变。所以就用这个值来作为判断条件,只有条件为真才更新成功。

 

总是为并发进行设计  –《程序员修炼之道》

 

技巧3 – 预判断准入控制避免「箭头型」代码

– 场景

背景:上文中后台收到了增加积分请求,传入了一个负数的积分。

 

开发人员:我就if 正数 才往下执行就好了呀?

 

结果:一层层的判断下来,代码变成这个样子。

 

疑问:怎么解决这种复杂的「箭头型」代码问题呢?

 

答疑:「卫语句」在预判断时做准入控制。

 

– 解析

卫语句(guard clause)的定义:先对异常情况做检查,异常则直接返回。

最终一个请求被完美的分成预判断检查和正式执行两个部分,逻辑清晰,简单明了。

 

早重构,常重构  –《程序员修炼之道》

 

技巧4 – 异步设计分离响应和执行

– 场景

背景:上文的增加积分,并发量太大,因此采用了队列设计,大量请求排队等待数据库变更。

 

开发人员:这样后台接口部分很容易都在等着响应,服务被拖死。

 

解决方案:准入校验做充分,请求放到队列里后直接给用户返回操作成功。

 

疑问:万一最后失败了呢?

 

答疑:知道失败了还不修数据吗?数据补偿保证最终与对用户承诺一致撒。

 

– 解析

1/3/5秒原则:在1s以内得到响应,用户会觉得系统响应很快,体验非常好;1-3秒得到响应,用户可以接受,体验还不错;3-5秒才响应,用户就感觉慢了,体验有点糟糕;一旦响应超过5秒,用户就会认为是个失败的体验,选择离开或重新发起请求。

 

三、总结

思考!你的工作!  –《程序员修炼之道》

 

相关阅读:

 

相关阅读:

 

《程序员修炼之道》解读

 

到底多大才算高并发?

 

美团分布式服务通信框架及服务治理系统OCTO

 

发表于
2019-02-26 11:37 
编程一生 
阅读(1230
评论(2
编辑 
收藏 
举报

 

版权声明:本文为xiexj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiexj/p/10436254.html

程序常用的设计技巧 - 编程一生的更多相关文章

  1. Android SDK 安装与配置 – 爬蛇

    Android SDK 安装与配置 1.下载sdk包  链接:https://pan.baidu.com/s/ […]...

  2. iOS应用千万级架构:MVVM框架 – jiangys

    iOS应用千万级架构:MVVM框架 2020-07-06 23:50  jiangys  阅读(7584)  […]...

  3. 小米3刷机教程 – Xproer-松鼠

    小米3刷机教程 尽管小米3已经内置了小米Miui V5系统,不过小米系统更新很快,如果想体验最新版的话,还是需 […]...

  4. mysql:10道mysql查询语句面试题 – xiaobai小白

    mysql:10道mysql查询语句面试题 表结构 学生表student(id,name) 课程表course […]...

  5. 第一个用户进程 – Android 的 Init 进程

    Init 进程是 Linux 内核启动后创建的第一个用户进程,地位非常重要。Init 进程在初始化过程中会启动 […]...

  6. Spring IOC 容器源码分析系列文章导读

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 […]...

  7. SpringBoot + Mybatis搭建完整的项目架构

    准备工作: Java开发环境  已安装 springboot 插件(STS)的 Eclipse MySQL服务 […]...

  8. jsp中引入jstl、css、jsp等 – cdeelen

    页面中引入JSTL,使用编译器指令<%@ tagbil ..>指令 <%@taglib pr […]...

随机推荐

  1. axios 请求超时,设置重新请求的完美解决方法

    自从使用 Vue2 之后,就使用官方推荐的 axios 的插件来调用 API,在使用过程中,如果服务器或者网络 […]...

  2. 软件工程——第一章 软件和软件工程的基本概念【转】

    第一章软件和软件工程的基本概念 什么是软件(software)? 顾名思义:软件就是软的(soft),和硬件( […]...

  3. Python3爬虫登录模拟

    使用Python爬虫登录系统之后,能够实现的操作就多了很多,下面大致介绍下如何使用Python模拟登录。 我们 […]...

  4. MySQL深入研究–学习总结(2)

    前言 接上文,继续学习后续章节。 第四章&第五章《深入浅出索引》 这两章节主要介绍的索引结构及其如何合 […]...

  5. 从原理层面掌握@InitBinder的使用【享学Spring MVC】

    每篇一句 大魔王张怡宁:女儿,这堆金牌你拿去玩吧,但我的银牌不能给你玩。你要想玩银牌就去找你王浩叔叔吧,他那银 […]...

  6. 斯佩里左右脑分工理论

    斯佩里左右脑分工理论 偶然的机会看到一张图,模糊的记得当时上学的时候学习过类似的知识,具体的内容实在是记不起来 […]...

  7. Windows不需要输密码,直接登录显示桌面

     转载: https://jingyan.baidu.com/article/b7001fe1713f980e […]...

  8. Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作

    一:查看本地ssh服务 Linux系统下安装启动ssh服务,下面以CentOS版本Linux系统为例: 1.检 […]...

展开目录

目录导航