首页 文章 精选 留言 我的

精选列表

搜索[三大系统],共10000篇文章
优秀的个人博客,低调大师

系统架构 一致性问题 : 库存扣减

典型互联网架构 业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层: •调用层,一般是处于端上的browser或者APP•站点层,一般是拼装html或者json返回的web-server层•服务层,一般是提供RPC调用接口的service层•数据层,提供固化数据存储的db 1.对于库存业务,一般有个库存服务,提供库存的查询、扣减、设置等RPC接口: •库存查询,stock-service本质上执行的是 select num from stock where sid=$sid •库存扣减,stock-service本质上执行的是 update stock set num=num-$reduce where sid=$sid •库存设置,stock-service本质上执行的是 update stock set num=$num_new where sid=$sid 2.用户下单前,一般会对库存进行查询,有足够的存量才允许扣减: 如上图所示,通过查询接口,得到库存是5。 3.用户下单时,接着会对库存进行扣减: 如上图所示,购买3单位的商品,通过扣减接口,最终得到库存是2。 希望设计往往有容错机制,例如“重试”,如果通过扣减接口来修改库存,在重试时,可能会得到错误的数据,导致重复扣减: 如上图所示,如果数据库层面有重试容错机制,可能导致一次扣减执行两次,最终得到一个负数的错误库存。 重试导致错误的根本原因,是因为“扣减”操作是一个非幂等的操作,不能够重复执行,改成设置操作则不会有这个问题: 如上图所示,同样是购买3单位的商品,通过设置库存操作,即使有重试容错机制,也不会得到错误的库存,设置库存是一个幂等操作。 4.在并发量很大的情况下,还会有其他的问题: 如上图所示,两个并发的操作,查询库存,都得到了库存是5。 接下来用户发生了并发的购买动作(秒杀类业务特别容易出现): 如上图所示:•用户1购买了3个库存,于是库存要设置为2•用户2购买了2个库存,于是库存要设置为3•这两个设置库存的接口并发执行,库存会先变成2,再变成3,导致数据不一致(实际卖出了5件商品,但库存只扣减了2,最后一次设置库存会覆盖和掩盖前一次并发操作) 其根本原因是,设置操作发生的时候,没有检查库存与查询出来的库存有没有变化,理论上:•库存为5时,用户1的库存设置才能成功•库存为5时,用户2的库存设置才能成功 实际执行的时候:•库存为5,用户1的set stock 2确实应该成功•库存变为2了,用户2的set stock 3应该失败掉 升级修改很容易,将库存设置接口,stock-service上执行的:update stock set num=$y where sid=$sid升级为:update stock set num=$num_new where sid=$sidand num=$num_old这正是大家常说的“Compare And Set”(CAS),是一种常见的降低读写锁冲突,保证数据一致性的方法。 总结 在业务复杂,数据量大,并发量大的情况下,库存扣减容易引发数据的不一致,常见的优化方案有两个:•调用“设置库存”接口,能够保证数据的幂等性•在实现“设置库存”接口时,需要加上原有库存的比较,才允许设置成功,能解决高并发下库存扣减的一致性问题

优秀的个人博客,低调大师

基于Alluxio系统的Spark DataFrame高效存储管理技术

介绍越来越多的公司和组织开始将Alluxio和Spark一起部署从而简化数据管理,提升数据访问性能。Qunar最近将Alluxio部署在他们的生产环境中,从而将Spark streaming作业的平均性能提升了15倍,峰值甚至达到300倍左右。在未使用Alluxio之前,他们发现生产环境中的一些Spark作业会变慢甚至无法完成。而在采用Alluxio后这些作业可以很快地完成。在这篇文章中,我们将介绍如何使用Alluxio帮助Spark变得更高效,具体地,我们将展示如何使用Alluxio高效存储Spark DataFrame。 Alluxio和Spark缓存用户使用Alluxio存储Spark DataFrame非常简单:通过Spark DataFrame write API将DataFrame作为一个文件写入Alluxio。通常的做

优秀的个人博客,低调大师

Jvm系列:问君能有几多愁,系统宕机重启流

