繁体   English   中英

如何限制spring-webflux WebClient中打开套接字的数量?

[英]How to limit number of open sockets in spring-webflux WebClient?

我有一些RESTful服务,我有想法准备使用Reactor和Spring WebClient的简单性能基准测试。 基准测试仅创建N个用户,然后为每个创建的用户发布M票。

不幸的是,以下代码超出了我的Linux计算机中的最大打开文件限制,即1024( ulimit -n 1024 )。

    RestService restService = ...
    int N_ITERATIONS = 100;
    int M_VOTES = 100;

    Flux.range(0, N_ITERATIONS)
            .parallel()
            .runOn(Schedulers.parallel())
            .flatMap(iteration -> restService.postUserRegistration(User.builder().build()))
            .flatMap(user -> Flux.range(0, M_VOTES)
                    .flatMap(vote -> restService.postUserVote(Vote.builder().build()))
                    .collectList()
                    .map(votes -> Tuple.of(user, votes))
            ).doOnNext(userVotes -> log.info("User: {} voted: {}", userVotes._1(), userVotes._2()))
            .sequential()
            .toIterable();

RestService是使用Spring Webflux的标准WebClient实施的。

有没有一种方法可以根据系统限制来限制创建的套接字数?

堆栈跟踪:

Caused by: io.netty.channel.unix.Errors$NativeIoException: newSocketStream(..) failed: Too many open files
    at io.netty.channel.unix.Errors.newIOException(Errors.java:122) ~[netty-transport-native-unix-common-4.1.27.Final.jar:4.1.27.Final]
    ... 98 common frames omitted

我认为没有。 但是您可以采取措施来防止它。

首先,为什么文件描述符限制这么低? Linux为每个打开的套接字打开一个文件描述符,因此如果您打算同时有很多打开的套接字,则1024会非常低。 我会考虑增加此限制很多。

其次,将并发配置留给调度程序。 您应该知道, flatMap运算符有一个变体,它允许您控制可以订阅和并行合并的Publisher数量:

Flux<V> flatMap(
            Function<? super T,? extends Publisher<? extends V>> mapper,
            int concurrency)

使用concurrency参数,您将能够定义要允许的飞行顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM