{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/2020-06-13-interview-questions/","result":{"data":{"markdownRemark":{"id":"8b4174a5-4cd2-5ecc-9861-9f6cf347083e","html":"<p><img src=\"/img/flavor_wheel.jpg\" alt=\"flavor wheel\"></p>\n<h1>Basic</h1>\n<h2>位运算</h2>\n<h2>Hash 表的时间复杂度为什么是 O(1)</h2>\n<p>Hash表数组长度不足怎么办？</p>\n<p>多线程并发修改Hash表怎么办？如何保证线程安全？\nJDK的ConcurrentHashMap是如何解决的？</p>\n<p>如何使Hash表中的数据分布更加均匀，减少Hash聚集？</p>\n<p>余数Hash算法应用于分布式缓存路由的时候有什么问题？如何解决？一致性Hash算法原理是什么？</p>\n<p>用你熟悉的编程语言20分钟写一个一致性Hash算法实现。</p>\n<h2>LRU 算法</h2>\n<h1>DB</h1>\n<h2>数据库怎么处理的网络抖动等的事务</h2>\n<p>需要应用程序手动 commit。commit 成功但是网络异常？这个时候怎么处理的。</p>\n<h2>结构化数据库范式</h2>\n<h2>NoSQL 反规范化</h2>\n<h2>数据库优化</h2>\n<h3>根据业务来决定是否开启数据库缓存</h3>\n<h1>分布式 or 微服务</h1>\n<h2>架构设计</h2>\n<h2>高可用</h2>\n<h2>高性能</h2>\n<h2>可扩展</h2>\n<p>集群</p>\n<h2>负载均衡</h2>\n<h2>缓存集群路由算法</h2>\n<h3>一致性 Hash</h3>\n<p>hashcode?</p>\n<p>缓存服务器集群服务器路由算法。</p>\n<p>使用一个环（树、数组）来存储服务器地址 hashcode 值（2^32)个节点）。如果当前 key hashcode 在环上不存在，则寻找最近的服务器节点存储。但是这种策略下，有可能因为 key 值的原因导致缓存大量命中某些服务器。</p>\n<p>基于虚拟节点的一致性 hash。\n在 hash 环上，冗余同一个服务器的 hashcode 值，手动较平均的设置虚拟节点。</p>\n<p><a href=\"https://medium.com/system-design-blog/consistent-hashing-b9134c8a9062\">Consistent Hashing</a></p>\n<h2>服务发现</h2>\n<h2>容错限流</h2>\n<h2>安全</h2>\n<h2>分布式锁</h2>\n<h2>分布式事务</h2>\n<h3>数据分发 - 数据一致性</h3>\n<p>支付模块，支付数据分发用做对账结算统计数据。</p>\n<h4>事务性发件箱（Transactional Outbox）</h4>\n<ol>\n<li>同一数据库内创建冗余表 outbox ，应用程序事务性双写。</li>\n<li>Message Relay 服务读取 outbox 数据，推送到 MQ。推送成功则标识 outbox 记录为已推送。如果推送过程中发生异常，则不会更新状态为已推送，这时会再次推送数据。保证了数据最终会被推送，有可能重复推送成功，所有需要 MQ 的消费者做消息去重或者幂等处理。</li>\n</ol>\n<p>killbill common queue</p>\n<h4>变更事件捕获（Change Data Capture, CDC）</h4>\n<p>DataHouse 改进，CDC 技术。</p>\n<p>利用数据库的事务日志记录。</p>\n<ol>\n<li>数据入库并保存日志</li>\n<li>数据变更监控 Miner</li>\n<li>变更发送到 MQ， At Last Once 语义</li>\n</ol>\n<p>Canal - MySql binlog,基于 MySql 复制机制。\nDebezium - MySql/SqlServer/MongoDB/Postgres</p>\n<h4>Single Source of Truth</h4>\n<h3>防爬虫</h3>\n<h2>接口幂等</h2>\n<h2>MQ</h2>\n<h2>事件驱动</h2>\n<h2>网络</h2>\n<h3>七层网络协议</h3>\n<ul>\n<li>物理层</li>\n<li>数据链路层</li>\n<li>网络层 - IP，IPX 等</li>\n<li>传输层 - TCP，UDP，SPX</li>\n<li>会话层</li>\n<li>表示层</li>\n<li>应用层 - TELNET，HTTP，FTP，NFS，SMTP</li>\n</ul>\n<h3>protobuf</h3>\n<h3>http</h3>\n<h3>I/O 多路复用</h3>\n<h3>NIO</h3>\n<h1>Java</h1>\n<h2>Spring</h2>\n<h3>依赖注入</h3>\n<ol>\n<li>遍历 bean 配置（xml, 注解标识的 Java Bean）</li>\n<li>创建 bean 实例</li>\n<li>遍历属性，从 map 中获取依赖的 bean ，调用 set 方法或构造函数赋值。</li>\n</ol>\n<h3>单例</h3>\n<p>Bean Map ，作用域，没有要求私有化构造函数。</p>\n<h3>Spring MVC</h3>\n<p>所有 http 请求都先进入 DispatcherServlet, DispatcherServlet 根据请求匹配注解。</p>\n<p>DispatcherServlet#handle 解析 ServletRequest ，获取请求 uri ，解析参数，使用工厂根据 uri 创建  controller 实例，调用方法（方法怎么获取的）。通过 ServletResponse 输出响应值。</p>\n<blockquote>\n<p>这里能看出来，只要 ServletRequest ServletResponse 对象实例没有变，经历多个线程，请求发起方无感知。</p>\n</blockquote>\n<h1>落地项目</h1>\n<p>先讲问题，再讲技术。</p>\n<h2>遇到的问题</h2>\n<h2>入职</h2>\n<p>大概业务</p>","frontmatter":{"date":"June 13, 2020","title":"开发常见知识点整理","description":"开发常见知识点整理","tags":null}}},"pageContext":{"id":"8b4174a5-4cd2-5ecc-9861-9f6cf347083e"}}}