Loading

后端 | 阅读文章列表

Java

Golang

PHP

  • PHP 中 foreach 引用的坑:https://blog.csdn.net/qq_36025814/article/details/115346200
    • PHP 中 foreach 循环中使用的单个元素变量(比如 value),在循环结束后仍然会保留,如果不销毁且下次循环仍然使用相同的变量名,将会导致下次循环的结果不正确。
    • 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

计算机基础

数据库

Redis

  • 先更新缓存再更新数据库:同样会造成数据不一致的情况发生。

  • 先删除缓存再更新数据库:下面这种情况仍然会造成缓存数据不一致。

  • 先更新数据库再删除缓存(Cache Aside):缓存不一致。

  • 重试机制(缓存双删):可以在一定程度下缓解缓存不一致问题。

  • 订阅 MySQL Binlog 再操作缓存:稳定可靠,但是会增加运维成本。

分布式

  • 字节跳动对分布式锁的详细介绍:https://blog.csdn.net/ByteDanceTech/article/details/125814670
  • 分布式锁的多种实现:https://mp.weixin.qq.com/s/Wj313x5TtU21D8ARv1Zsnw
    • 主要有数据库、Redis、Zookeeper、ETCD 这几种实现方式。一般实际生产中,因为性能问题不使用数据库锁。
    • Zookeeper 实现分布式锁用的是临时顺序节点。在 Locks 节点下,各个客户端会判断各自当前是否为最小的节点。如果自己是当前最小的临时顺序节点,则获得锁;否则向前一个临时节点注册 Watcher 事件,用来监听前一个节点是否还存在,也就是说如果获取锁失败将进入等待。
    • Zookeeper 实现的分布式锁,删除节点分为正常业务执行完毕和异常故障两种情况。① 正常业务执行完毕之后,当前客户端会向 Locks 节点显示调用删除指令。② 如果是客户端异常故障,根据临时顺序节点的特性,节点将会在一段时间之后自动删除。这两种情况下,删除了当前的节点,下一个节点将会自动获取到这个锁。
    • Zookeeper 实现分布式锁简单易用,只需要利用临时顺序节点的特性,前向注册监听器。但是,如果频繁请求加锁、删除锁,也会对 Zookeeper 集群带来较大的压力,这也是它不如 Redis 的地方,支持的并发量不如 Redis 高。
  • 分布式事务的详细讲解以及在京东的落地:https://juejin.cn/post/7226525442176778277
    • 主要详细介绍了 2PC、3PC 以及中间可能产生的一些问题。
    • 事务预提交:参与者接收到 PreCommit 请求后执行事务操作,并将 Undo 和 Redo 信息记录到事务日志中,同时锁定当前记录。
  • 分布式事务 2PC 理论:https://www.jianshu.com/p/1aa944f44b7b
  • 高可用的 11 个关键技巧:https://mp.weixin.qq.com/s/MSaugX48y5iia02UVpqb_Q
  • Spring Boot 实现接口幂等性的 4 种方案:https://juejin.cn/post/7180252965033214010
  • 13 种锁的实现方式:https://mp.weixin.qq.com/s/AOshaWGmLw6uw92xKhLAvQ
  • Docker 的详细介绍:https://mp.weixin.qq.com/s/sd8jeD3oBXFfGsC_pkw6zw
  • Redis 和 MySQL 保持数据一致性:https://mp.weixin.qq.com/s/zyuQMrOx1LYUvGV16DKczQ
  • 分库分表或被分布式数据库取代:https://mp.weixin.qq.com/s/xqmJ7BxljfJSVc4LG_eepQ
  • 分库分表的 21 条准则:https://mp.weixin.qq.com/s/0RcS20lNov_bv3MGDpiC7w
  • 分布式链路监控系统:https://mp.weixin.qq.com/s/3ONVrA2_UmM9qbOPdGOrxA
  • LVS 四种工作模式和十种算法:https://mp.weixin.qq.com/s/8PajH0VlGk3FyL5iuJNZ1A
  • 四种经典限流算法讲解:https://mp.weixin.qq.com/s/_zOs2V1muTGbQrmti7ar_g
  • RocketMQ 的长轮询实现原理:https://mp.weixin.qq.com/s/U0jlW0K3Kuo2iRWNTB-Xww
  • Google 二进制编码 Protobuf 实现原理:https://mp.weixin.qq.com/s/kfyTcs6xuDvlCX3U04Edng
  • 分布式 12 问,主要为分布式锁/事务:https://juejin.cn/post/7202909627573927994
  • Raft 协议,Leader Election 领导选举之后使用 Log Replicate 日志复制来达成一致性。脑裂现象发生时会发生退位 step down 且 Rollback 当前未提交日志。总体来说,Master Slave + Leader Election + Log Replicate 是 Raft 协议的核心。
  • 分布式系统的补偿机制:https://mp.weixin.qq.com/s/Hqam4EtW7vQhB4mWp6TXtw
    • 业务补偿:当某个操作发生了异常时,如何通过内部机制将这个异常产生的不一致状态消除掉。业务补偿的实现方式分为两种:回滚、重试。
    • 回滚操作:显式回滚:调用逆向接口,进行上一次操作的反操作,或者取消上一次还没有完成的操作(须锁定资源);隐式回滚 :隐式回滚意味着这个回滚动作你不需要进行额外处理,往往是由下游提供了失败处理机制的。回滚的实现,对于跨库的事务,比较常见的解决方案有:两阶段提交、三阶段提交(ACID)但是这 2 种方式,在高可用的架构中一般都不可取,因为跨库锁表会消耗很大的性能。高可用的架构中一般不会要求强一致性,只要达到最终的一致性就可以了。可以考虑:事务表、消息队列、补偿机制、TCC 模式(占位 / 确认或取消)、Sagas模式(拆分事务 + 补偿机制)来实现最终的一致性。
    • 重试操作:重试是我们认为这个故障是暂时的,而不是永久的,所以会去重试。重试策略主要有以下几种:立即重试、固定间隔、增量间隔、指数间隔、全抖动(random(0 , 2 ^ retryCount);)、等抖动(2 ^ retryCount + random(0 , 2 ^ retryCount);)。
    • ACID 和 BASE 是分布式系统中两种不同级别的一致性理论,在分布式系统中,ACID有更强的一致性,但可伸缩性非常差,仅在必要时使用;BASE 的一致性较弱,但有很好的可伸缩性,还可以异步批量处理;大多数分布式事务适合 BASE。在重试或回滚的场景下,我们一般不会要求强一致性,只要保证最终一致性就可以了。
    • 业务补偿注意事项:① 业务需要支持幂等性,有重试机制;② 业务流程高可用和稳定;③ 设计业务正向流程的时候,也需要设计业务反向流程;④ 业务方最好提供短期的资源预留机制,可以迅速将业务占用的资源释放及时回滚。

