上传文件的安全性设计
文件大小:小于20MB
文件后缀:是否满足.xlsx
文件内容:(成本要高一些)
文件的合规性:比如敏感内容,建议用第三方的审核功能。
扩展点:接入腾讯云的图片万象数据审核(COS对象存储的审核功能)
文件大小通过springboot自带的文件大小限制配置即可完成。
文件后缀,不仅要满足使用截取后缀的方法来检查,还要通过检查文件的MIME类型,最后仍然要通过检验文件的内容来检查是否为符合的文件。、
分表设计
对于每个请求,都有数据表的字段,也就是用户请求分析数据所产生的图表数据是按照特定的echart类型返回的,所以这个字段的内容会很大。
随着请求数变大,就会令数据表非常的臃肿,会影响数据查询的效率。
根据这个问题,我将返回的表数据单独一个表进行存储。·
限流设计
使用Redisson的RateLimiter限制每个用户每秒只能访问两次,通过请求令牌的方式实现,用户令牌为:前缀+id,如果能够获得令牌则继续执行,不能抛异常。
限流的方法
固定窗口限流
在固定时间内,只允许固定的数量。
可能会出现流量突刺的问题。
滑动窗口限流
在滑动时间内,只允许固定的数量。
实现相对复杂,是限流效果与滑动单位有关,滑动单位越小,效果越好;但是很难选取适合的滑动单位。
漏桶限流
以固定的速率处理请求,当请求同满了之后,拒绝请求。
没有办法处理一批请求,只能一个一个按顺序来处理。
令牌桶限流
以固定的数据放令牌桶中添加令牌,每个令牌代表一定数量的请求,请求需要获取令牌后才能被处理,没有令牌的请求会被限流并拒绝。
还是存在时间单位选取的问题。
线程池
核心线程数
对于CPU密集型任务:CPU核数 + 1
对于I/O密集型任务:2*CPU核数
线程数 = CPU核心数 * (1 + 线程等待时间/线程运行的总时间)
具体情况也需要根据实际情况设置,对于非业务模块,也可以设置为0
最大线程数
通过压测进行测试,测试出一个边界值
线程存活时间
如果希望核心线程也在空闲的时候被回收,那么可以设置线程存活时间。
工作队列
SynchronousQueue
直接传递任务,不存储任何任务。
当核心线程满时,如果没有空闲线程将任务直接交给时,可能会立即触发拒绝策略。
适合需要尽快处理、严格控制最大并发数的时候。
LinkedBlockingQueue
基于链表的无界队列,可以无限制地添加任务,除非有容量限制。
适用于需要缓冲大量任务的情况。
ArrayBlockingQueue
基于数组的有界队列,需要在创建指定容量。
适用于需要限制队列大小以避免消耗过多内存的情况。
PriorityBlockingQueue
支持带优先级的任务队列,任务会按照优先级顺序执行。
适用于按优先级处理任务的情况。
DelayQueue
基于时间的延迟队列,只有当延迟时间过期后,任务才会被处理。
适用于需要延迟执行的任务。
拒绝策略
丢弃任务单不抛出异常
丢弃任务并抛出拒绝异常
由调用线程处理该任务
丢弃最早的未处理的任务,然后重新尝试提交任务。