上回说到《不识Jvm真面目,只缘身在增删查改中》 讲述了一些有关于Jvm,线程,栈的有关技术知识,还有两个关于JVM的面试题: JVM什么情况下会发生栈内存溢出? JVM中一次完整的GC流程是怎样的? GC——垃圾回收完整意味着有多种情况 今天就接着将视频内容介绍完 可达性分析算法——GC Roots 判断对象的存活 在Java, 可作为GC Roots的对象包括: 虚拟机栈(本地变量表)中引用的对象. 方法区: 类静态属性引用的对象; 方法区: 常量引用的对象; JVM中的堆 1.Java堆是垃圾回收器管理的主要区域 2.基于分代的方式 (1)新生代 Eden空间 From Survivor空间 To Survivor空间 (2)老年代 3.Java堆的大小参数设置 -Xmx 堆区内存可被分配的最大上限 -Xms 堆区内存初始内存分配的大小 新生代为什么分三个区? 新生代垃圾回收算法——复制算法 该算法的核心是将可用内存按容量划分为大小相等的两块, 每次只用其中一块, 当这一块的内存用完, 就将还存活的对象复制到另外一块上面, 然后把已使用过的内存空间一次清理掉. 优点 不必考虑内存碎片问题。 效率高。 缺点 可用容量减少为原来的一半,太浪费了。 最优设置 90%的对象都是朝生夕死的,所以使用10%的空间用作交换区,因为交换区必须有等量的两个,所以采用复制算法的新生代中的三个区采用8:1:1的默认分配比例。 新生代对象的分配和回收 对象分配 基本上新的对象优先在Eden区分配。 当Eden区没有足够空间时,会发起一次Minor GC。 Minor GC回收新生代采用复制回收算法的改进版本 From和To的两个交换区,这两个区只有一个区有数据 采用8:1:1的默认分配比例 (参数配置:-XX:SurvivorRatio )Eden区与Survivor区的大小比值。默认是8 思考:如果new对象过大? 老年代对象的分配和回收 老年代的对象一般情况下来自新生代 (1)长期存活对象进入老年代 年龄阈(yu)值:每个对象定义了年龄(Age)计数器, 经过一次Minor GC(在交换区)后年龄加1。 对象年龄达到15次后将会晋升到老年代,老年代空间不够时进行Full GC。 参数(-XX:MaxTenuringThreshold, 默认15)。 (2)大对象直接进入老年代 超过Eden剩余空间 超过一个参数值(-XX:PretenureSizeThreshold =XX, 无默认值) (3)对象提前晋升(组团) 动态年龄判定:如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代, 而无须等到晋升年龄. JVM中一次完整的GC流程是怎样的? 从上两节总结出的一个面试题 对象的正常流程 Eden -> Survivor区 -> 老年代 新生代 Minor GC 老年代 Full GC 总结 内存区域不够用了,就会引发GC 作为架构师该怎么做:Minor GC避免不了,Full GC尽量避免 处理方式:保存堆栈快照日志、分析内存泄露、调整内存设置控制垃圾回收频率,选择适合的垃圾回收器 这篇关于jvm视频的简述就到这里结束了,当然仅仅看这里的图文,有些人可能摸不着头脑,我这边为大家准备了完整的视频。有需要的朋友可以关注我一下,欢迎加入我的合作群:805685193 即可获取原视频。 还有一些Java架构视频讲解,需要获取Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术视频教程资料,架构思维导图,和BATJ面试题及答案的,都是免费分享的。 关注我,欢迎加入我的合作群:805685193即可获取以上相关视频。 另外,如果想提升自己的技术,这一点是远远不够的。我这里还是把之前那位大佬分享给我的Java架构思维路线知识点分享给大家。 1、高性能架构 性能优化如何理解 JVM调优 JAVA程序性能优化 Tomcat Mysql 2、开源框架解析 1.spring概述 2.Spring 容器 3.Spring AOP 4.Spring MVC 5.Spring 5新特性 6.Mybatis 3、微服务架构 SpringBoot SpringCloud Docker虚拟化技术 Dubbo应用及源码解读 4、架构筑基 分布式环境指挥官Zookeeper 分布式消息通讯 异步与MQ 分布式缓存 NoSql 数据存储 高并发分流技术Nginx 分布式文件存储fastdfs 5、团队协作开发 Git Maven Jenkins Sonar 6、B2C商城项目实战 7、设计模式 如果需要以上高清的技术图的话可以关注一下我,欢迎加入我的合作群:805685193 即可获取,以上知识点这边都有相应的视频讲解,同样可以免费获取。 需要获取Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术视频教程资料,架构思维导图,和BATJ面试题及答案的,都是免费分享的。 关注我,欢迎加入我的合作群:805685193即可获取以上相关视频。

优秀的个人博客,低调大师

Hadoop文件系统元数据管理机制

edits log 默认是 64MB,当写满的时候或者到一定周期的时候,Namanode就会进行 CheckPoint。Checkpoint是一个内部事件,这个事件激活以后会触发数据库写进程(DBWR)将数据缓冲(DATABUFFER CACHE)中的脏数据块写出到数据文件中。 这里仅仅是以一份副本来描述,实际上默认是切片后每一个切片的数据块都有三份副本,保存在不同的Datanode中,假设有多个不同的机架,每个机架有多台主机,意味着有多个机架上面的Datanode,每一台主机作为一个Datanode,数据块的副本保存顺序是: 1、先在本机架上面找寻最近的一台主机保存第一份副本; 2、然后到其他机架上面随机选择一台主机保存第二份副本; 3、最后再在本机架上面除第一份副本的主机外随机选择另一台主机保存第三份副本。 若是Namenode宕机了,还能否恢复数据?重启集群之后还能提供服务么? 可以恢复数据,通过FSimage恢复数据;Namenode宕机了提供不了查询数据和保存数据的功能,因此不能提供服务。 可以使用 多个Namenode副本,副本namenode与namenode的数据保持一致,这里是HA高可用机制,一个namenode宕机了,由另一个namenode顶替继续提供服务。

优秀的个人博客,低调大师

智能污水处理系统的最佳实践

作者:阿里云MVP 王俊杰 一、项目介绍 1.1 目前现状及存在问题 近年来,我国污水处理行业逐渐进入迅速发展的阶段,中国城市污水处理无论在数量还是质量上都得到了迅速的发展。现如今大部分的污水处理厂都处于自动化、人工化、半自动化等生产模式,很多在运行管理模式上仍存在很多弊端。 由于污水处理企业下属厂区分布零散,很多生产环节需要依靠人工来运营维护,无法远程对各水厂自动化设备进行管理,需要相关人员跑场操控,人工巡视成本高,工作效率低。同时污水处理厂相关的运行数据统计源头不一,导致多头统计,不仅造成资源浪费,相关管理人员也无法清晰掌控各厂区的水质、产量、能耗、设备维修等数据。 另外,污水处理过程中药品添加的剂量,以及设备启停的管控,都是依靠人工经验操作,缺乏科学的指导,很大程度上造成药品、电力能耗的资源的浪费,不仅增加污水处理厂的运行管理成本,还

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册