架构
高可用
一个系统在大部分时间都是可用的,可以为我们提高服务。高可用代表系统即使发生硬件故障的情况或者系统升级的时候,服务仍然时可用的。
常用手段:超时、重试、熔断、限流、双活、负载均衡、自动弹性伸缩
-
注重代码质量,测试严格把关
-
代码质量有问题比如比较常见的内存泄露、循环依赖都是对系统可用性极大的损害。所以我觉得第一件事情就是提高代码质量,codeReview以及配合一些代码检查工具,sonarLint和阿里代码规约。
-
使用集群,减少单点故障
-
限流
-
当流量达到指定的阈值时进行控制,以避免被流量冲垮。(上限限制、滑动窗口、漏桶、令牌桶)
-
超时和重试机制
-
RPC、MQ
-
熔断机制
-
Hystrix
-
异步调用
-
降低系统耦合性
-
使用缓存
-
减少数据库压力
-
其他
-
灰度发布
-
注意备份
高并发
分而治之
- 限流
- 缓存
- 降级
- 异步削峰
- 增加用户行为成本(答题)
- 防止超卖
细节(亮点)
策略模式+工厂模式+模板模式
模板模式
一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
优点:
- 封装不变部分,扩展可变部分。
- 提取公告代码,便于维护。
- 行为有父类控制,子类实现
缺点:
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加。
策略模式
一个类的行为或其算法可以在运行时更改。创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。
优点:
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好
缺点:
- 策略类会增多
- 所有策略类都要对外暴露
工厂模式
创建型模式,提供了一种创建对象的最佳方式。
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以了。
- 屏蔽产品的具体实现。
缺点:
- 每次增加一个产品都需要一个具体类和对象实现工厂,视情况采用。
发放中台实现:
- 由于在农场喂养过程中会发放各种奖励,特别是在后期拆分出发放中台后,部门的其他业务也会对其进行调用,在奖品中台上可配置的每一种奖品都有一种实现,
每种奖品的实现都是不一样的,而且不少是需要对接外部门,也有集团接口,甚至还有外部供应商的openApi接口。 - 因此就很容易联想到
策略模式,可以很方便的扩展新的奖品发放实现方式,同时策略模式的context处理类中,可以给策略实现增加一些前后置增加,比如记录日志,发放通知之类的。 - 但是使用策略模式的时候有一个缺点就是,通常需要提前知道策略实现类传到context里,使用者得知道所有的策略类全行,为了解决这个问题,在context里混合使用了工厂模式,达到可以自动根据奖品类型等条件自动创建策略类。
- 同时,在每个策略实现类中重写了afterPropertiesSet方法,当bean实例化属性填充后自动注册到一个context的hashmap中,key是奖品类型,这样的话创建对象的时候就可以直接根据类型冲hashmap中取了,不用再像普通工厂一样写一堆if else来创建对象了。
mq+定时任务双重保证
发放奖品对接的服务方有很多,难免会有网络异常或者库存不足导致发放失败的情况,为了确保能够一个不漏的成功发放。发放中台这边会先发一个mq,如果失败会有18次重试,然后会有定时任务每天早中晚捞前一天发放失败的奖品进行补发,如果还是失败会自动发送邮件进行人工兜底,这3重保障奖品能够成功发放。
工厂模式+建造者模式+线程池(构建复杂对象)
- Factory 注入spring,引用service
- 内置 内部类Builder
- Builder 调用callable 多线程获取数据
项目示例
秒杀系统
关键点
- 稳:高可用
- 准:超卖、数据一致性
- 快:高性能
动静数据分离
- 放到离用户最近的地方,CDN、负载均衡、guava cache、redis、文件缓存等
交互原则
- 数据要少:请求参数少,减少对带宽的占用,降低cpu消耗(非必要的信息不要来回传)
- 请求数少:合并请求
- 路径要短:如果每个节点有概率失败
- 依赖要少
- 不要单点:负载均衡,水平扩展
热点数据
识别追踪热点数据(用户访问、添加购物车、下单、统计分析)
(本来卖衣服秒杀,结果都去抢水果了)
个人
优点
- 有责任心:对项目负责
- 有主观能动性:积极接受任务,想把手里的工作做好
- 学习能力强:新技术、vue
- 逻辑性强:能很快把我需求原因和重点
缺点
- 自律:坚持做一件事
- 沟通:太逻辑化,现实沟通还是得要有情商和人情
Code Review
- 分层:service、biz、repo隔离层
- 重点代码逻辑
- 注释、可读性
- sql一条一条看
- 命名、方法长度、if-else层数
- 每个人都会装sonar和阿里代码规约会提示日常代码
组员工作能力差的表现
- 凡是没有交代,件件没有着落,事事没有回音,做事不靠谱
- 责任心不强
- 主观能动性不强,遇事第一反应是推卸责任,而不是解决
- 行动力不强,永远要去催
- 遇到问题不及时反馈
- 考虑问题不周到细致,有遗漏,没有前瞻性,而且理解能力不是很强,不能GET到关键点
- 被指出不足的时候,本能的反驳或者辩解。如果不认可领导指出的不足,不知道私下找合适的机会跟领导单独沟通
- 逆境时消除,不能一起抗事
- 沟通能力不强,没有效率
- 不与领导高度一致
- 不勤奋、不主动学习,不主动找活干
- 智商和情商都不在线
- 经常消极抱怨的人
- 汇报没有条理
- 请求没有层次
- 做事没有计划
- 轻易惹事儿
- 关键时候掉链子
- 犯错没有记性
需要什么样的人
聪明
一方面是指过硬的专业能力和学习能力;另一方面还指情商,足够开放和湿润,懂得如何与伙伴建立连接
眼里有光
好奇心,有强烈的自我成就、自我发展的信念与渴望
用于担当
既有利他的团队精神,又有敢于向前一步的自驱和心智
自省
保持客观、开放的心态、能够持续总结与成长