Permintaan ke url yang sama diblokir di kumpulan thread http nio

Saya cukup membuat aplikasi RestController di springboot(1.5.4.RELEASE) dan menguji cara kerjanya ketika banyak permintaan masuk. Yang membingungkan saya adalah:

  • url yang sama : permintaan ke-2 diblokir hingga permintaan pertama dijalankan
  • url berbeda: non-blok, 2 permintaan dieksekusi hampir bersamaan

Pertanyaan saya siapa yang memblokir permintaan ke-2 dan mengapa?

Kode Tes:

@GetMapping(value = "/sleep")
public String sleep(HttpServletRequest request, @RequestParam boolean status) 
{
    String requestId = request.toString();
    logger.info("request  [{}] in  and status = {}.", requestId, status);
    String result;
    if (status)
    {
        Thread.currentThread().sleep(10 * 1000);
        result = "slept";
    }
    else
    {
        result = "stay up";
    }
    logger.info("response [{}] out and result = [{}].", requestId, result);
    return result;
}

Hasil tes:

  1. Url yang berbeda:jangan diblokir, hampir mulai dijalankan pada saat yang bersamaan.

http://localhost:20002/sleep?status=false DAN http://localhost:20002/sleep?status=true

2018-08-14 15:04:14.139  [http-nio-20002-exec-5]: connection [RequestFacade@46515328] in  and status = true.
2018-08-14 15:04:16.452  [http-nio-20002-exec-6]: connection [RequestFacade@1140f857] in  and status = false.
2018-08-14 15:04:16.452  [http-nio-20002-exec-6]: connection [RequestFacade@1140f857] out and result = [stay up].
2018-08-14 15:04:24.139  [http-nio-20002-exec-5]: connection [RequestFacade@46515328] out and result = [slept].
  1. Url: blok yang sama, permintaan ke-2 tidak dijalankan sampai permintaan pertama selesai.

http://localhost:20002/sleep?status=true DAN http://localhost:20002/sleep?status=true

2018-08-14 15:10:29.943  [http-nio-20002-exec-9]: connection [RequestFacade@46515328] in  and status = true.
2018-08-14 15:10:39.944  [http-nio-20002-exec-9]: connection [RequestFacade@46515328] out and result = [slept].
2018-08-14 15:10:39.960  [http-nio-20002-exec-1]: connection [RequestFacade@1140f857] in  and status = true.
2018-08-14 15:10:49.960  [http-nio-20002-exec-1]: connection [RequestFacade@1140f857] out and result = [slept].

Saya men-debug kode Tomcat-embed-core dan menemukan bahwa ketika permintaan dengan url berbeda masuk, thread Poller dapat segera menangkapnya dan memprosesnya; ketika permintaan dengan url yang sama masuk, Poller tidak bisa mendapatkannya sampai koneksi pertama dikembalikan.


person George Wang    schedule 14.08.2018    source sumber
comment
Apa yang terjadi jika Anda menggunakan Jetty atau Spring Boot versi lebih baru (1.5.14, bukan 1.5.4)?   -  person M. Deinum    schedule 14.08.2018
comment
Tes di Jetty dan SpringBoot 1.5.14.RELEASE, ternyata tidak ada perbedaan.   -  person George Wang    schedule 23.08.2018
comment
Mencoba mereproduksinya, tetapi berfungsi seperti yang diharapkan di pihak saya. Mengaktifkan 8 permintaan bersamaan untuk URL yang sama dan permintaan tersebut tiba secara bersamaan. Bagaimana Anda menguji ini? Dari browser, tes atau sesuatu seperti cUrl atau Httpie di baris perintah? Saya mencurigai browser yang mungkin mencegah pemanggilan URL yang sama (dan menunggu permintaan pertama selesai sebelum memanggilnya lagi).   -  person M. Deinum    schedule 23.08.2018
comment
Ya, terima kasih. Menggunakan klien yang berbeda dan permintaan tiba secara bersamaan. Chrome-lah yang menghentikan permintaan ke sumber daya yang sama.   -  person George Wang    schedule 24.08.2018


Jawaban (1)


Terima kasih kepada @M.Deinum, pemblokiran tersebut tidak ada hubungannya dengan NIO. Chrome-lah yang memblokir permintaan ke-2, dan karena alasan itu, saya menemukan beberapa komentar di bawah:

this behavior is due to Chrome locking the cache and waiting to see the result of one 
request before requesting the same resource again. 

https://stackoverflow.com/a/27514611/10222882

Dan itu dibuktikan dengan chrome Network -> Timing, request ke-2 berstatus [terhenti] hingga respon ke-1 dikembalikan.

koneksi_terhenti

person George Wang    schedule 24.08.2018