这是一个纷杂而无规则的世界,越想忘掉的事情,越难忘记。正文数据模型不仅对软件编写方式,还对如何思考待解决的问题都有影响。大多数应用程序都是通过叠加一层层的数据模型构建而来。因此每层都面临问题:如何将其用下一层表示?如:作为一名开发,观测现实世界(包括人员、组织、货物、行为、资金流动、传感器等),通过对象或数据结构及操作这些数据结构的API来对其建模,这些数据结构往往特定于该应用当需要存储这些数据...
2023-01-30 16:09:16 3775浏览 0点赞 0回复 0收藏
这是一个纷杂而无规则的世界,越想忘掉的事情,越难忘记。正文从最基本层面看,数据库只需做两件事:向它插入数据肘,它就保存数据之后查询时,返回那些数据本文讨论如何存储输入的数据,并在收到查询请求时,如何重新找到数据。为何关注数据库内部的存储和检索呢?你不可能从头开始实现存储引擎,往往需要从众多现有的存储引擎中选择适合业务的存储引擎。为针对特定工作负载而对数据库调优时,就得对存储引擎底层机制有所了...
2023-01-30 16:08:29 3415浏览 0点赞 0回复 0收藏
这是一个纷杂而无规则的世界,越想忘掉的事情,越难忘记。正文早期,数据库写入通常与一笔商业交易(commercialtransaction)相对应:如销售、订单等。虽然随数据库发展到不涉及金钱交易的领域,术语交易事务(transaction)仍保留下来,指一组读写操作构成的一个逻辑单元。事务不一定具备ACID。事务处理只是意味着允许客户端进行低延迟读取和写入,而不是只能周期运行(如每天一次)的批量处理作业。即使数据库开始被用于许...
2023-01-30 16:08:00 2860浏览 0点赞 0回复 0收藏
这是一个纷杂而无规则的世界,越想忘掉的事情,越难忘记。正文向前和向后的兼容性对可演化性很重要,通过允许独立升级系统的不同部分,而不必一次改变所有,使得变更方便。兼容性是编码数据的一个进程和执行解码的另一个进程之间的关系。无论何时想将某些数据发送到不共享内存的另一个进程,如只要您想通过网络发送数据或将其写入文件,就需将其编码为一个字节序列。数据能通过多种方式从一个进程流向另一个进程。1数据库中的...
2023-01-30 16:07:14 5091浏览 0点赞 0回复 0收藏
正文对大数据集或非常高吞吐量,仅复制还不够,还需将数据拆分成为分区(partitions),也称分片(sharding)[^i]。[^i]:分区是一种有意将大型数据库分解成小型数据库的方式。它与网络分区(networkpartitions,netsplits)无关,这是节点之间网络故障的一种。后文再讨论这些错误。术语澄清分区(partition),对应MongoDB、ES中的shard,HBase的Region,Bigtable的tablet,Cassandra的vnode,Couchbase的vBucket。但分区(partitio...
2023-01-30 16:04:35 4803浏览 0点赞 0回复 0收藏
正文苛刻的数据存储系统中,很多可能出错的case:数据库软件、硬件可能随时失效(包括正在执行写操作的过程中)应用程序可能随时崩溃(包括一系列操作的中间某步)网络中断可能会意外切断数据库与应用的连接,或数据库之间的连接。多个客户端可能同时写入DB,导致数据覆盖客户端可能读到无意义的、部分更新的数据客户端之间由于边界条件竞争所引入的各种奇怪问题为实现高可靠,系统必须处理这些问题。但完善容错机制工作量巨大...
2023-01-30 16:02:21 4052浏览 0点赞 0回复 0收藏
概念BFF,BackendsForFrontends(服务于前端的后端),SamNewman曾在他的博客中写了一篇相关文章Pattern:BackendsForFrontends,在文章中SamNewman详细地说明了BFF。BFF就是服务器设计API时会考虑到不同设备需求,即为不同设备提供不同API接口,虽然它们可能实现相同功能,但因不同设备的特殊性,它们对服务端的API访问也各有其特点,需区别处理。因此出现了类似下图的设计方式图一图二客户端都不是直接访问服务器的公共接口,...
2023-01-30 16:01:12 5808浏览 0点赞 0回复 0收藏
正文电商库存系统设计案例详解(上)1库存扣减多人同时买一件商品时(假设库存充足),每个人几乎同时下单成功,给人一种并行感觉。但真实情况,库存只是一个数值,无论是存在mysql数据库还是redis缓存,减值时都要控制顺序,只能串行来扣减,当然为保证安全性,会设计一些锁控制。1.1关键技术点同一个SKU,库存数量是共享剩余库存要大于等于本次扣减的数量,否则超卖对同一个数量多用户并发扣减时,要注意并发安全,保证数据的...
2023-01-30 16:00:34 8430浏览 0点赞 1回复 1收藏
1简介一般客户端通过目标类的接口访问它所提供的服务。有时,现有类可以满足客户端类的需要,但所提供接口不一定是客户端所期望的,可能因为现有类中方法名与目标类中定义的方法名不一致。这时,现有接口需要转化为客户端的期望接口,保证复用现有类。若不进行这样转化,客户端就不能利用现有类所提供功能,适配器模式就可以完成这样的转化。在适配器模式中可以定义一个包装类,包装不兼容接口的对象包装类适配器(Adapter)所包...
2022-12-23 14:19:06 3456浏览 0点赞 0回复 0收藏
正文电商库存系统设计案例详解(下)6纯Redis扣减方案Redis单线程模型,具原子性。当有多个客户端给Redis发命令,Redis会按接收顺序串行执行。对于还未被调度的命令,则放在队列里排队。库存扣减为保证数据并发安全,要求原子性,而Redis正好满足扣减类需求。6.1基于的Redis库存扣减6.2Redis数据模型剩余库存(KV结构)Kskuleavedamount{skuid}V剩余的库存数值流水(hash结构)Kinventoryflow{skuid}hash—K订单明细id(不同业...
2022-12-23 14:18:06 4232浏览 0点赞 0回复 0收藏
若两个事务不触及相同数据,即无数据依赖关系,则它们能安全并行运行。只有当:某事务读取另一个事务同时修改的数据或两个事务同时修改相同数据才会出现并发问题。并发BUG很难通过测试找到,因为这样的错误只有在特殊时序下才会触发。这样的时序问题可能非常少发生,通常很难重现。并发性也很难推理,特别是在大型应用中,你不一定知道哪些其他代码正在访问DB。只有一个用户访问数据时,应用开发就够麻烦了,多用户并发更困难,...
2022-12-20 11:31:54 3089浏览 0点赞 0回复 0收藏
表面上看,RC似乎已满足事务的一切特征:支持中止(原子性),防止读取不完整的事务结果,并防止并发写的混乱。为我们的开发省去一大堆麻烦。但此隔离级别仍有很多地方可能产生并发错误。如图6说明RC可能的问题:图6读取偏差:Alice观察数据库处于不一致的状态Alice在银行有1000存款,分为两个账户,每个500。现有一笔转账交易从账户1转移100到账户2。若她在提交转账请求后、银行DB系统执行转账的过程中间,查看两个账户的余额...
2022-12-20 11:30:50 3789浏览 0点赞 0回复 0收藏
RC和快照隔离级别主要都是为解决只读事务遇到并发写时可以看到什么(虽然中间也涉及脏写),还没触及另一种情况:两个写事务并发,而脏写只是写并发的特例。写事务并发带来最着名的问题就是丢失更新,如图1的两个并发计数器增量为例。应用从DB读一些值,修改它并写回修改后的值,则可能导致丢失更新。若两事务同时执行,则其中一个的修改可能丢失,因为第二个写内容并未包括第一个事务的修改(有时会说后面的写入狠揍(clobber...
2022-12-20 11:29:32 3012浏览 0点赞 0回复 0收藏
多个事务并发写相同对象时,会出现脏写、更新丢失两种竞争条件。为避免数据不一致,可:借助DB内置机制或通过显式加锁以执行原子写操作。但这还不是并发写可能导致的全部问题。2.4.1值班程序医院通常会同时要求几个医生待命,前提是至少有一位医生在待命。医生可放弃他们的班次(如若自己生病了),只要至少有一个同事在这天的班中继续工作。Alice、Bob两位值班医生都病了,所以他们都决定请假。但他们恰在同一时刻点击调班按钮...
2022-12-20 11:28:52 3613浏览 0点赞 0回复 0收藏
RC和快照隔离级别可防止某些竞争条件,但并非全部。一些棘手案例,如写偏斜和幻读,会发现可悲情况:隔离级别难理解,且不同DB实现不一(如RR含义天差地别)若检查应用层代码很难判断特定隔离级别下是否安全,尤其是大型系统,无法预测各种并发无检测竞争条件的好工具。理论上,静态分析可能有所帮助,但更多技术还没法实际应用。并发问题测试也很难,一切取决于时机而这些还不是新问题,1970s引入了较弱隔离级别以来一直这样。...
2022-12-20 11:28:09 3926浏览 0点赞 0回复 0收藏
问题背景最简单的:DB事务。如创建订单时,同时往订单表、订单商品表插数据,这些Insert须在同一事务执行。Order服务调用Pay服务,刚好网络超时,然后Order服务开始重试机制,于是Pay服务对同一支付请求,就接收到了两次,而且因为轮询负载均衡算法,落在了不同业务节点!所以一个分布式系统接口,须保证幂等性。如何避免重复下单?前端页面也可直接防止用户重复提交表单,但网络错误会导致重传,很多RPC框架、网关都有自动重试...
2022-12-20 11:26:36 3407浏览 0点赞 0回复 0收藏
如脉脉,不会纵容你发太长的网址,会给你转成短链。Scenario场景根据一个longurl生成一个shorturl。如http:www.javaedge.com>http:bit.ly1ULoQB6根据shorturl还原longurl,并跳转:需和面试官确认的问题:longurl和shorturl必须一一对应吗?Shorturl长时间没人用,需要释放吗?1.1QPS分析问日活,如微博100M推算产生一条tinyurl的qps1.假设每个用户平均每天0.1(发10条,有一条有链接)条带URL的微博2.平均写QPS100M0.186400100...
2022-12-20 11:25:07 5164浏览 0点赞 0回复 0收藏
🎈1需求大促节零点时,从关注的用户中抽出N个人进行礼品发放,预计全网超过千万用户参加关注抽奖活动,要求:同一用户不能重复参与同一用户不允许二次中奖🎈2设计方案🍮2.1最原始rand(),对每行随机产生一个随机数selectfrom关注用户表orderbyrand()desclimit,0,100预计千万级别的对技术倒排大概率凉凉。🍮2.2N次随机选择SQL效率可以,不过要先后执行两条SQL,并发时有原子性问题,且RAND函数不能保证不重复中奖。offsetSELECTF...
2022-12-20 11:23:51 3722浏览 0点赞 0回复 0收藏
PaaS日渐深入人心,CloudFoundry为首的传统PaaS,开始蓄力基础设施领域的平台化和PaaS化,于是发现PaaS的问题:如何给应用打包CloudFoundryOpenShiftClodify都没答案,走向碎片化的歪路。此时,名不见经传的PaaS创业公司dotCloud,却选择开源自研的容器项目Docker。就这样一个平淡无奇古天乐一般的技术,开启“Docker”新时代。公司最重要战略之一就是:坚持把“开发者”群体放在至高无上的位置。Docker项目推广策略从一开始就...
2022-12-20 11:22:26 2974浏览 0点赞 0回复 0收藏
Namespace1.1容器为何需要进程隔离被其他容器修改文件,导致安全问题资源的并发写入导致不一致性资源的抢占,导致其他容器被影响dockerrunitnamedemodockerbusyboxbinshpsef在宿主机查看进程IDpsefgrepbusybox真实的docker容器pid这就是进程资源隔离表象:对宿主机,dockerrun启动的只是个进程,pid44451而容器程序本身被隔离了,容器的内部都只能看到自己内部的进程这其实是基于Linux的Namespace技术(Windows也有类似...
2022-12-20 11:19:32 6163浏览 0点赞 0回复 0收藏