项目

247 阅读7分钟

架构

高可用

        一个系统在大部分时间都是可用的,可以为我们提高服务。高可用代表系统即使发生硬件故障的情况或者系统升级的时候,服务仍然时可用的。

       常用手段:超时、重试、熔断、限流、双活、负载均衡、自动弹性伸缩

  • 注重代码质量,测试严格把关

  • 代码质量有问题比如比较常见的内存泄露、循环依赖都是对系统可用性极大的损害。所以我觉得第一件事情就是提高代码质量,codeReview以及配合一些代码检查工具,sonarLint和阿里代码规约。

  • 使用集群,减少单点故障

  • 限流

  • 当流量达到指定的阈值时进行控制,以避免被流量冲垮。(上限限制、滑动窗口、漏桶、令牌桶)

  • 超时和重试机制

  • RPC、MQ

  • 熔断机制

  • Hystrix

  • 异步调用

  • 降低系统耦合性

  • 使用缓存

  • 减少数据库压力

  • 其他

  • 灰度发布

  • 注意备份

高并发

分而治之

  • 限流
  • 缓存
  • 降级
  • 异步削峰
  • 增加用户行为成本(答题)
  • 防止超卖

细节(亮点)

策略模式+工厂模式+模板模式

模板模式

一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

优点:

  1. 封装不变部分,扩展可变部分。
  2. 提取公告代码,便于维护。
  3. 行为有父类控制,子类实现

缺点:

  1. 每一个不同的实现都需要一个子类来实现,导致类的个数增加。

策略模式

一个类的行为或其算法可以在运行时更改。创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。

优点:

  1. 算法可以自由切换
  2. 避免使用多重条件判断
  3. 扩展性良好

缺点:

  1. 策略类会增多
  2. 所有策略类都要对外暴露

工厂模式

创建型模式,提供了一种创建对象的最佳方式。

优点:

  1. 一个调用者想创建一个对象,只要知道其名称就可以了。
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以了。
  3. 屏蔽产品的具体实现。

缺点:

  1. 每次增加一个产品都需要一个具体类和对象实现工厂,视情况采用。

发放中台实现:

  1.     由于在农场喂养过程中会发放各种奖励,特别是在后期拆分出发放中台后,部门的其他业务也会对其进行调用,在奖品中台上可配置的每一种奖品都有一种实现,每种奖品的实现都是不一样的,而且不少是需要对接外部门,也有集团接口,甚至还有外部供应商的openApi接口。
  2.     因此就很容易联想到策略模式,可以很方便的扩展新的奖品发放实现方式,同时策略模式的context处理类中,可以给策略实现增加一些前后置增加,比如记录日志,发放通知之类的。
  3.     但是使用策略模式的时候有一个缺点就是,通常需要提前知道策略实现类传到context里,使用者得知道所有的策略类全行,为了解决这个问题,在context里混合使用了工厂模式,达到可以自动根据奖品类型等条件自动创建策略类。
  4.     同时,在每个策略实现类中重写了afterPropertiesSet方法,当bean实例化属性填充后自动注册到一个context的hashmap中,key是奖品类型,这样的话创建对象的时候就可以直接根据类型冲hashmap中取了,不用再像普通工厂一样写一堆if else来创建对象了。

mq+定时任务双重保证

发放奖品对接的服务方有很多,难免会有网络异常或者库存不足导致发放失败的情况,为了确保能够一个不漏的成功发放。发放中台这边会先发一个mq,如果失败会有18次重试,然后会有定时任务每天早中晚捞前一天发放失败的奖品进行补发,如果还是失败会自动发送邮件进行人工兜底,这3重保障奖品能够成功发放。

工厂模式+建造者模式+线程池(构建复杂对象)

  1. Factory 注入spring,引用service
  2. 内置 内部类Builder
  3. Builder 调用callable 多线程获取数据

项目示例

秒杀系统

关键点

  • 稳:高可用
  • 准:超卖、数据一致性
  • 快:高性能

动静数据分离

  • 放到离用户最近的地方,CDN、负载均衡、guava cache、redis、文件缓存等

交互原则

  • 数据要少:请求参数少,减少对带宽的占用,降低cpu消耗(非必要的信息不要来回传)
  • 请求数少:合并请求
  • 路径要短:如果每个节点有概率失败
  • 依赖要少
  • 不要单点:负载均衡,水平扩展

热点数据

识别追踪热点数据(用户访问、添加购物车、下单、统计分析)

(本来卖衣服秒杀,结果都去抢水果了)

个人

优点

  • 有责任心:对项目负责
  • 有主观能动性:积极接受任务,想把手里的工作做好
  • 学习能力强:新技术、vue
  • 逻辑性强:能很快把我需求原因和重点

缺点

  • 自律:坚持做一件事
  • 沟通:太逻辑化,现实沟通还是得要有情商和人情

Code Review

  • 分层:service、biz、repo隔离层
  • 重点代码逻辑
  • 注释、可读性
  • sql一条一条看
  • 命名、方法长度、if-else层数
  • 每个人都会装sonar和阿里代码规约会提示日常代码

组员工作能力差的表现

  1. 凡是没有交代,件件没有着落,事事没有回音,做事不靠谱
  2. 责任心不强
  3. 主观能动性不强,遇事第一反应是推卸责任,而不是解决
  4. 行动力不强,永远要去催
  5. 遇到问题不及时反馈
  6. 考虑问题不周到细致,有遗漏,没有前瞻性,而且理解能力不是很强,不能GET到关键点
  7. 被指出不足的时候,本能的反驳或者辩解。如果不认可领导指出的不足,不知道私下找合适的机会跟领导单独沟通
  8. 逆境时消除,不能一起抗事
  9. 沟通能力不强,没有效率
  10. 不与领导高度一致
  11. 不勤奋、不主动学习,不主动找活干
  12. 智商和情商都不在线
  13. 经常消极抱怨的人
  14. 汇报没有条理
  15. 请求没有层次
  16. 做事没有计划
  17. 轻易惹事儿
  18. 关键时候掉链子
  19. 犯错没有记性

需要什么样的人

聪明

一方面是指过硬的专业能力和学习能力;另一方面还指情商,足够开放和湿润,懂得如何与伙伴建立连接

眼里有光

好奇心,有强烈的自我成就、自我发展的信念与渴望

用于担当

既有利他的团队精神,又有敢于向前一步的自驱和心智

自省

保持客观、开放的心态、能够持续总结与成长