美文网首页
【问答】设计

【问答】设计

作者: 星冉子 | 来源:发表于2020-03-02 20:28 被阅读0次

    线程安全的单例模式

    饿汉模式、方法synchronized的懒汉模式、双重检查锁的懒汉模式、静态内部类模式; 

    适配器、装饰器和代理模式的区别

    都属于设计模式中的结构型模式,适配器模式将一个类的接口转换成另外一个客户希望的接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;代理模式为其他对象提供一种代理以控制对这个对象的访问,解决直接访问某些对象时出现的问题,也用于屏蔽真实类实现细节;装饰器模式用于在不影响其他对象的情况下,以动态、透明的方式给单个对象添加额外的职责;

    说说你平时用到的设计模式

    创建型(描述如何创建对象):单例(一个类一个实例)、原型(复制已有实例)、工厂、建造者(将一个复杂的对象分解为多个简单的对象一步一步构建);结构型(描述如何组织对象成更大的结构:代理(代理真实对象的访问)、适配器(转换不兼容的接口)、桥接(抽象组合不同类型的实现)、装饰(动态增加对象的职责)、门面(为多个不同系统提供统一接口)、享元(提取公共共享)、组合(组合部分整体);行为型(描述对象间协作):模板方法(定义算法骨架)、策略(一系列算法和算法职责分开)、命令(封装分割请求的发出和执行)、责任链(请求处理者通过前一对象记住下一个对象的引用而连成一条链)、状态(分离对象的状态)、观察者(对象状态改变时通知依赖对象)、中介者(定义中介者解耦原有对象的访问);

    编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用

    开闭原则(对扩展开放,对修改关闭)、里氏替换原则(子类可以扩展父类的功能但不能改变父类原有的功能,即可新增方法不能覆写父类方法)、依赖倒置原则(面向接口编程,降低耦合)、单一职责原则(类单一功能,提高内聚)、接口隔离原则(接口不应过大应拆分成更小更具体的接口,提高内聚)、迪米特法则(最少知识,若两个类不同心则不应该相互调用,应该通过第三方,降低耦合);

    MVC模式,即常见的MVC框架

    MVC是Model(模型)、View(视图)和Controller(控制),就是将数据、逻辑处理、用户界面分离的一种方法,常见框架有Struts1/2,Spring MVC;MVC是三层架构中的UI层再度进行了分化; 

    分布式锁

    需考虑问题:分布式锁是否可重入,分布式锁的释放时机(超时),分布式锁服务端是否有单点问题等。基于数据库(唯一索引)实现:通过唯一索引保持排他性,加锁时插入一条记录,解锁是删除这条记录;通过判断锁持有者实现可重入,通过记录和查询锁时间实现超时,通过数据库分布式解决单点问题;基于缓存(Redis)实现:内存操作,效率最高,利用SETNX key value命令实现;解锁使用Lua脚本实现保证原子性;通过判断锁持有者实现可重入,通过Redis自带的Key超时机制实现锁超时,通过Redis分布式解决单点问题;基于Zookeeper实现分布式锁:利用Zookeeper创建临时有序节点来实现分布式锁;判断节点序号最小则加锁成功,否则注册Watcher事件等待前面节点(序号小的获取到锁的)通知则获取到锁;通过客户端加锁时将主机和线程信息写入锁中,下一次再来加锁时直接和序列最小的节点对比实现可重入,ZK自动删除灰化断开的临时节点实现锁超时;ZK集群解决单点问题;通过curator框架可实现ZK分布式锁;

    事务介绍,分布式事务的理解,常见的解决方案有哪些,什么是两阶段提交、三阶段提交

    事务的特征:ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability),分布式事务的产生原因:数据库分库分表导致多数据源访问;应用SOA化,每个服务都有自己的数据库;XA是一种分布式事务协议,定义了全局事务管理器(TM)和局部资源管理器(RM)之间的接口,2PC、3PC是XA的一种实现, 分布式事务解决方案包括:

    2PC:强一致和中心化的原子提交协议,有中心化的协调者节点和N个参与者节点, 请求阶段和提交阶段;缺点:同步阻塞、协调者单点故障、数据不一致(任一阶段发生网络故障就会导致);无法解决的问题:协调者和参与者同时出现故障时,保证事务的完整性;3PC:准备阶段、请求阶段和提交阶段;优点:减少阻塞范围,单点故障后能达成一致;缺点:还是有不一致问题;TCC补偿事务:Try(负责资源的检查和预留)、Confirm(执行真正的业务操作)、Cancel (执行回滚)3个方法均由业务编码实现;业务实现TCC的注意事项:业务操作需要按Try、Confirm/Cancel两步骤完成、允许空回滚、防悬挂控制(Cancel之后不处理Try)、幂等控制;本地消息表:发起和执行事务的服务都记录消息到本地DB;保证本地事务(消息和业务同一事务提交);更新消息状态;轮训并重试机制;MQ事务消息:RocketMQ中间件能够支持一种事务消息机制,确保本地操作和发送消息的异步处理达到本地事务的结果一致;最大努力通知:重复N次尝试相同动作;

    分布式集群下如何做到唯一序列号

    1、基于数据库自增长序列;简单方便,只能由同一个主库完成,存在单点和性能问题;2、UUID,简单方便性能好,但没排序、存储空间较大,不可读,传输数据量大;3、UUID变种,基于UUID,增加时间等信息,解决无序不可读的问题;4、基于Redis的原子操作INCR和INCRBY生成,不依赖数据库、可排序、无单点问题;5、基于Twitter的snowflake算法,根据时间、机器ID、流水号生成,不同机器时钟不同步可能引起问题;6、利用zookeeper的znode数据版本来生成序列号,性能不好;7、基于MongoDB的ObjectId,天然的雪花算法生成;

    什么是一致性hash

    概念:利用hash环改进余数hash,提高伸缩性;首先计算所有服务器的hash,再计算用户ID的hash,找到离该用户hash最近的服务器hash即为需要请求的服务器;特性:单调性(新增请求会落在原有或新增服务器上,不会落在原有其他服务器上)、分散性(尽量避免同一请求落在不同服务器)、平衡性(负载均衡,但存在倾斜即一个服务器处理了过多请求,增加虚拟节点解决);均匀一致性hash:优化虚拟节点算法,使每台服务器负载尽量均衡;

    什么是restful,讲讲你理解的restful

    RESTful是对资源的表述性状态转移,是一种架构的规范与约束、原则,符合这种规范的架构就是RESTful架构,资源是REST系统的核心概念,每个资源都拥有一个资源标识,通过URL来表示资源,URL中需要区分单复数, 可以用相对路径中的请求参数表示资源的层级关系,使用合适的动词get、delete、put、post发起请求,使用标准的状态码返回;

    解释什么是MESI协议(缓存一致性)。

    缓存一致性指在采用层次结构存储系统的计算机系统中保证高速缓冲存储器中数据与主存储器中数据相同机制; 解决缓存不一致的方式可以通过在总线加LOCK#锁的方式活着通过缓存一致性协议;  加锁的方式在锁住总线期间,其他CPU无法访问内存,效率低下,  而缓存一致性协议中每个处理器通过嗅探总线数据来保证数据一致,发现数据更改后将使自身缓存的数据失效而重新从缓存中获取; 

    说说你知道的几种HASH算法,简单的也可以

    Hash算法:MD4、MD5、SHA-1、CRC(Redis使用分槽位);用途:文件校验、数字签名;方法:直接线性函数定址、除留余数、乘余取整、数字分析、平方取中、折叠法、随机数;Hash函数:加法、位运算、乘法、除法、查表、混合Hash;Hash冲突解决:开放定址(有冲突时就寻找下一个空的哈希地址)、拉链地址法、再哈希法(双哈希函数法)、建立一个公共溢出区;

    什么是Paxos算法, 什么是Zab协议

    Paxos :3个角色:proposers提议,acceptors投票接收提议, learners被通知结果;大多数acceptors接收才通过提议;节点可兼多角色;

    Zab:为Zookeeper专门设计的一种支持崩溃恢复和原子广播协议;一种Paxos的实现和改进;主备模式即只有主节点才是proposers即leader,然后由主节点复制给其他节点follower;消息广播:使用原子广播协议,类似2阶段提交,但只要一半以上Fllower返回ACK即提交,减少阻塞;崩溃恢复:Leader挂了之后,自动进入崩溃恢复模式,选举新的 Leader,并完成数据同步,然后退出崩溃恢复模式进入消息广播模式; 

    如何设计一个良好的API

    明确接口职责,接口功能单一,URl代表资源尽量使用名词,使用正确的http方法,考虑跨域,加上API版本,加上适度的过滤条件如翻页,返回的数据格式应包含状态码、错误码、错误描述、资源ID等信息,接口安全性考虑如并发、防攻击,接口可扩展;

    如何做限流策略,令牌桶和漏斗算法的使用场景

    限流的目的通过对并发访问进行限速,一旦达到一定的速率就可以拒绝服务、排队等待、降级等;常见的限流方式有:限制总并发数(数据库连接池、线程池)、限制瞬时并发数(如Nginx的limit_conn模块)、限制时间窗口的平均速率(Nginx的limit_req模块)、限制远程接口的调用速率、限制MQ的消费速率等;从应用的层面上来讲又可以分为:接入层限流、应用层限流和分布式限流等; 

    限流算法:计数器(固定窗口算法):计数周期内累加访问次数,下一周期清零重新计数,可利用Redis的INCR原子递增实现;对周期边界的突发流量限流存在弊端;滑动窗口算法:将时间周期分成N个小周期分别计算,可解决计数器算法的边界问题;漏桶算法:请求到达时直接放入漏桶,如当前容量已达到上限(限流值)则进行丢弃(触发限流策略),漏桶以固定的速率释放访问请求(即请求通过)直到漏桶为空;令牌桶算法:程序以r(r=时间周期/限流值)的速度向令牌桶中增加令牌,直到令牌桶满,请求到达时向令牌桶请求令牌,如获取到令牌则通过请求,否则触发限流策略; 

    实现:Tomcat配置Connector的连接数,Nginx通过limit_req等模块配置;Java代码可通过AtomicLong或者Semaphore进行处理;SpringCloud可使用hystrix实现限流; 

    漏桶算法非常适用于秒杀系统的限流,可以起到一定的削峰填谷的作用,能够应对集中访问的问题,同时具备平滑策略,但不能应对突发的请求洪峰;令牌桶算法能够很好的做平滑,能够应对突发的请求;   

    线上系统突然变得异常缓慢,你如何查找问题

    1、登录后台服务器,查看系统资源是否达到上限如:CPU、内存、磁盘、I/O、网络带宽、文件句柄等,如果是这些问题,先将这些问题逐一解决:如果是CPU的问题,则查看CPU占比较高的进程和线程,然后使用jstack命令生成进程的堆栈信息,再看是否发生频繁FullGC,如果是的话还需要看一下内存快照,分析一下内存情况;如果是磁盘空间满了,及时清理磁盘;如果是带宽满了,联系网络工程师解决;2、检查应用服务器(Jboss/Tomcat)的线程池配置是否合理,看一下请求的排队现象是否严重,如果严重则需要重新设置合理的线程池;同样检查一下数据库的连接池设置是否合理,增大连接池设置,同时检查一下是否有慢sql,如果有慢sql,则进行优化(查看执行计划,设置合理的索引等);3、查看访问慢的服务的调用链,查看一下调用链中的每一步响应时间是否合理,如果不合理,则联系相关系统的负责人进行排查和解决;4、检查web服务器的请求日志,看一下是否存在DDoss攻击,如果有DDoss攻击,则将攻击者的IP添加到防火墙的黑名单里;

    异步模式的用途和意义

    场景:1、不涉及共享资源,或对共享资源只读,即非互斥操作;2、没有时序上的严格关系;3、不需要原子操作,或可以通过其他方式控制原子性;4、常用于IO操作等耗时操作,因为比较影响客户体验和使用性能;5、不影响主线程逻辑; 

    好处:1、异步流程可以立即给调用方返回初步的结果。2、异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作。3、异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。4、异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率。

    应用服务器怎么监控性能,各种方式的区别

    采用第三方系统Zabbix或Prometheus进行监控或者自己写监控程序或者shell脚本部署在需要监控的机器,定时采集监控信息发送到监控中心;服务运行监控包括Nginx日志、Tomcat日志、应用日志;服务器监控包括CPU(vmstat、top)、内存(vmstat、free、top、cat /proc/meminfo)、磁盘IO(df、vmstat、iostat)、网络IO(netstat)、连接数(netstat)、文件句柄(lsof),针对各监控项设置阈值,超过阈值则发送邮件短信通知;

    如何实现负载均衡,有哪些算法可以实现

    负载均衡分类:按照ISO网络模型及工作的层数分为:二层负载均衡:基于数据链路层,负载均衡服务器和业务服务器绑定同一个虚拟IP,客户端请求虚拟IP,负载均衡服务器通过改写Http请求的MAC地址实现;三层负载均衡:基于网络层,按照不同机器不同IP地址进行转发请求到不同的机器上;四层负载均衡:基于传输层,通过TCP/UDP协议,基于IP+端口号进行请求的转发,如LVS;七层负载均衡:基于应用层,通过HTTP,DNS协议,基于请求的URL进行转发负载,如Nginx;其他分类:硬件负载均衡、软件负载均衡;服务端负载均衡、客户端负载均衡;一般会采用DNS+LVS+Nginx的方式进行多层次软件层面的负债均衡,还有在前面多加一层物理负载均衡,比如知名的F5; 

    负载均衡算法:静态算法:轮训、随机、源地址哈希、加权轮训、加权随机、键值范围法;动态算法:最小连接数法、最快响应时间法、观察模式法(综合最小连接数和最快响应度,进行权重分配);

    后台系统怎么防止请求重复提交

    在接口实现中要求接口要满足幂等性来保证多次重复请求时只有一次有效;1、token机制防止页面重复提交:后台给前端发token,前端请求时带上token,后端校验token是否处理;2、select、delete是幂等的,如果是修改数据可以使用分布式锁(单机使用JVM加锁),或者基于Redis的原子计数INSR,或者数据库唯一索引,或者先查询数据库的处理状态,或者基于缓存查询处理状态来实现,每个请求需要分配唯一的业务ID;查询数据库处理状态时可以考虑select..id=xx for update加行锁查询;3、可采用状态机,在有状态的数据中可以使用,如果状态机已经处于下一个状态,这时候来了上一个状态的变更,理论上是不能够变更;

    讲讲你理解的服务治理

    服务治理就是在分布式微服务架构中管理服务和架构实现的一套方法;包括服务生命周期的管理,服务的发布和消费,服务的监控以及限制服务行为的一些方法;服务治理框架SpringCloud涉及服务注册发现,服务配置、服务调用链跟踪、服务健康检查、服务限流熔断、服务的负载均衡等; 

    什么叫数据一致性,你怎么理解数据一致性

    数据一致性通常指关联数据之间的逻辑关系是否正确和完整,分布式系统中由于多用户操作同一数据或者分布式事务、数据副本的存在经常容易出现一致性问题;数据一致性模型包括强一致性: 要求无论更新操作实在哪一个副本执行,之后所有的读操作都要能获得最新的数据;弱一致性:用户读到某一操作对系统特定数据的更新需要一段时间,我们称这段时间为“不一致性窗口”。最终一致性:是弱一致性的一种特例,保证用户最终能够读取到某操作对系统特定数据的更新; 解决方法:CAP、BASE、2PC、3PC、Paxos、Zab、Raft、NWR;

    相关文章

      网友评论

          本文标题:【问答】设计

          本文链接:https://www.haomeiwen.com/subject/yhzbkhtx.html