Springboot:在请求之间引入延迟

vc6uscn9  于 7个月前  发布在  Spring
关注(0)|答案(1)|浏览(116)

我有一个问题,我将在哪里得到200个并行请求到Spring Rest Service 1,Service 1将这些请求转发到Service 2,但我需要在请求之间延迟25秒,同时发送到Service 2(Service 2需要30秒的过程)。
尝试以下方法
1.如果我使用@RestController @RequestMapping,并添加了20秒的thread.sleep,这会导致504,因为主线程阻塞无法处理其他请求
1.尝试@asyn与thread.sleep的20秒总是抛出500到最终用户与org.springframework.web.context.request. codec.AsyncRequestTimeoutException
最好的解决办法是什么
提前感谢

weylhg0b

weylhg0b1#

如果我没理解错的话,你需要一个排队系统。
让我们从创建一个队列开始:

  • 我们将它标记为@Service,这样我们就可以从RestController自动连接它。
  • 昂克
  • 进程队列(一项)
  • 调度作业运行程序
  • 现在我们可以简单地从rest-controller调用它。

我们结束了。

验证码:

队列

@Service
public class OurQueueService {
    private final List<SomeDto> queue = new ArrayList<>();

    public void enqueue(SomeDto someDto) {
        synchronized (queue) {
            queue.add(someDto);
        }
    }

    @Scheduled(fixedRate = 5 * 1000)
    public void processQueue() {
        synchronized (queue) {
            if(queue.size()>0){
                  SomeDto thatDto = queue.get(0);
                  // now process it here, create a method if you want
                  queue.remove(0);
            }
        }
    }
}

字符串
如何使用它:

@RestController
public class RandomRestController {
    
    private final OurQueueService ourQueueService;

    @PostMapping("/enqueue")
    public String enqueueRequest(@RequestBody SomeDto someDto) {
        ourQueueService.enqueue(someDto);
        return "meaw";
    }
}


为了同时解决这么多请求,你需要负载平衡

  • 让我们首先为Sping Boot 应用程序创建一个Dockerfile
  • 然后创建一个docker-compose.yaml,我们将在其中添加负载均衡器
  • 使用尽可能多的示例运行docker compose
    验证码:

Dockerfile

# ref: https://spring.io/guides/topicals/spring-boot-docker/#A-Basic-Dockerfile
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]


docker-compose.yaml

version: '3'
services:
  load-balancer:
    image: dockercloud/haproxy
    links:
      - webapp
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "8080:80"
  webapp:
    build: .
    environment:
      - SPRING_PROFILES_ACTIVE=docker
    expose:
      - "8080"


运行它:docker-compose up --scale webapp=<number-of-instance> -d

相关问题