背景

项目中存在「批量接口」和「增量接口」,两个接口都更新DB中的数据。

如存在以下表格,主键为shopId,shopName表示店名。

shopId

shopName

111

info111

222

info222

333

info333

有以下两个接口:

updateShopNameBatch(List shopIdList, String shopName);

updateShopName(Integer shopId, String shopName);

两个接口的功能分别为批量修改门店名称和单个修改门店名称。

忽略接口中的其他操作,主要执行了以下两句sql。

update Shop set shopName = #{shopName} where shopId in

#{shopId}

update Shop set shopName = #{shopName} where shopId = #{shopId}

两个sql可能会修改同个shopId的shopName属性,存在一定的并发问题。

从数据库层看,两个sql的执行过程完全隔离,即先到先执行。

从接口层面看,批量更新接口和增量更新接口的并发执行会遇到以下情况:

批量接口先于增量接口收到请求,然而由于批量接口中执行了一些额外操作,导致增量接口先执行sql。最终结果被批量接口覆盖。

接口调用发起方先调用批量接口,再调用增量接口,然而由于网络问题,增量请求先于批量请求到达服务提供方。

用户先点击批量修改按钮,再修改了单个门店的名称。在分布式系统中,两个请求打到了不同服务器,由于服务器负载不均,导致增量接口的sql先于批量sql执行。

……

这个例子较为常见,由于分布式,网络,处理速度等原因,用户先发起的请求,可能会被延后。

问题

这里就引出请求顺序的问题,请求A和请求B,到底是哪个先发生。

在分布式系统中,一般很少去关注两个请求哪个先发生,因为:

多数接口为查询接口,并不关心请求的先后顺序。

很少存在批量接口和增量接口同时被调用的场景。

当同时使用批量接口和增量接口时,则需要着重关注这个问题。

接口调用示意图如下:

批量接口和增量接口调用顺序

解决思路

考虑到需要区分请求发生的先后,首先想到的是时间戳。

调用发起方在调用批量和增量接口时,增加时间戳入参。

在服务端,将时间戳作为当前sql记录的版本号。

如果库中的版本号小于入参时间戳,则支持更新。

如果库中的版本号大于入参时间戳,则不更新。表示已有后发起的请求更新了数据库。

然而,在分布式环境下,时间校准也是个难题。

因为无法保证批量接口和增量接口从同个服务器发起。

不同服务器之间存在时间误差,则无法保证入参时间戳的准确性。

分布式场景如下:

分布式场景

考虑到时间准确性,想到时间协议。

在网络时间协议中,有一种常用的协议,NTP。

其作用是让服务器时间和源服务器时间对齐。

NTP协议的流程图如下:

NTP协议

NTP协议过程:

客户端向服务器发送请求,并记录客户端时间为T1。

NTP服务器收到请求,记录服务端时间为T2。

服务端做一些处理,响应客户端请求,并记录服务端时间为T3。

客户端收到响应,记录客户端时间为T4。

可得:

NTP服务端处理时间为T3 - T2。

整个过程耗时为T4 - T1。

得到往返网络延时为(T4 - T1) - (T3 - T2)。

假设请求网络延时为delay1,响应网络延时为delay2,客户端和NTP服务端的时差为d。

得到T1 + d + delay1 = T2, T3 - d + delay2 = T4。

使用等式干申大那多,得到(T2 - T1) + (T3 - T4) = 2d + (delay1 - delay2)。

在NTP协议中,默认delay1 = delay2,即d = ((T2 - T1) + (T3 - T4)) / 2。

当网络足够稳定时,delay1约等于delay2。那么,网络越不稳定,误差也就越大。

在分布式中,不同客户端与NTP服务端之间的网络情况不同,将引入另一个误差因素。

采用方案

查看NTP协议之后,发现其误差为毫秒级别。

NTP意图将所有参与计算机的协调世界时时间同步到几毫秒的误差内。 —— 维基百科

正常情况下,批量接口和增量接口的响应时间为毫秒级,所以NTP协议的误差是不能接受的。

最终采用了一种较为粗暴的方案:

每条sql记录都有一个版本号,初始值为0。

在执行批量之前,首先select,查出版本号为verison。

执行update时,将版本作为参数带上,即update Shop set shopName = #{shopName} where shopId = #{shopId} and version = #{version}

如果update语句返回结果为1,则表示执行成功;如果返回为0,则表示在批量select和update过程中,已被增量接口修改,即遇到并发问题。

如遇到并发问题,执行告警操作,并进行人工数据对齐。

因无法确认批量接口和增量借口发生的先后顺序,最终采用了出错告警,人工校对的方案。

该方案low中带着一些粗暴。

