互联网开发文档

互联网开发文档


面试准备随笔2

<h2>高并发</h2> <h3>提高系统可用性的方法</h3> <ul> <li><strong>使用集群</strong>,减少单点故障;例redis集群</li> <li><strong>限流</strong>:监控应用流量的QPS或并发线程数等指标,当达到指定阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性</li> <li><strong>超时和重试机制</strong>:一旦用户请求超过某个时间的得不到响应,就抛出异常。如果不进行超时设置可能会导致请求响应速度慢,甚至导致请求堆积进而让系统无法在处理请求</li> <li><strong>熔断机制</strong>:系统自动收集所依赖服务的资源使用情况和性能指标,当所依赖的服务恶化或者调用失败次数达到某个阈值的时候就迅速失败,让当前系统立即切换依赖其他备用服务</li> <li><strong>异步调用</strong>:异步调用的话我们就可以在用户请求完成后就立即返回结果,具体处理后续再做。使用异步之后我们可能需要适当修改业务流程进行配合,比如用户在提交订单之后,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单后,甚至出库后再通过电子邮件或短信通知用户订单成功。我们常常还使用消息队列,消息队列可以通过异步处理提高系统性能(削峰、减少响应所需时间),并且可以降低系统耦合性。</li> <li><strong>使用缓存</strong>:缓存热点数据</li> </ul> <h3>单体服务到微服务架构的演进</h3> <p>单体架构的缺点:</p> <ul> <li>牵一发而动全身:</li> <li>容错能力较差:</li> <li>技术栈被限定死:</li> <li>可伸缩性差:</li> <li>迭代速度更慢:</li> <li>系统启动速度慢:</li> </ul> <p>垂直架构:对单体架构系统以“业务”为维度进行垂直切分</p> <ul> <li>优点: <ul> <li>提高并发:整个系统被拆分多个运行在独立线程下的子系统部署在独立的服务器上</li> <li>容错能力更强:系统之间互相独立,互不影响</li> <li>技术栈灵活:不同的系统可以使用不同的编程语言或者框架来编写</li> </ul></li> <li>缺点: <ul> <li>数据冗余:</li> <li>代码冗余:</li> <li>强耦合:系统之间的功能存在耦合。比如订单系统中需要用到用户系统的功能的话,需要额外进行开发</li> </ul></li> </ul> <p>微服务架构:将单个系统拆分一组小服务的架构风格。每个微服务都在运行在独立的线程下,它们之间通过轻量级通信机制(通常是REST)进行通信。 优点:</p> <ul> <li>各个模块独立部署:对于单个微服务的修改,我们仅仅需要重新部署对应的微服务,而不需要重新部署整个系统</li> <li>可伸缩性好:系统中不同的微服务访问压力不同,我们可以对具体的微服务进行扩容缩容</li> <li>技术栈灵活:不同的微服务可以使用不同的编程语言或者说框架来编写</li> <li>迭代速度更好:</li> <li>微服务启动速度快:单个微服务的启动速度非常快</li> <li>代码易于理解:</li> </ul> <p>缺点:</p> <ul> <li>分布式系统固有问题:分布式事务、网络分区、跨服务调用等问题需要解决</li> <li>开发成本高:</li> <li>运维成本高</li> </ul> <h3>负载均衡</h3> <p>将用户请求分摊到不同的服务器上处理,以提高系统整体的并发处理能力 负载均衡分类:</p> <ul> <li>服务端负载均衡:应用在系统外部请求和网关层之间,可以使用软件后者硬件实现 <ul> <li><strong>四层负载均衡</strong>:工作在OSI模型的<strong>传输层</strong>,这一层主要协议是TCP/UDP,负载均衡在这一层能看到数据包里的源端口和目的端口,会基于这些信息通过一定的负载均衡算法将数据包转发到后端真实服务器</li> <li><strong>七层负载均衡</strong>:工作在OSI模型的<strong>应用层</strong>上,这一层主要协议是HTTP,负载均衡在这一层读取报文的数据部分,然后根据读取到的数据内容(如URL、Cookie)做出负载均衡决策</li> </ul></li> <li>客户端负载均衡:主要应用与系统内部的不同的服务之间,可以使用现成的负载均衡组件来实现;<strong>客户端会维护一份服务器地址列表,发送请求前,客户端会根据对应的负载均衡算法来选择具体某一台服务器处理请求</strong> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=15aa3d43c56b905b18e3617d0f799899&amp;file=file.png" alt="" /></li> </ul> <p>负载均衡常见算法:</p> <ul> <li><strong>随机法</strong>: <ul> <li>未加权重:适合于服务器性能相近的集群,其中每个服务器承载相同的负载。</li> <li>加权:适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化</li> </ul></li> <li><strong>轮训法</strong>:轮询法是挨个轮询服务器处理,也可以设置权重 <ul> <li>未加权重:每个请求按时间顺序逐一分配到不同的服务器处理。</li> <li>加权:权重越高的服务器被访问的次数就越多</li> </ul></li> <li><strong>一致性Hash法</strong>:相同参数的请求总是发到同一台服务器处理,比如同个IP请求</li> <li><strong>最小连接法</strong>:<strong>当有新的请求出现时,遍历服务器节点列表并选取其中活动连接数最小的一台服务器来响应当前请求。</strong>活动连接数可以理解为当前正在处理的请求数。 最小连接法可以尽可能最大地使请求分配更加合理化,提高服务器的利用率。不过,这种方法实现起来也最复杂,需要监控每一台服务器处理的请求连接数。</li> </ul> <p>七层负载均衡常见方案</p> <ul> <li>DNS解析:在 DNS 服务器中为同一个主机记录配置多个 IP 地址,这些 IP 地址对应不同的服务器。当用户请求域名的时候,DNS 服务器采用轮询算法返回 IP 地址,这样就实现了轮询版负载均衡。 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6b66ac133254866ede4c2dd6982e0072&amp;file=file.png" alt="" /></li> <li>反向代理:客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 地址。反向代理“代理”的是目标服务器,这一个过程对于客户端而言是透明的。 <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c2b2f003f49bf27eebbfb748c78801b8&amp;file=file.png" alt="" /></li> </ul> <p>客户端负载均衡常见方案 <strong>Netflix Ribbon</strong> 和 <strong>Spring Cloud Load Balancer</strong> 就是目前 Java 生态最流行的两个负载均衡组件。</p>

页面列表

ITEM_HTML