开发常见知识点整理

开发常见知识点整理

flavor wheel

Basic

位运算

Hash 表的时间复杂度为什么是 O(1)

Hash表数组长度不足怎么办?

多线程并发修改Hash表怎么办?如何保证线程安全? JDK的ConcurrentHashMap是如何解决的?

如何使Hash表中的数据分布更加均匀,减少Hash聚集?

余数Hash算法应用于分布式缓存路由的时候有什么问题?如何解决?一致性Hash算法原理是什么?

用你熟悉的编程语言20分钟写一个一致性Hash算法实现。

LRU 算法

DB

数据库怎么处理的网络抖动等的事务

需要应用程序手动 commit。commit 成功但是网络异常?这个时候怎么处理的。

结构化数据库范式

NoSQL 反规范化

数据库优化

根据业务来决定是否开启数据库缓存

分布式 or 微服务

架构设计

高可用

高性能

可扩展

集群

负载均衡

缓存集群路由算法

一致性 Hash

hashcode?

缓存服务器集群服务器路由算法。

使用一个环(树、数组)来存储服务器地址 hashcode 值(2^32)个节点)。如果当前 key hashcode 在环上不存在,则寻找最近的服务器节点存储。但是这种策略下,有可能因为 key 值的原因导致缓存大量命中某些服务器。

基于虚拟节点的一致性 hash。 在 hash 环上,冗余同一个服务器的 hashcode 值,手动较平均的设置虚拟节点。

Consistent Hashing

服务发现

容错限流

安全

分布式锁

分布式事务

数据分发 - 数据一致性

支付模块,支付数据分发用做对账结算统计数据。

事务性发件箱(Transactional Outbox)

  1. 同一数据库内创建冗余表 outbox ,应用程序事务性双写。
  2. Message Relay 服务读取 outbox 数据,推送到 MQ。推送成功则标识 outbox 记录为已推送。如果推送过程中发生异常,则不会更新状态为已推送,这时会再次推送数据。保证了数据最终会被推送,有可能重复推送成功,所有需要 MQ 的消费者做消息去重或者幂等处理。

killbill common queue

变更事件捕获(Change Data Capture, CDC)

DataHouse 改进,CDC 技术。

利用数据库的事务日志记录。

  1. 数据入库并保存日志
  2. 数据变更监控 Miner
  3. 变更发送到 MQ, At Last Once 语义

Canal - MySql binlog,基于 MySql 复制机制。 Debezium - MySql/SqlServer/MongoDB/Postgres

Single Source of Truth

防爬虫

接口幂等

MQ

事件驱动

网络

七层网络协议

  • 物理层
  • 数据链路层
  • 网络层 - IP,IPX 等
  • 传输层 - TCP,UDP,SPX
  • 会话层
  • 表示层
  • 应用层 - TELNET,HTTP,FTP,NFS,SMTP

protobuf

http

I/O 多路复用

NIO

Java

Spring

依赖注入

  1. 遍历 bean 配置(xml, 注解标识的 Java Bean)
  2. 创建 bean 实例
  3. 遍历属性,从 map 中获取依赖的 bean ,调用 set 方法或构造函数赋值。

单例

Bean Map ,作用域,没有要求私有化构造函数。

Spring MVC

所有 http 请求都先进入 DispatcherServlet, DispatcherServlet 根据请求匹配注解。

DispatcherServlet#handle 解析 ServletRequest ,获取请求 uri ,解析参数,使用工厂根据 uri 创建 controller 实例,调用方法(方法怎么获取的)。通过 ServletResponse 输出响应值。

这里能看出来,只要 ServletRequest ServletResponse 对象实例没有变,经历多个线程,请求发起方无感知。

落地项目

先讲问题,再讲技术。

遇到的问题

入职

大概业务