Как добиться высокой конкуренции в Spring Boot - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть требование создать продукт, который должен поддерживать 40 одновременных пользователей в секунду (я новичок в работе с параллелизмом)

Чтобы достичь этого, я попытался разработать один привет-весенний загрузочный проект.т. е.

подпружиненный (1.5.9)

пристань 9.4.15

контроллер покоя, который имеет конечную точку

код ниже:

@GetMapping
public String index() {
    return "Greetings from Spring Boot!";
}

Приложение, работающее на компьютере Gen10 DL360

Затем я попытался выполнить эталонный тест с использованием apachebench

75 одновременных пользователей:

ab -t 120 -n 1000000 -c 75 http://10.93.243.87:9000/home/
Server Software:
Server Hostname:        10.93.243.87
Server Port:            9000

Document Path:          /home/
Document Length:        27 bytes

Concurrency Level:      75
Time taken for tests:   37.184 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      143000000 bytes
HTML transferred:       27000000 bytes
Requests per second:    26893.28 [#/sec] (mean)
Time per request:       2.789 [ms] (mean)
Time per request:       0.037 [ms] (mean, across all concurrent requests)
Transfer rate:          3755.61 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1  23.5      0    3006
Processing:     0    2   7.8      1     404
Waiting:        0    2   7.8      1     404
Total:          0    3  24.9      2    3007

100 одновременных пользователей:

ab -t 120 -n 1000000 -c 100 http://10.93.243.87:9000/home/
Server Software:
Server Hostname:        10.93.243.87
Server Port:            9000

Document Path:          /home/
Document Length:        27 bytes

Concurrency Level:      100
Time taken for tests:   36.708 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      143000000 bytes
HTML transferred:       27000000 bytes
Requests per second:    27241.77 [#/sec] (mean)
Time per request:       3.671 [ms] (mean)
Time per request:       0.037 [ms] (mean, across all concurrent requests)
Transfer rate:          3804.27 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2  35.7      1    3007
Processing:     0    2   9.4      1     405
Waiting:        0    2   9.4      1     405
Total:          0    4  37.0      2    3009

500 одновременных пользователей:

ab -t 120 -n 1000000 -c 500 http://10.93.243.87:9000/home/
Server Software:
Server Hostname:        10.93.243.87
Server Port:            9000

Document Path:          /home/
Document Length:        27 bytes

Concurrency Level:      500
Time taken for tests:   36.222 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      143000000 bytes
HTML transferred:       27000000 bytes
Requests per second:    27607.83 [#/sec] (mean)
Time per request:       18.111 [ms] (mean)
Time per request:       0.036 [ms] (mean, across all concurrent requests)
Transfer rate:          3855.39 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   14 126.2      1    7015
Processing:     0    4  22.3      1     811
Waiting:        0    3  22.3      1     810
Total:          0   18 129.2      2    7018

1000 одновременных пользователей:

ab -t 120 -n 1000000 -c 1000 http://10.93.243.87:9000/home/
Server Software:
Server Hostname:        10.93.243.87
Server Port:            9000

Document Path:          /home/
Document Length:        27 bytes

Concurrency Level:      1000
Time taken for tests:   36.534 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      143000000 bytes
HTML transferred:       27000000 bytes
Requests per second:    27372.09 [#/sec] (mean)
Time per request:       36.534 [ms] (mean)
Time per request:       0.037 [ms] (mean, across all concurrent requests)
Transfer rate:          3822.47 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   30 190.8      1    7015
Processing:     0    6  31.4      2    1613
Waiting:        0    5  31.4      1    1613
Total:          0   36 195.5      2    7018

Сверху тестовый прогон,Я достиг ~ 27K в секунду с 75 пользователями сам по себе, но похоже, что увеличение пользователей также увеличивает задержку.Кроме того, мы можем четко отметить, что время подключения увеличивается.

У меня есть требование, чтобы мое приложение поддерживало одновременную работу пользователей 40 КБ (предположим, что все используют собственные отдельные браузеры), и запрос должен быть завершен в течение 250 миллисекунд.

Пожалуйста, помогите мне в этом

1 Ответ

0 голосов
/ 02 апреля 2019

Я тоже не великий волшебник в этой теме, но вот несколько советов:

  • существует жесткое ограничение на количество запросов, которые могут обрабатываться одним экземпляром, поэтому, если вы хотите поддерживать большое количество пользователей, вам нужно больше экземпляра
  • если вы работаете с несколькими экземплярами, вам нужно как-то распределить запросы между экземплярами. Одним из популярных решений является Netflix Eureka
  • если вы не хотите поддерживать дополнительные ресурсы и продукт будет работать в облаке, используйте предоставленные услуги балансировки нагрузки (например, LoadBalancer в AWS)
  • также вы можете настроить параметры пула соединений вашего сервера
...