《阿里巴巴Java开发手册》条例解读(一)

  • 时间:
  • 浏览:2

在IOT场景下,不同的终端设备都要分配不同的物联网卡进行数据通信,最基本的限制也不一张卡里还里能 分给一两个 设备。为甚让,一张卡分给多个设备为甚让原困卡被交替使用,不同的终端使用同一张卡交替上线下线,进一步原困运营商停卡和客户投诉。即便是絮状的一卡多分在业务上也是那末接受的。而分卡服务必定都要部署多个服务节点,单个节点肯定无法满足大业务量都要,并发/并行地选中并占用同一张卡是必然会出現的(并发/并行防止的概念请自修)。为甚让絮状终端请求到达服务端后,会被后端无具体情况服务的多个节点防止,不同的终端分卡请求会落在不同的节点上,这时不同的终端为甚让会被不同的服务节点分配同一张卡。比如节点A的终端TA请求占卡1,表示为1-TA,和节点B的终端请求TB占卡1,表示为1-TB。为甚让你是什么 两个 不同节点上的请求请求完后 后相差1毫秒的时间更新了数据库,原困的结果是TA分到了卡1,并返回给终端,紧接着TB也被认为分到了卡1并返回给终端,一卡多分。但系统中的最终记录是1-TB,终端TB占有卡1。可一毫秒前从业务的角度看是终端TA占的卡1。于是在接下的一段时间,终端TA和终端TB轮流使用用卡1,卡1会被不断地上线又踢下线又上线,循环反复。如下图

> 【6.11】【强制】并发修改同一记录时,防止更新丢失,都要加锁。要么在应用层加锁,要么在缓存 加锁,要么在数据库层使用乐观锁,使用 version 作为更新法律法律依据”。

全都“更新丢失”更准确的描述是“更新覆盖”,当一两个 应用应用守护进程修改某条业务数据不会被完后 详细不知情的应用应用守护进程覆盖数据,原困在整个业务层面数据具体情况的不一致,为甚让“都要加锁”。为甚让规范中并那末 明确应该缘何选择在哪几种样的场景下使用哪几种样的锁。

为了应用服务还里能平滑横向扩容,那末 对业务具体情况有特定要求的场景,朋友儿通常会把应用设计成无具体情况应用,当业务压力增大只都要通过增加应用服务节点就能满足提升防止能力的要求。对于上述占卡的应用场景,系统选择多应用节点并行防止分卡请求,来提升系统吞吐量。为甚让仅仅选择在单应用节点加上锁,还里能 防止多节点多应用应用守护进程并行防止原困的数据冲突。但为甚让选择缓存(Redis)锁,把卡资源作为锁对象,则都要将数据库中的记录和缓存做同步,有一种就涉及数据同步和数据一致性间题。在都要对絮状数据加锁或长时间加锁时,不建议优先考虑使用悲观锁,为甚让一次分卡请求为甚让都要读取絮状的卡资源做排序、过滤,锁住絮状的卡会极大降低并发吞吐量。更好的法律法律依据是使用乐观锁,为甚让是直接在数据库层使用乐观锁,用version(UUID)作为更新法律法律依据。更新SQL ,UPDATE table XXX where version = UUID。(数据库乐观锁的原理请自修)。也不在选卡和占卡时,都要做就让 功课来降低冲突的为甚让性,但能保证在任何完后 卡数据不被过期(脏)数据覆盖。当然,你你是什么 一致性也不在服务端达成的一致性。终端和服务端对占用同一张卡达成的一致性间题,都要另外的分布式一致性方案还里能防止。

到底哪几种是“更新丢失”呢?到底会原困多严重的间题?初看你你是什么 描述,说实话就让 感觉那末 ,为甚你还里能那末 碰到过累似 并发间题原困的严重事故,都看这条规范后,大慨率具体情况下该踩的雷还得踩。

从我碰到的出镜率比较高的间题结束了英文,分享一下开发系统中遇到过的场景。

《阿里Java开发规范》应该是众多应用守护进程猿多年来,在使用Java的过程中,根据踩过的雷趟过的坑,总结出来的“血的教训”或“踩坑手册”。但就像《葵花宝典》,即便是读过一百遍也成功自宫,也不见得能马里还里能 成为武林高手,为甚让没练过。搞软件工程就像练武功都要实操,那末 实战经验那末成为高手。评判是都在高手的标准是哪几种?为甚让仅从软件工程的角度看,特别要的就让 也不交付的软件在各种高业务压力、异常具体情况下压不垮、跑不死、业务正常运行。而新手往往那末做出完后 健壮的系统,为甚让健壮的系统都要规避无数的雷和坑。为甚让不知道哪几种为甚让处于的完后 或那样的坑或雷,自然谈不上填上哪几种坑、避开哪几种雷。为甚让,就算在书本或规范上都看哪几种“宝典”,也知道哪几种坑的处于,但那末 跌坑踩雷的亲身经历,在碰到跌坑踩雷的场景时,也为甚让忽略而忘记“宝典”中的“金玉良言”。为哪几种会忽略、为哪几种会匮乏重视,为甚你还里能那末 真的痛过。痛过还里能早熟期期,相信我,这是真的^o^

全都,聊一聊为哪几种会有完后 的开发条例,为甚让不按规范来为甚让出現哪几种间题,了解肩上的故事,为甚让比读一百遍规范来得更有效果。