LINUX.ORG.RU

Spring 5 WebFlux blocking call best practice

 ,


0

1

Решил использовать в новом проекте WebFlux, тк Play не понравился, и со спрингом знаком уже давно.

имеем контроллер с задачей сходить в базу и вернуть ответ.

@RestController
@RequestMapping(path = "/test", produces = { APPLICATION_JSON_UTF8_VALUE })
public class UserService {
	private JdbcTemplate jdbcTemplate;
	@Autowired
	void setDataSource(DataSource dataSource) {
		jdbcTemplate = new JdbcTemplate(dataSource);
	}
	@GetMapping(path = "test")
	Mono<ResponseEntity<String>> test() {
		return Mono.just(ok(jdbcTemplate.queryForObject("select pg_sleep(0.1)", String.class)));
	}
	@GetMapping(path = "test1")
	Mono<ResponseEntity<String>> test1() {
		return Mono
			.defer(() -> Mono.just(ok(jdbcTemplate.queryForObject("select pg_sleep(0.1)", String.class))))
			.publishOn(Schedulers.elastic());
	}
	@GetMapping(path = "test2")
	Mono<ResponseEntity<String>> test2() {
		return Mono
			.fromCallable(() -> ok(jdbcTemplate.queryForObject("select pg_sleep(0.1)", String.class)))
			.publishOn(Schedulers.elastic());
	}
}

в различных мануалах предлагают блокирующий вызов оборачивать по методу «test1» или «test2».

проверил с помощью siege на локалхосте и получил странный результат.

siege -c 200 -b http://localhost:8080/test/test
Transaction rate:              38.32 trans/sec

siege -c 200 -b http://localhost:8080/test/test1
Transaction rate:              38.35 trans/sec

siege -c 200 -b http://localhost:8080/test/test2
Transaction rate:              98.02 trans/sec

не понятно почему метод «test1» так тормозит.

★★

Последнее исправление: drsm (всего исправлений: 1)

Ответ на: комментарий от stevejobs

не знаю, как помог бы мне профайлер в данной ситуации...

а виноват как обычно долбаный cut'n'paste :)

	@GetMapping(path = "test1")
	Mono<ResponseEntity<String>> test1() {
		return Mono
			.defer(() -> Mono.just(ok(jdbcTemplate.queryForObject("select pg_sleep(0.1)", String.class))))
-			.publishOn(Schedulers.elastic());
+			.subscribeOn(Schedulers.elastic());
	}

drsm ★★
() автор топика
Ответ на: комментарий от bytecode

да, конечно. перформанс аналогичный получился.

$ siege -c 200 -b http://localhost:8080/test/test
** SIEGE 3.0.5
** Preparing 200 concurrent users for battle.
The server is now under siege...^C
Lifting the server siege...      done.

Transactions:                   1894 hits
Availability:                 100.00 %
Elapsed time:                  17.27 secs
Data transferred:               0.00 MB
Response time:                  1.58 secs
Transaction rate:             109.67 trans/sec
Throughput:                     0.00 MB/sec
Concurrency:                  173.46
Successful transactions:        1894
Failed transactions:               0
Longest transaction:           16.46
Shortest transaction:           0.00
...
$ siege -c 200 -b http://localhost:8080/test/test1
...
Transactions:                   7284 hits
Availability:                 100.00 %
Elapsed time:                  25.04 secs
Data transferred:               0.00 MB
Response time:                  0.68 secs
Transaction rate:             290.89 trans/sec
Throughput:                     0.00 MB/sec
Concurrency:                  196.71
Successful transactions:        7284
Failed transactions:               0
Longest transaction:            1.99
Shortest transaction:           0.03
...
$ siege -c 200 -b http://localhost:8080/test/test2
...
Transactions:                   6081 hits
Availability:                 100.00 %
Elapsed time:                  20.90 secs
Data transferred:               0.00 MB
Response time:                  0.67 secs
Transaction rate:             290.96 trans/sec
Throughput:                     0.00 MB/sec
Concurrency:                  196.30
Successful transactions:        6081
Failed transactions:               0
Longest transaction:            1.98
Shortest transaction:           0.03

drsm ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.