为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2021-08-25 16:30:48
我有一些 RESTful 服务,我有想法用 Reactor 和 Spring WebClient 准备简单的性能基准测试。Benchmark 简单地创建 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
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

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

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

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

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

使用该concurrency参数,您可以定义要允许的飞行序列数。


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 267 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信