多人同时导出 Excel 干崩服务器?我们来实现一个排队导出功能!

一、前言

业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,还涉及文件输入、输出流的io操作,所以对服务器的性能会影响的比较大;结合以上原因,对导出操作进行排队;

刚开始拿到这个需求,第一时间想到就是需要维护一个FIFO先进先出的队列,给定队列一个固定size,在队列里面的人进行排队进行数据导出,导出完成后立马出队列,下一个排队的人进行操作;还考虑到异步,可能还需要建个文件导出表,主要记录文件的导出情况,文件的存放地址,用户根据文件列表情况下载导出文件。

二、业务关系定义

分别是用户、导出队列、导出执行方法

  • ExportQueue: 维护一条定长队列,可以获取队列里前后排队的用户,提供查询,队列如果已经满了,其余的人需要进行等待
  • User信息: 排队执行导出方法对应用户;
  • Export类: 定义导出方法,异步执行,用户可以通过导出页面查看、下载,导出的文件;
    多人同时导出 Excel 干崩服务器?我们来实现一个排队导出功能!_第1张图片

三、具体代码实现

1、ExportQueue队列

package com.example.system.config;

import com.example.system.api.domain.ExportUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.LinkedList;

@Slf4j
@Component
public class ExportQueue {


    private final int MAX_CAPACITY = 10; // 队列最大容量
    private LinkedList queue; // 用户队列

    public ExportQueue(LinkedList queue) {
        this.queue = new LinkedList<>();
    }

    /**
     * 排队队列添加
     * @param sysUser
     */
    public synchronized LinkedList add(ExportUser sysUser) {
        while (queue.size() >= MAX_CAPACITY) {
            try {
                log.info("当前排队人已满,请等待");
                wait();
            } catch (InterruptedException e) {
                e.getMessage();
            }
        }
        queue.add(sysUser);
        log.info("目前导出队列排队人数:" + queue

你可能感兴趣的:(系统,JAVA后端,SpringBoot,excel,服务器,android,数据库,后端,分布式,java)