换个思维角度,也算是一种乐观并发的思维,乐观地认为批量接口和增量接口很少会出现并发。即使出现并发问题,在服务器之间交错调用后,最终结果有一定概率是正确的。(逃

后记

求比较优雅的,用于解决批量、增量接口并发问题的方案,感激不尽。

ntp服务器响应每秒请求数量,批量、增量接口并发问题和NTP协议相关推荐

  1. 远程ntp服务器响应模式6查询,The remote NTP server responds to mode 6 queries.

    对内网网络设备进行了一次漏洞扫描,主要是Cisco交换机.报了一个级别为Medium的漏洞,The remote NTP server responds to mode 6 queries. 我的简单 ...

  2. 什么请求服务器响应快,HTTP请求与服务器响应流程

    1. H遇新是直朋能到分览支体调TTP 简介 1.遇新是直朋能到分览1定义 用能境战求道,重件开又是正易里是了些之框 1.2 请求/响应报文格求圈分件圈浏第用代是水刚道.的它还式 1.3请求方式--G ...

  3. 远程ntp服务器响应模式6查询,NTP的工作模式 - S2750, S5700, S6720 V200R008C00 配置指南-设备管理 - 华为...

    多播模式 多播模式适用于服务器分布分散的网络中.客户端可以发现与之最近的多播服务器,并进行同步.多播模式适用于服务器不稳定的组网环境中,服务器的变动不会导致整网中的客户端重新进行配置. 多播服务器:多 ...

  4. php 请求 响应,PHP 取得服务器响应一个 HTTP 请求所发送的所有标头

    用户评论: Backslider (2012-02-15 19:06:56) It should be noted that rather than returning "false&quo ...

  5. ntp服务器无响应,NTP服务

    首先我们对于默认的client拒绝所有的操作 代码: restrict default kod nomodify notrap nopeer noquery 然后允许本机地址一切的操作 代码: res ...

  6. linux下ntp服务器安装包,Linux下NTP服务器部署

    1需求分析为服务器群提供统一的时间同步方案. 2实施规划 2.1NTP时间服务器 NTP服务器[Network Time Protocol(NTP)]是用来使计算机时间同步化的一种协议,它可以使计算机 ...

  7. 运维小知识之企业内部NTP服务器基础安装与配置使用

    0x00 前言简述 基础概念 服务方式 公共 NTP 服务器 0x01 服务器安装配置 CentOS Ubuntu (1) NTP 服务 (2) Chrony 服务 0x02 NTP客户端配置 Win ...

  8. 运维实战之企业内部NTP服务器基础安装与配置使用

    ​ 关注「WeiyiGeek」公众号 将我设为「特别关注」,每天带你玩转网络安全运维.应用开发.物联网IOT学习! 文章目录 0x00 前言简述 基础概念 服务方式 公共 NTP 服务器 0x01 服 ...

  9. ntp服务器是什么,有什么用?

    ntp服务器隶属于小众时间频率行业,对于初次接触者和未涉猎此行业的人群来说,就会有很大的疑问:ntp服务器能做什么,为什么会需要ntp服务器? 本文主要通过这两个问题,对ntp服务器进行分总式的说明, ...

最新文章

  1. Data - 深入浅出学统计 - 下篇
  2. 在VC中实现模拟键盘,输入内容并显示在ListBox中。
  3. 万万没想到,一个可执行文件原来包含了这么多信息!
  4. 获取当前div以外所有部分
  5. 多功能嵌入式解码软件(2)
  6. vue中使用better-scroll实现滑动
  7. docker-for-windows配置了阿里云镜像,仍然无法获得链接:(Client.Timeout exceeded while awaiting headers)
  8. Python 根据文件绝对路径删除文件
  9. My in 2007
  10. 大咖来信 | 轮值董事长徐直军,复盘华为AI战略出台始末
  11. python基础语法、数据结构、字符编码、文件处理 练习题
  12. mdk 加static会被优化吗_网站关键词排名优化你会吗?深圳龙岗网络外包公司讲解...
  13. 【Citrix】XenCenter更新VM内存属性
  14. linux操作系统原理【3】
  15. python拼音识别多音字的包_一个有意思还有用的Python包-汉字转换拼音
  16. Capte4 布朗运动和伊藤公式
  17. 销售竞争情报实战--徐凌云老师
  18. PS标尺和标记线用法的简单记录
  19. 回归方法(一):用线性回归探究生育率
  20. srsLTE源码分析(一)---enb协议栈入口

热门文章

  1. 看直播赢大奖-智能物流技术培训
  2. N-MOS的G-S电容随着DS电压的变化关系
  3. STC自动高速下载线
  4. 更新不了_一个作者在起点中文网写小说,半年更新38万字,还是没签约成功
  5. unitoy机器人怎么联网_机器人操作说明
  6. android将矩阵转换成字节数组,android-使用OpenGL矩阵转换将纹理从“ 1D”映...
  7. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
  8. git 可视化工具_最值得推荐的8个git/github项目数据分析工具
  9. 从乘法表JAVA意思4_四、Java从头开始-我的九九乘法表(二)
  10. mysql9索引实战_课程介绍目录索引