中间件

高性能

多线程

框架

微服务

安全

问题解决

项目设计

设计模式

代码编写

行业知识

经典题目

职业成长

  • 构建个人成长路线图:https://mp.weixin.qq.com/s/UWXxz03AevZrI1qNfC7WZA
  • 技术开发的思考与要做的事情:https://mp.weixin.qq.com/s/ikmGL6P3ywoeWE41dYI_Rw
  • 日常开发提升技术的一些建议:https://mp.weixin.qq.com/s/-_BPcK80QIPYBp-g79w9MA
    • ① 打好基础,深入学习语言特性;② 熟悉日常开发中使用到的工具;③ 总结日常工作中踩过的坑;④ 阅读项目中优秀的代码和设计文档;⑤ 总结一些通用的技术方案;⑥ 参与技术讨论,积极技术分享;⑦ 有 owner 意识,积极攻克项目难题;⑧ 思考项目中可以提升效率的地方;⑨ 熟悉业务,提高自己的核心竞争力;⑩ 查看系统中可能存在的问题,比如接口耗时、慢 SQL,进行优化;⑪ 学以致用,将理论知识运用到实际项目中;⑫ 阅读一些优秀的源码设计;⑬ 多编码、少偷懒,养成编码的好习惯。
  • 程序员怎样才算是在写有技术含量的代码:https://mp.weixin.qq.com/s/gqO4GaVwWcZ81GPxrXxdLQ
  • 试用期总结参考:https://mp.weixin.qq.com/s/jH5-8_xco0hTi5bQfT2t7w
  • 实习生和试用期的一些注意事项:https://mp.weixin.qq.com/s/pgO8d06-3vm-CaRNZNY-_w
    • 实习和试用期,更在意候选人的技术基本功和技术思考力
    • 在面对“不就是使用了一个依赖包”这种质疑时,应该:① 最有技术含量的工作确实是用 XX 包实现,但不是有了这个包才有的方案,而是我们制订了方案,这个包满足我们的诉求,可以节省我们的时间才被用到;② 我们不仅仅是解决了 xx 问题,还考虑到了 xx 等方案,这是一个完整的、考虑周到的技术方案升级过程;
    • 不是要大家学习套路,而是说没有来龙去脉的规划会让人疑惑。在讲规划的时候,考虑:① 为什么会这么想,为什么有这样的规划;② 达到这样的目标后会怎么样,对团队、业务的影响是什么。
    • 不要以新人心态看待问题:Everybody matters, every step counts.
  • 职场个人成长、心态和沟通:https://mp.weixin.qq.com/s/LI5h8U6j1E4KudZUw6dHYw
  • 重复工作中如何培养匠心:https://mp.weixin.qq.com/s/nG51m27twdv43FAiFSlQSA
    • 更多关注工作,尽管是重复工作,可以从需求看结果、从过程看工作、从可预测性看结论,培养对于重复工作的更多可能性,从细节处看能力,从重复中看匠心。
    • 对技术工作来说,尽可能提供价值空间高、过程对价值贡献高、可预测性低的机会,避免开发者对于技术工作的倦怠,可以更好地激发大家的创造性。
  • 技术人对抗焦虑的加减法:https://mp.weixin.qq.com/s/7sruMfQDMzmej2DFTP6Fiw
  • 软件研发的道德情操以及同理心:https://mp.weixin.qq.com/s/_qfcoB0lKkdk8RA1cMlroA
  • 技术开发的述职与自我审视:https://mp.weixin.qq.com/s/DjJVcX9h4J1d2YNQaOsj-w
  • 工作中发挥个人能力的不同层级:https://mp.weixin.qq.com/s/R8RibpWnYSN7G6_qm2PDng
    • 技术服务业务,业务驱动产品价值。做好业务需求是工作的最低要求,更多的是对个人能力的要求。
    • 利用自己的技术去发掘业务的可能性,解决业务上的瓶颈或者挑战。要做到这个高度需要有足够的积累,要再技术上兼具深度的同时扩展广度,在团队协作项目推进上还需要更积极的主动性和协调能力。
    • 做好本职工作,完成好交付任务的同时,不设边界,积极拓展自身的可能性。这一层要求我们具备更全面的技术规划能力。从需求交付到技术优化再到技术规划,从帮别人干活到给自己找活干再到找活给一批人干。这是格局的变化,是做事角度的改变。整个过程中始终考虑的还是公司利益,团队价值。
  • 爬楼梯还是等电梯(确定性与不确定性的考量):https://mp.weixin.qq.com/s/P3rqm27IRUgSsvN2eJBkdg
    • 焦虑,是来自于未来的不确定性,以及对自己的不满意。我们往往把“别人贩卖的焦虑”(PUA、35 岁危机)强加到自己的感受中,这种内耗不断反噬着我们的专注力(原本可以用来真正提升自己)。
    • 近些年来,内部晋升等待成本高,不确定性也高(类似于等电梯);跳槽比较累,适应成本高,但是确定性高(类似于爬楼梯)。
  • 打工人如何避免内卷:https://mp.weixin.qq.com/s/O7Wkyu1D8xyZ34Lns9muNA
    • 要尽早想好自身的价值,全情投入自身价值的增长,而地位和金钱只是中途顺带的事情,没有达到这方面的目标也无所谓,社会最终也会给予认可的。
    • 内卷和恶性竞争是零和游戏,成为自己才是正和游戏。成为自己需要极强的独立思考能力。这一点可以反思自己在人生所有关键节点中做出的决策,到底是自己真正调研思考得出的结论,还是随大流。
    • 用自己最擅长的方式创造价值,并且通过最适合的杠杆去放大价值。
    • 成为自己,参与正和游戏。适当放弃对外部事物的欲求,才有可能持续保持平和的心态。
  • 程序员如何阅读源码:https://mp.weixin.qq.com/s/9kfVzG5nN9WZ7tW3Eo6_Nw
    • 阅读源码是程序员的必备技能之一。只会调用 API 对于日常工作来说,还远远不够。看懂别人的代码是怎么写的,对于我们的编码能力、设计能力、架构能力都有极大提升。
    • ① 读哪些:确定阅读范围,包括代码本身、开源组织、各种开源社区;② 看文章:找准主题,总结优缺点、适用场景;③ 写单测:运行程序主线找体感,再打断点看代码抓细节;④ 出总结:和类似的框架、已掌握的知识类比,提炼出其中设计比较优良的点,最后对于没掌握细节,再读一次源码。

职场

其他

posted @ 2023-10-18 16:57  雨下一整晚Real  阅读(84)  评论(0编辑  收藏  举报