在Web应用程序中使用RxJava Observables不可思议的缺乏性能改进

前端之家收集整理的这篇文章主要介绍了在Web应用程序中使用RxJava Observables不可思议的缺乏性能改进前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在进行一些测试,以评估在使用基于Observables的反应式API中是否存在真正的优势,而不是阻止传统API.

整个例子是available on Githug

令人惊讶的是,结果显示,输出结果是:

>最好的:返回一个包含阻塞操作的Callable / DeferredResult的REST Services.
>不错:阻止REST服务.
>最糟糕的是:返回DeferredResult的REST Services,其结果由RxJava Observable设置.

这是我的Spring WebApp:

应用:

  1. @SpringBootApplication
  2. public class SpringNioRestApplication {
  3.  
  4. @Bean
  5. public ThreadPoolTaskExecutor executor(){
  6. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  7. executor.setCorePoolSize(10);
  8. executor.setMaxPoolSize(20);
  9. return executor;
  10. }
  11.  
  12. public static void main(String[] args) {
  13. SpringApplication.run(SpringNioRestApplication.class,args);
  14. }
  15. }

SyncController:

  1. @RestController("SyncRestController")
  2. @Api(value="",description="Synchronous data controller")
  3. public class SyncRestController {
  4.  
  5. @Autowired
  6. private DataService dataService;
  7.  
  8. @RequestMapping(value="/sync/data",method=RequestMethod.GET,produces="application/json")
  9. @ApiOperation(value = "Gets data",notes="Gets data synchronously")
  10. @ApiResponses(value={@ApiResponse(code=200,message="OK")})
  11. public List<Data> getData(){
  12. return dataService.loadData();
  13. }
  14. }

AsyncController:具有原始Callable和Observable端点

  1. @RestController
  2. @Api(value="",description="Synchronous data controller")
  3. public class AsyncRestController {
  4.  
  5. @Autowired
  6. private DataService dataService;
  7.  
  8. private Scheduler scheduler;
  9.  
  10. @Autowired
  11. private TaskExecutor executor;
  12.  
  13. @PostConstruct
  14. protected void initializeScheduler(){
  15. scheduler = Schedulers.from(executor);
  16. }
  17.  
  18. @RequestMapping(value="/async/data",notes="Gets data asynchronously")
  19. @ApiResponses(value={@ApiResponse(code=200,message="OK")})
  20. public Callable<List<Data>> getData(){
  21. return ( () -> {return dataService.loadData();} );
  22. }
  23.  
  24. @RequestMapping(value="/observable/data",produces="application/json")
  25. @ApiOperation(value = "Gets data through Observable",notes="Gets data asynchronously through Observable")
  26. @ApiResponses(value={@ApiResponse(code=200,message="OK")})
  27. public DeferredResult<List<Data>> getDataObservable(){
  28. DeferredResult<List<Data>> dr = new DeferredResult<List<Data>>();
  29. Observable<List<Data>> dataObservable = dataService.loadDataObservable();
  30. dataObservable.subscribeOn(scheduler).subscribe( dr::setResult,dr::setErrorResult);
  31. return dr;
  32. }
  33. }

DataServiceImpl

  1. @Service
  2. public class DataServiceImpl implements DataService{
  3.  
  4. @Override
  5. public List<Data> loadData() {
  6. return generateData();
  7. }
  8.  
  9. @Override
  10. public Observable<List<Data>> loadDataObservable() {
  11. return Observable.create( s -> {
  12. List<Data> dataList = generateData();
  13. s.onNext(dataList);
  14. s.onCompleted();
  15. });
  16. }
  17.  
  18. private List<Data> generateData(){
  19. List<Data> dataList = new ArrayList<Data>();
  20. for (int i = 0; i < 20; i++) {
  21. Data data = new Data("key"+i,"value"+i);
  22. dataList.add(data);
  23. }
  24. //Processing time simulation
  25. try {
  26. Thread.sleep(500);
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. return dataList;
  31. }
  32. }

我设置了一个Thread.sleep(500)延迟来增加服务响应时间.

负载测试的结果是:

与Callable异步:700 rps,没有错误

  1. >>loadtest -c 15 -t 60 --rps 700 http://localhost:8080/async/data
  2. ...
  3. Requests: 0,requests per second: 0,mean latency: 0 ms
  4. Requests: 2839,requests per second: 568,mean latency: 500 ms
  5. Requests: 6337,requests per second: 700,mean latency: 500 ms
  6. Requests: 9836,mean latency: 500 ms
  7. ...
  8. Completed requests: 41337
  9. Total errors: 0
  10. Total time: 60.002348360999996 s
  11. Requests per second: 689
  12. Total time: 60.002348360999996 s

阻塞:大约404 rps,但会产生错误

  1. >>loadtest -c 15 -t 60 --rps 700 http://localhost:8080/sync/data
  2. ...
  3. Requests: 7683,requests per second: 400,mean latency: 7420 ms
  4. Requests: 9683,mean latency: 9570 ms
  5. Requests: 11680,requests per second: 399,mean latency: 11720 ms
  6. Requests: 13699,requests per second: 404,mean latency: 13760 ms
  7. ...
  8. Percentage of the requests served within a certain time
  9. 50% 8868 ms
  10. 90% 22434 ms
  11. 95% 24103 ms
  12. 99% 25351 ms
  13. 100% 26055 ms (longest request)
  14.  
  15. 100% 26055 ms (longest request)
  16.  
  17. -1: 7559 errors
  18. Requests: 31193,requests per second: 689,mean latency: 14350 ms
  19. Errors: 1534,accumulated errors: 7559,24.2% of total requests

与可观察的异步:不超过20 rps,并早日得到错误

  1. >>loadtest -c 15 -t 60 --rps 700 http://localhost:8080/observable/data
  2. Requests: 0,mean latency: 0 ms
  3. Requests: 90,requests per second: 18,mean latency: 2250 ms
  4. Requests: 187,requests per second: 20,mean latency: 6770 ms
  5. Requests: 265,requests per second: 16,mean latency: 11870 ms
  6. Requests: 2872,requests per second: 521,mean latency: 1560 ms
  7. Errors: 2518,accumulated errors: 2518,87.7% of total requests
  8. Requests: 6373,mean latency: 1590 ms
  9. Errors: 3401,accumulated errors: 5919,92.9% of total requests

Observable执行的corePoolSize为10,但是将其增加到50也没有改善任何东西.

什么可以解释?

更新:根据akarnokd的建议,我进行了以下更改.从Object.create移动到服务中的Object.fromCallable,并重新使用控制器中的Scheduler,但是我仍然得到相同的结果.

解决方法

这个问题是由某些程序错误引起的.其实这个问题的例子是完美的.

一个警告,以防止其他人出现问题:注意使用Observable.just(func),func实际上是在可观察创建上调用的.所以放置在那里的任何Thread.sleep都会阻塞调用线程

  1. @Override
  2. public Observable<List<Data>> loadDataObservable() {
  3. return Observable.just(generateData()).delay(500,TimeUnit.MILLISECONDS);
  4. }
  5.  
  6. private List<Data> generateData(){
  7. List<Data> dataList = new ArrayList<Data>();
  8. for (int i = 0; i < 20; i++) {
  9. Data data = new Data("key"+i,"value"+i);
  10. dataList.add(data);
  11. }
  12. return dataList;
  13. }

我在RxJava Google group开始讨论,他们帮助我解决了这个问题.

猜你在找的HTML相关文章