《CURD系统怎么做出技术含量--怎样引导面试》有朋友开玩笑说都用上了领域驱动了,就不叫CURD系统了吧。这里我解释一下,怕大家对DDD领域驱动设计有什么误解。

DDD是为解决软件复杂性而生,但不仅仅可以被用于复杂的系统。它里面提到了很多技巧,其实CURD就是其中一种技巧。这些技巧适用于任何系统,哪怕是非常小型的系统,比如《CURD系统怎么做出技术含量--怎样引导面试》里提到的谦卑对象模型、充血模型。

今天咱们再提高一下CURD系统的门槛,连DDD技巧,咱也不用。就用写咱们平时都在写的最简单的接口。能说明设计理念,也能惊艳到面试官:

  • 两种设计方法

    • n+m返回值设计

    • 终态设计

  • 一种思维理念

    • 谁生产谁负责

两种设计方法

一个规范的系统要统一的入参标准和返回值标准,这种标准可以提高系统的稳定性,促进跨部门甚至跨公司之间更好的合作,价值很高。面试的时候值得跟面试官说一说。很多可能之前大家都做了,但是没有仔细思考其中的逻辑,你思考清楚了也会让面试官眼前一亮。

n+m返回值设计

一个接口入参有n个值,需要的返回值是m个值。在返回值中可以把入参和返回值一起返回。

这种设计便于追踪和排查问题:

为了防止调用方没有日志追踪号、打印日志过多等原因造成不方便跟踪请求的问题,可以设计返回值将入参一起打印。这样调用方可以通过一条日志方便的获取到入参和返回值。线上排查问题会非常方便。

假设有个场景,调用方的系统设计不方便请求追踪,比如没有线程追踪号。在高并发量场景下可能日志是这样的:

1、thread-1|ClassName|参数1:11,参数2:11

2、thread-2|ClassName|参数1:22,参数2:22

3、thread-1|ClassName|参数1:33,参数2:33

4、thread-2|ClassName|返回值:44

5、thread-1|ClassName|返回值:55

6、thread-1|ClassName|返回值:66

你能决定55和66对应的谁是1,谁是3的返回值吗?

但是如果返回值包含了入参,就好办多了,举个返回值例子:

thread-1|ClassName|{参数1:11,参数2:11,返回值:55}

这样就一目了然。有的时候可能是调用方本身的设计问题,但是如果被调用方能通过巧妙的设计帮助调用方。一旦遇到问题,调用方可以自己先进行排查,不用马上联系被调用方帮忙。即节约了自身的成本,又体现了专业性,何乐不为。

终态设计

《实战并发-使用分布式缓存和有限状态机》里我讲过有限状态自动机。有限状态机涉及状态流转。状态从分类上可以分成三种:初始状态、中间状态和终态。这段时间不是一直在将TCP底层通信嘛,来一张TCP状态的流转图体会一下:

有限状态机的重点在于有限,要有起点和终点。也就是一定要有终态。在《稳定性三十六计-超时处理》我讲过:

在传统的单机系统中,调用一个函数,要么返回成功,要么返回失败。这就是两态系统(2-state system)。

在分布式系统中,由于系统是分布在不同机器上的。还可能有一种状态叫:超时。成功、失败和超时是分布式系统调用的三态。

超时不是终态,而是一种中间状态:最终有可能下游是成功了,也有可能是失败了。这时候我们需要在超时之后推定一种状态,推定成功或者失败。究竟是成功还是失败因功能而已。

比如付款操作,不知道是否成功就推定是成功的,那用户可能没有付款就拿到了商品或者享受了服务。商家就会资金损失。所以一般会推定失败。让用户再次支付。最终通过查询或者对账发现用户实际是支付成功的,可以再把钱给用户退回去,保证交易的公平性。

退款恰恰相反,需要推定成功。告诉用户,钱退给你了。最终通过查询或者对账发现实际是退款失败了,可以系统重新发起退款,直到真正退成功为止。

后台管理系统也很需要这种终态设计。比如发布系统,发布了一个功能,发布系统如果出现了问题,这次发布没有结束。用户可能没有办法进行下一次发布。这时候可以设置超时自动结束,防止未结束的流程始终在那里,起码会干扰视线,增加判断成本。

一种思维理念

谁生产谁负责

在《设计开发中要避免的两个坑和一种可借鉴的设计思想》中我建议项目千万不要叫base、basic之类包罗万象的词,容易造成边界不清。

之前有人就跟我说过:这个数据我们只是提供,数据不是我们自己要用,而是有几个团队都要用,放在我们这里不合适。有base模块,那就应该放到base里啦。

从领域上来说,这种思维理念不对,数据应该谁生产谁负责。

