个人项目复习-短链Day01
考点1注册功能要求功能需求使用手机号注册且已经注册的手机号不能重复注册密码不能使用简单的md5加密用户上传头像需要用到文件存储。安全需求高并发下账号的唯一性注册邮箱或手机号验证码不能被恶意调用。验证码唯一索引头像文件存储访问方便扩容和管理。阿里云OSS高并发处理异步池化思想。考点2压测工具对比LoadRunner性能稳定压测结果及细粒度大可以自定义脚本进行压测但是太过于重大功能比较繁多ApacheAB (单接口压测最方便)模拟多线程并发请求。ab 命令对发出负载的计算机要求很低既不会占用很多 CPU也不会占用太多的内存但却会给目标服务器造成巨大的负载简单 DDOS 攻击等Webbenchwebbench 首先 fork 出多个子进程每个子进程都循环做 web 访问测试。子进程把访问的结果通过 pipe 告诉父进程父进程做最终的统计结果。Jmeter开源免费功能强大在互联网公司普遍使用Jmeter的优点功能测试压力测试分布式压力测试纯 java 开发上手容易高性能提供测试数据分析各种报表数据图形展示考点3Async注解什么是异步任务异步调用时相对于同步调用而言的同步调用时指程序按预定顺序一步步执行每一步必须等到上一步执行完成后才能执行异步调用则无需等待上一步程序执行完成即可执行。异步任务适用在什么场景上处理log发送邮件短信等以及各种各样处理网络IO调用的操作上面。Async失效情况方法不是public放回值只能为void或者Future注解方法使用static修饰没加注解Async或者EnableAsync注解调用方与被调用方法不能在同一个类考点4为什么调用方法和被调用方法不能在同一个类Spring在扫描bean的时候会扫描方法上是否包含Async注解动态地生产一个子类即proxy代理类当这个有注解的方法被调用时实际上是由代理类来调用的代理类在调用时增加异步作用。如果这个有注解的方法是被同一个类中的其他方法调用的那么该方法的调用并没有通过代理类而是直接通过原来的那个bean使用就失败了。所以调用方和被调用方不能在用一个类主要是使用了动态代理同一个类的时候直接调用不是通过生成的动态代理类调用。一般将要异步执行的方法单独抽取成一个类。类中需要使用Autowired和Resource等注解自动注入不能自己动手new对象。在Async方法上标注Transactional是没有用的但在Async方法上调用的方法上标注Transactional是有效的。考点5自定义线程池为什么要自定义线程池当我们使用Async注解没有指定线程池的话即未设置TaskExecutor时默认使用Spring创建ThreadPoolTaskExecutor默认线程数为8最大线程数为:Integer。MAX_VALUE21亿多队列使用LinkedBlockingQueue容量是Inter.MAX_VALUE空闲线程保留时间是60s。线程池拒绝策略为AbortPolicy。线程池内部的阻塞队列里面。但是这样有一些弊端极其容易出现OOM或者消息丢失。ThreadPoolTaskExecutor和ThreadPoolExecutorThreadPoolExecutor这个是JDK里面的线程池类继承自Executor里面有一个execute方法用来执行线程线程池主要提供了一个线程队列队列中保存着所有等待状态的线程避免了创建与销毁的额外开销ThreadPoolTaskExecutor是spring包下的是spring为我们提供的线程池类其异步线程池的接口类是TaskExecutor本质还是java.util.concurrent.Executor。ThreadPoolTaskExecutor线程池有哪几个重要参数什么时候会创建线程池查看核心线程池是否满不满就创建一个线程池。满的话执行下一步。查看阻塞队列是否满不满创建阻塞队列。满的话执行下一步。查看线程池是否满即是否达到最大线程池数不满创建一个线程执行任务满则按照策略处理无法执行的任务。高并发下核心线程怎么设置首先我们需要知道是IO密集还是CPU密集CPU密集设置跟核心数一样大小。IO密集型设置为2倍的CPU核心数。但是这个是非固定的我们还是要根据实际压测结果调整。考点6自定义线程池出现的问题线程池参数往小了配置此方法qps小等待队列小线程池参数往大了配置此方法qps等待队列大瞬间很高但是容易发送OOM通过这两个方法我们会发现一些问题。当我们采用异步发送用户体验是变好了但是数据存在丢失的可能性阻塞队列存储内存中如果队列长度过多则重启容易出现丢失数据情况。当我们采用异步发送阻塞队列缓冲刚开始瞬间QPS高但是后续还是会降低很多。考点7RestTemplate里面存在的问题服务端向前端socket连接管道写返回数据时 链接pipe却断开了。从应用角度分析这是因为客户端等待返回超时了主动断开了与服务端连接。连接数设置太小并发量增加后造成大量请求排队等待。网络延迟是否丢包。内存是否足够多支持对应的并发量。重新认识RestTemplateRestTemplate是spring提供的用于访问Rest服务的客户端底层通过使用java.net包下创建HTTP请求通过使用ClientHttpRequestFactory指定不同的HTTP请求方式主要提供了两种实现方法。SimpleClientHttpRequestFactory默认底层使用j2se提供的方式即java.net包提供的方式创建底层Http请求连接主要createRequest方法端点调试每次都会创建连接会造成极大的资源浪费而且若连接不能及时释放会因为无法建立新的连接导致后面的请求阻塞。HttpComponentsClientHttpRequestFactory底层使用HttpClient访问远程的Http服务。问题解决客户端每次请求都要和服务端建立新的连接即三次握手将会非常耗时。通过http连接池可以减少连接建立与释放的时间提升http请求的性能Spring的restTemplate是对httpclient进行了封装而httpclient是支持池化机制对httpclient进⾏封装的有Apache的Fluent、es的 restHighLevelClient、spring的restTemplate等Configuration public class RestTemplateConfig { Bean public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory){ return new RestTemplate(requestFactory); } Bean public ClientHttpRequestFactory httpRequestFactory(){ return new HttpComponentsClientHttpRequestFactory(httpClient()); } Bean public HttpClient httpClient(){ RegistryConnectionSocketFactory registry RegistryBuilder.ConnectionSocketFactorycreate() .register(http, PlainConnectionSocketFactory.getSocketFactory()) .register(https, SSLConnectionSocketFactory.getSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManagernew PoolingHttpClientConnectionManager(registry); //设置连接池最大是500个连接 connectionManager.setMaxTotal(500); //MaxPerRout是对maxTotal的细分,每个主机的并发最大是300,route指域名 connectionManager.setDefaultMaxPerRoute(300); /** * 只请求 该网站 , 最大并发量300 */ RequestConfig requestConfigRequestConfig.custom() //返回数据的超时时间 .setSocketTimeout(20000) //连接上服务器的超时时间 .setConnectTimeout(10000) //从连接池中获取连接的超时时间 .setConnectionRequestTimeout(1000) .build(); CloseableHttpClient closeableHttpClient HttpClientBuilder.create().setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .build(); return closeableHttpClient; } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2410329.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!