作者:小傅哥
<br/> 博客:https://bugstack.cn
积淀、分享、成长,让本人和别人都能有所播种!😄
一、前言:为啥不要你?
咱们这场面试完了,作为老乡我想和你多聊几句。
从刚面试的问题答复中,能看得出你用了不少拙力背了不少题。间接拿这些技术点问,你能够答复。但同样是这些技术点,我换个场景来问用到了什么技术,你就像从没有据说过一样。当然不可否认你能通过背把这些内容记住也是一种能力,但作为招聘从事软件编程的码农来说,其实更心愿是招聘那些通过理论场景积攒下来技术教训研发人员,对各个技术点有张有弛,触类旁通。这也是一个理科生该具备的学习编程的基本素质,也更具备造就价值。
你必定想,那为啥明明大部分时候都是 CRUD 开发,怎么还那么多要求呢?招进集体能干活就行呗?
但其实能干活的人多的是,你看;同类公司间为了市场有竞争吧、公司内同部门为了业绩有竞争吧、部门内各小组为了绩效有竞争吧。那么同样一个事有的公司能做起来有的公司就不行,因为各个公司所具备的基因不同,而这个基因次要是来自公司抉择的市场面和相干人才积攒。那么放到各个公司部门内的小组也一样,为啥有的组就那么高绩效、那么多降职指标、那么多加薪包。那都是这个组内除了实现根底我的项目一样,还有很多具备超高素质的人才,所拼出来的。再拿这些拼出来的问题兑换成绩效调配给组员。
当初缕清了,如果招聘一个组内均匀能力以下只能实现 CRUD 开发的,那么就是招聘进来分配资源包的。放到组内没有竞争力、放到部门内垫底,所以领导基本没有那么多经验造就一个社招的还须要大量工夫造就的。—— 这样的造就机会只会给到应届生。
所以 在你度过编程阶段的新手村阶段当前,就不要把工夫只是放到背八股文,堆 CRUD 代码上。这些货色搞多了,会让人腻烦,排汇的不多,播种的不大。而以大部分连八股文都能背的下来的人来说,把这样的工夫精力放到排汇有深度的技术我的项目上,同样工夫下成长的会更快。
这些货色本就没有多难,难的是你不晓得,从哪晓得!—— 你不是学不会,你只是没有人带你开开眼界!你天天泡酱缸里,你也能成咸菜!
二、深耕:科技与狠活!
但!有这样的深耕技术的小傅哥在,我会帮你晓得你不晓得的,也会帮你晓得你晓得但没法深知的。—— 这也是我的初心,成为粉丝最受信赖和尊重的技术号主。积淀、分享、成长,让本人和别人都能有所播种!
接下来小傅哥就给大家举一些场景案例,这也是当你短少这些深度后,倒置你的简历那么空洞,你的答复那么红润的次要起因。以下这些内容来自于粉丝读者的发问后小傅哥给予的答复
1. 场景设计
问题:目前在做一个微商城零碎,两头有一个相似购物车结账,反对改价和应用优惠券等。目前遇到一个问题,就是优惠分为 2 种,一种是商品直减优惠,这种优惠我应用策略加责任链模式进行了重构优化能疾速扩大。然而另一种是相似满减优惠,须要依据各个商品在总价的比例均摊给不同的商品优惠金额,这里咱们应用的均摊算法是最初一个商品优惠金额等于总优惠金额 - 商品 a - 商品 b 的优惠金额,这样能解决 1 / 3 这种小数问题。
答复:
- 背景(这类摊派计算的逻辑还是蛮简单的,尽管简单,但这类业务还是蛮有意思的)
- 1.1 优惠类型可能包含:直减、满减、N 元购、折扣、优惠限定 SKU
- 1.2 领取形式优惠券,免息、分期百分比优惠、红包
- 1.3 单干摊派,包含优惠费用的承当方,各自出资占比,有了出资后经营能力配置优惠券
- 1.4 多种商品 SKU 组合购买 X 多种优惠组合领取 X 领取形式优惠(可选)
- 1.5 局部商品退货,依据优惠摊派金额扣除后,退款其余部分。PS:但有时候也有业务需要是退款时候,摊派调整,所推商品金额如果能笼罩优惠券,则退回优惠券和残余金额。如:用户领取了 80 元,买了 5 件商品,用了 100-20 的满减优惠券,那么 1 件商品退款的时候,退款了 10 元 +20 元满减券。但也有时候是反对用户抉择的,比方你批准退款 15 元还是退款 10 元 +20 元优惠券。具体要依据合规、风控、业务三方协调确定产品计划,有时候不同年度市场规定调整,可能也会随之解决摊派形式。
- 设计
- 2.1 构造上应用模板模式,因为摊派是一套规范的流程,具体摊派由不同的优惠券策略进行解决。
- 2.2 在模板模式中抽象类能够继承数据撑持类和配置类,也能够联合策略模式、责任链模式等,便于组合应用。
- 流程
- 3.1 接口中须要的外围参数包含:父单号、下单商品 SKU 列表、商品价格、理论领取、优惠券金额、优惠券信息。当然可能这些信息须要通过单号拆分后本人查问组合,这个时候模板模式的数据撑持类就发挥作用了。
- 3.2 模板模式的数据处理中,为商品列表提供摊派占比计算,A/(A+B+…N) 放弃占比记录。
- 3.3 模板模式摊派办法中 for 循环优惠列表,在循环办法中调用形象摊派办法。
- 3.4 在子类实现的形象摊派办法中,调用优惠类型摊派计算策略形式。100-20 20 元依照商品摊派比例,循环计算,并填充到形象模板中的 Map<String, List< 摊派对象 >> 中,key 是优惠 ID。因为计算会有余数,这部分摊派给最初一个商品。最终造成一组各个优惠摊派到每个商品 SKU 的摊派后果。
- 数据
- 4.1 在数据库中要记录每一条的摊派记录,商品父单、子单、金额、实付、优惠类型、占比、摊派金额等,这些不便后续进行退款以及结算给商户应用。
- 4.2 同时要有一张总表来记录一个商品摊派后的残缺信息,是哪个商品父单、应用的优惠组合,这个表有点和订单表相似,不过会填充一些摊派信息与 4.1 表 1vn 的构造。
- 扩大
- 5.1 新提供的摊派优惠券了类型策略,采纳数据库配置的形式解决,并在程序启动的时候,加载到摊派模板的 Config 中,这样就能够解决新增的摊派计算形式了。
- 5.2 不过可能有时候理论的业务订单要比摊派零碎快,那么这个时候呈现的订单,不能摊派则要做归档解决,写入归档表,后续开发了新的摊派策略和配置,再开启工作扫描解决摊派。
2. 技术问题
技术问题的解决能力,须要来自于编程上的与日俱增,参加更多的场景,碰到更多的问题。这样能力积攒教训,为此小傅哥专门收集理论开发中所遇到的异样并进行模仿复现。让大家更好的排汇这些实战经验。
2.1 rollback-only
- 问题:rollback-only
- 异样:线程执行某个定时工作,在事务提交时抛出了异样。看到 rollback-only 字样,这个是什么起因引起的。写代码要留神什么能防止产生这一种状况。
-
测试:用数据库表防重做插入测试,触发异样;
-
- 两个办法都加了事务注解,两个办法都会受到到事务管理的拦截器加强,并且事务流传的形式都是 REQUIRED,当曾经存在事务的时候就退出事务,没有就创立事务。这里 A 和 B 都受事务管制,并且是处于同一个事务的。
-
- A 调用 B,A 中抓了 B 的异样,当 B 产生异样的时候,B 的操作应该回滚,然而 A 吃了异样,A 办法中没有产生异样,所以 A 的操作又应该提交,二者是互相矛盾的。
-
- Spring 的事务关联拦截器在抓到 B 的异样后就会标记 rollback-only 为 true,当 A 执行完筹备提交后,发现 rollback-only 为 true,也会回滚,并抛出异样通知调用者。
-
- 复现:https://gitcode.net/KnowledgePlanet/CodeTutorial/Bug-Code/-/blob/master/src/test/java/cn/bugstack/guide/test/RollbackOnlyTest.java
2.2 Deadlock
- 问题:死锁
- 异样:Deadlock found when trying to get lock; try restarting transaction
- 测试:多线程模仿并发下,一个事务未提交实现,又来一个事务。
- 复现:https://gitcode.net/KnowledgePlanet/CodeTutorial/Bug-Code/-/blob/master/src/test/java/cn/bugstack/guide/test/DeadlockTest.java
2.3 主从同步
问题:在高可用场景中,数据库会做主备,那么当主数据还没来的急同步到备数据库,主数据库挂掉了。这种场景如果是对数据一致性要求比拟高的状况下,架构又该如果思考,业务又该如何弥补呢。
- binlog 阐明;用于记录数据库执行的写入性操作,以二进制保留在磁盘。binlog 是 mysql 的逻辑日志,由 Server 层进行记录,应用任何存储引擎的 mysql 数据库都会记录 binlog 日志。理论利用中,binlog 用于主从复制、数据备份。
-
binlog 分类;STATMENT、ROW、MIXED,mysql 5.7.7 之前默认格局为 STATMENT,5.7.7 之后默认为 ROW;能够通过命令查看 mysqlbinglog mysql-bin.00001 | more
- 1 STATMENT:基于 SQL 语句复制,每一条批改 SQL 语句都会记录到 binlog
- 2 ROW:基于行复制
- 3 MIXED:基于 STATMENT、ROW 的混合模式
-
主从复制:Mysql 主从复制须要三个线程:master(binlog dump thread)、slave(I/O thread、SQL thread)
- 1 binlog dump 线程:主库中有数据更新时,依据设置的 binlog 格局,将更新的事件类型写入到主库的 binlog 文件中,并创立 log dump 线程告诉 slave 有数据更新。当 I / O 线程申请日志内容时,将此时的 binlog 名称和以后更新的地位同时传给 slave 的 I / O 线程。
- 2 I/ O 线程:该线程会连贯到 master,向 log dump 线程申请一份指定 binlog 文件地位的正本,并将申请回来的 binlog 存到本地的 relay log 中。
- 3 SQL 线程:该线程检测到 relay log 有更新后,会读取并在本地做 redo 操作,将产生在主库的事件在本地从新执行一遍,来保障主从数据同步。
-
复制过程:
- 1 主库写入数据并且生成 binlog 文件。该过程中 MySQL 将事务串行的写入二进制日志,即便事务中的语句都是穿插执行的。
- 2 在事件写入二进制日志实现后,master 告诉存储引擎提交事务。
- 3 从库服务器上的 IO 线程连贯 Master 服务器,申请从执行 binlog 日志文件中的指定地位开始读取 binlog 至从库。
- 4 主库接管到从库的 IO 线程申请后,其上复制的 IO 线程会依据 Slave 的申请信息分批读取 binlog 文件而后返回给从库的 IO 线程。
- 5 Slave 服务器的 IO 线程获取到 Master 服务器上 IO 线程发送的日志内容、日志文件及地位点后,会将 binlog 日志内容顺次写到 Slave 端本身的 Relay Log(即中继日志)文件的最末端,并将新的 binlog 文件名和地位记录到 master-info 文件中,以便下一次读取 master 端新 binlog 日志时能通知 Master 服务器从新 binlog 日志的指定文件及地位开始读取新的 binlog 日志内容。
- 6 从库服务器的 SQL 线程会实时监测到本地 Relay Log 中新增了日志内容,而后把 RelayLog 中的日志翻译成 SQL 并且依照程序执行 SQL 来更新从库的数据。
- 7 从库在 relay-log.info 中记录以后利用中继日志的文件名和地位点以便下一次数据复制。
-
升高提早:
- 从库上的执行,即 sql_thread 更新逻辑,在 5.6 版本之前,是只反对单线程,那么在主库并发高、TPS 高时,就会呈现较大的主从提早。因而,MySQL 自 5.7 版本后就曾经反对并行复制了。能够在从服务上设置 slave_parallel_workers 为一个大于 0 的数,而后把 slave_parallel_type 参数设置为 LOGICAL_CLOCK
- 升高多线程大事务并发的概率,优化业务流程
- 优化 SQL,防止慢查问,缩小批量操作
- 进步从库机器配置
- 主从同机房、通网络、带宽、地区
- 主从切换,日志复原
3. 技术架构
总有同学分不清 MVC 和 DDD 的本质区别,却又总被一些实践搞的昏头昏脑,听不懂:领域专家、战术策略、模型推演等,这些词让本来就含糊的概念更加含糊,基本没法落地。所以给大家画了一个 MVC 和 DDD 的比照图,便于大家能够从代码实现视角的更好的了解 DDD。
MVC:更偏差与数据建模实现,由数据调用驱动,所以也就引申出的 DAO、PO、VO 类会随着我的项目开发一直的收缩,不易于迭代和保护。
DDD:以业务流程提炼畛域模型为驱动,设计和实现模块开发,在一个畛域中蕴含 mode 对象、仓储数据、服务实现,也更重视设计模式的应用,否则实现的 DDD 徒有其表更多的只是归类了 DAO、PO、VO 对象。
所以如果想理解 DDD 如何落地,十分倡议把 DDD 抽奖零碎的代码好好实际起来。
4. 学习使用
问题:手撸 spring、手撸 MyBatis 如何体现在简历上?小傅哥能够给个 Demo 吗
答复:
- 体现在专业技能上,例如;
1.1 深刻学习 Spring 外围流程模块,包含;IOC、AOP、依赖倒置等流程,把握 Spring 解决简单场景所使用的分治、形象和常识(设计模式、设计准则),在解决 Spring 场景问题时,能够从外围原理上给出计划。同时也具备基于 Spring 开发 SpringBoot Starter 技能,为简单我的项目缩小同类共性需要的开发,凝练通用的技术组件,缩小研发老本。
1.2 深刻学习 MyBaits 外围流程模块,包含;会话、反射、代理、事务、插件等流程,熟练掌握 ORM 框架的设计思维、实现形式和利用价值。并能按需联合 MyBatis 的插件机制,开发属于企业本人所需的性能,包含;数据分页、数据库表路由、监控日志、数据安全等方面。 - 体现在我的项目教训上,例如;—— 对校招和实习比拟有用
把 Spring、MyBatis 当一个学习我的项目来形容,这是你在离校前,最可能接触到的一个残缺的、成型的、出名的,有企业应用的,框架。你就依照本人学习并开发了这样一个框架为指标来写我的项目,并形容出这个我的项目,你用了什么技术栈,解决了什么问题,学习到了哪些。 - 体现在我的项目利用上,例如;
对于 Spring、MyBatis 的我的项目,个别都是插件类开发,比方各类的 SpringBoot Starter,MyBatis 插件,都是基于框架的深刻整合类技术解决方案,体现在简历上,十分抓眼球。一看你就是有深度和自研能力的研发人员。—— 个别不让你造轮子,但须要你有造轮子的能力,这样企业中一些软件能够被你进行优化和批改。 - 体现在解决问题是上,例如;
在你的本人的业务我的项目中,渗入一些对于解决了原我的项目应用 Spring 时,对于感知 Aware 形式或者联合 FactoryBean 包装对象等,所遇到的问题,因为你学习过源码,所以十分清晰这样的流程,因而解决了一个问题。通用 MyBatis 也实用于这样的形容形式,包含;事务、查问次数、批查问、插件能监听到的四个类(ParameterHandler、ResultSetHandler、StatementHandler、Executor)你给了更好的抉择。
5. 更多场景
这些内容都来自于与日俱增的思考和编写所产生的内容,也是更符合实际场景诉求的内容。—— 这让我想起有个为了卖 2 万多块钱的课胡说:”不会写贪吃蛇,进公司没法写代码!“千万别被这种忽悠了!
理解更多:https://bugstack.cn/md/zsxq/introduce.html —— 星球介绍、星球材料、专属我的项目、技术小册、手撕源码、号主机密等。