举个例子:我们创建了一个系统,是toC的。开发这个系统的人能说这个系统是十几亿中国人用的,放在我们这里不合适,让十几亿中国人自己维护去?用户有很多,系统开发源头是一个,这就是谁生产谁负责。对于系统是这样,数据也是这样。

总结

这种小的设计技巧还有很多,比如两码一态设计。仔细思考自己的工作,你也许会被自己惊艳到。

往期推荐

那些影响深远的弯路

MySQL常见6个考题在实际工作中的运用

那些年犯过的错

达到什么标准就可以上线了?

CURD系统怎么做出技术含量惊艳面试官的更多相关文章

  1. CURD系统怎么做出技术含量--怎样引导面试

    引子 很多朋友可能会因为自己做的工作不是特别核心或者业务简单而引起面试中没有自信.但是很多公司面试的时候是可以接受面试者之前岗位的并发量.交易量低一些的.比如我们要招聘和我们交易量同等级或者以上的出来 ...

  2. 惊艳面试官的 Cookie 介绍

    Cookie 是什么 Cookie 是用户浏览器保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上. Cookie 主要用于以下三个方面: 会话状态管理(如用户登录 ...

  3. 我一个五年Android开发,居然被一个技术不如我的面试官嫌弃了......

    背景 首先介绍一下自己的情况.目前所在的是一家小的创业公司,待了5年多,薪资一般吧.由于这几年公司也在转型.工作经历大概可以分为 3 个阶段. 第一阶段是从进公司开始做 android app 开发, ...

  4. 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】

    转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com ...

  5. 20 个具有惊艳效果的 jQuery 图像缩放插件

    jQuery相对与Flash的魔力已经贯穿整个网络.尽管,Flash层被认为是用于网页设计的首选,然而随着jQuery的出现,以及他的酷似Flash的交互式特效使得网页更加的优雅——Flash开始靠边 ...

  6. 惊艳!9个不可思议的 HTML5 Canvas 应用试验

    HTML5 <canvas> 元素给网页中的视觉展示带来了革命性的变化.Canvas 能够实现各种让人惊叹的视觉效果和高效的动画,在这以前是需要 Flash 支持或者 JavaScript ...

  7. 使用 HTML5 Canvas 绘制出惊艳的水滴效果

    HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...

  8. 分享10款效果惊艳的HTML5图片特效

    在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...

  9. python实战===2017年30个惊艳的Python开源项目 (转)

    本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...

随机推荐

  1. GoLang设计模式15 - 策略模式

    策略模式是一种行为型设计模式.通过策略模式,可以在运行时修改一个对象的行为. 接下来仍然是通过例子来了解策略模式.比如说内存缓存,这是我们在开发中经常使用的东西,大家应该都有一定的了解,接下来就用内存 ...

  2. Linux下Zabbix5.0 LTS添加MySQL监控,实现邮件报警并执行预处理操作

    依据前文:Linux下Zabbix5.0 LTS监控基础原理及安装部署(图文教程) 环境,继续添加MySQL应用集. 第一部分:添加Zabbix自带的MySQL应用集. 在ZabbixClient-0 ...

  3. 日志收集之rsyslog to kafka

    项目需要将日志收集起来做存储分析,数据的流向为rsyslog(收集) -> kafka(消息队列) -> logstash(清理) -> es.hdfs: 今天我们先将如何利用rsy ...

  4. react之路由

    功能:让用户从一个视图(组件)导航到另一个视图(组件) 前端路由是一套映射规则,在React中,是URL路径与组件的对应关系 使用React路由简单来说,就是配置路径和组件 路由的使用 1.安装路由 ...

  5. [hdu7099]Just Another Data Structure Problem

    不难发现,问题即求满足以下条件的$(i,j)$对数: 1.$1\le i<j\le n$且$a_{i}=a_{j}$ 2.$\min_{i\le k\le j}y_{k}\ge l$且$\max ...

  6. [bzoj5291]链上二次求和

    记$bi=b_{i-1}+ai$,$ci=c_{i-1}+bi$,那么答案就是$\sum_{i=l}^{r}\sum_{j=0}^{n-i}b_{j+i}-bj=(r-l+1)cn-\sum_{i=l ...

  7. SpringCloud升级之路2020.0.x版-43.为何 SpringCloudGateway 中会有链路信息丢失

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在开始编写我们自己的日志 Filter 之前,还有一个问题我想在这里和大家分享,即在 Sp ...

  8. Python+selenium之键盘和鼠标事件

  9. js 鼠标放到图片上放大某一部分效果

    动图效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  10. Linux下脚本文件第一行的作用

    Linux下脚本文件第一行的作用 在Linux/Unix系统中,你可以在脚本hello.py顶部添加以下命令让Python脚本可以像SHELL脚本一样可直接执行: #! /usr/bin/env py ...