Saya ingin menguji permintaan paralel di pengontrol saya. Saya tahu bahwa secara default Spring dapat menangani 200 permintaan paralel dan kami dapat mengubahnya dengan memodifikasi properti ini server.tomcat.max-threads

Saya bermain sedikit dengan nilai itu dan menemukan hal yang menarik: Ketika saya menyetelnya ke 3 ketika saya memulai aplikasi, saya melihat 3 utas sedang dibuat: http-nio-8080-exec-1,2,3 Ketika saya mengaturnya ke 5 saya melihat 5 utas seperti itu. Dan terus sampai 10 dan berhenti di 10. Ketika saya set ke 15 masih ada 10 utas nama http-nio-8080-exec. Bisakah seseorang menjelaskan mengapa tidak pernah melebihi 10?

Jika saya akan membuat pengontrol seperti ini

@GetMapping("test")
public String test(@RequestParam("skip") boolean skip) throws InterruptedException {
    if(!skip) {
        System.out.println("I'm starting waiting");
        Thread.sleep(10000);
        System.out.println("I stopped waiting");
    }
    return "dd";
}

Sambil memiliki server.tomcat.max-threads=200

Buat 10 permintaan seperti itu: http://localhost:8080/test?skip=false

Dan permintaan ke-11 seperti itu secara bersamaan: http://localhost:8080/test?skip=true< /a>

10 permintaan pertama ini harus menunggu 10 detik sebelum mengembalikan respons tetapi permintaan ke-11 harus segera kembali - masalahnya adalah permintaan ke-11 juga menunggu, jadi diblokir. Bisakah seseorang menjelaskan cara kerjanya? Jika saya memiliki server.tomcat.max-threads disetel ke 200 maka saya berharap saya akan dapat menangani 200 permintaan independen, benar?

2
a4dev92 8 Maret 2020, 14:56

1 menjawab

Jawaban Terbaik

Saya penasaran dengan perilakunya dan mengujinya sendiri. Sayangnya saya tidak dapat mengonfirmasi perilaku yang Anda alami. Untuk dapat menguji secara bersamaan permintaan ke layanan, saya menulis program go sederhana untuk membuktikan waktu respons. Jadi saya memulai layanan boot musim semi dengan titik akhir istirahat tunggal dengan kode yang Anda posting di atas dan sebagai klien mengikuti program go:

package main

import (
    "log"
    "os/exec"
    "time"
)

func main() {
    for i := 0; i< 15; i++ {
        go runCmd(i)
    }
    time.Sleep(time.Second * 50)
}

func runCmd(i int) {
    param := "localhost:8080/test?skip=false"
    if i > 10 {
        param = "localhost:8080/test?skip=true"
    }
    cmd := exec.Command("curl", param)
    log.Printf("Running command %d and waiting for it to finish...", i)
    start := time.Now()
    err := cmd.Run()
    end := time.Now()
    duration := end.Sub(start)
    log.Printf("Command  %d finished within of second %f error: %v", i, duration.Seconds(), err)
}

Program ini menggunakan curl untuk mengirim 10 permintaan pertama dengan parameter skip=false dan 5 permintaan lainnya dengan skip=true. Dan outputnya adalah:

2020/03/08 19:21:18 Running command 14 and waiting for it to finish...
2020/03/08 19:21:18 Running command 9 and waiting for it to finish...
2020/03/08 19:21:18 Running command 3 and waiting for it to finish...
2020/03/08 19:21:18 Running command 10 and waiting for it to finish...
2020/03/08 19:21:18 Running command 7 and waiting for it to finish...
2020/03/08 19:21:18 Running command 0 and waiting for it to finish...
2020/03/08 19:21:18 Running command 12 and waiting for it to finish...
2020/03/08 19:21:18 Running command 6 and waiting for it to finish...
2020/03/08 19:21:18 Running command 5 and waiting for it to finish...
2020/03/08 19:21:18 Running command 13 and waiting for it to finish...
2020/03/08 19:21:18 Running command 11 and waiting for it to finish...
2020/03/08 19:21:18 Running command 2 and waiting for it to finish...
2020/03/08 19:21:18 Running command 1 and waiting for it to finish...
2020/03/08 19:21:18 Running command 4 and waiting for it to finish...
2020/03/08 19:21:18 Running command 8 and waiting for it to finish...
2020/03/08 19:21:18 Command  12 finished within of second 0.035109 error: <nil>
2020/03/08 19:21:18 Command  14 finished within of second 0.035290 error: <nil>
2020/03/08 19:21:18 Command  11 finished within of second 0.040090 error: <nil>
2020/03/08 19:21:18 Command  13 finished within of second 0.041358 error: <nil>
2020/03/08 19:21:28 Command  9 finished within of second 10.034510 error: <nil>
2020/03/08 19:21:28 Command  0 finished within of second 10.034436 error: <nil>
2020/03/08 19:21:28 Command  10 finished within of second 10.037470 error: <nil>
2020/03/08 19:21:28 Command  6 finished within of second 10.042294 error: <nil>
2020/03/08 19:21:28 Command  5 finished within of second 10.042328 error: <nil>
2020/03/08 19:21:28 Command  7 finished within of second 10.045510 error: <nil>
2020/03/08 19:21:28 Command  3 finished within of second 10.045638 error: <nil>
2020/03/08 19:21:28 Command  1 finished within of second 10.049024 error: <nil>
2020/03/08 19:21:28 Command  2 finished within of second 10.053824 error: <nil>
2020/03/08 19:21:28 Command  8 finished within of second 10.053102 error: <nil>
2020/03/08 19:21:28 Command  4 finished within of second 10.053306 error: <nil>

Seperti yang Anda lihat di permintaan keluaran 11 - 14 selesai tanpa penundaan, sehingga tidak diblokir. Jadi mungkin Anda harus memeriksa pengujian Anda, mungkin masalahnya ada di suatu tempat dalam pengujian dan bukan dalam konfigurasi Tomcat.

Dan harapan untuk menangani 200 permintaan independen adalah benar, jadi seharusnya berperilaku dan berperilaku seperti itu.

1
Sergej Masljukow 8 Maret 2020, 19:02