当前位置: 首页 > 知识库问答 >
问题:

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

常乐
2023-03-14

我有一些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个答案

彭衡
2023-03-14

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

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

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

Flux<V> flatMap(
            Function<? super T,? extends Publisher<? extends V>> mapper,
            int concurrency)
 类似资料:
  • 问题内容: 运行我的应用程序时,有时会出现关于的错误。 运行报告该限制为1024。如何将限制增加到1024以上? 编辑 导致权限错误。 问题答案: 您可以随时尝试执行。这只会重置当前shell的限制,并且您指定的数字不得超过硬限制 每个操作系统在配置文件中都有不同的硬限制设置。例如,可以在从/etc/system引导时设置Solaris上的硬打开文件限制。 在OS X上,必须在/etc/sysct

  • 我编写了简单的服务器/客户端程序,其中客户端将一些硬编码数据以小块形式发送给服务器程序,服务器程序正在等待数据,以便将其打印到终端。在客户端,我在循环中调用send(),同时有更多的数据要发送,而在服务器上,我使用read()执行同样的操作,即返回的字节数为 如果我在完成发送后专门在客户端的套接字上调用close(),那么这个示例非常有效,但如果我不这样做,服务器将不会实际退出read()循环,直

  • 问题内容: 我是网络编程的新手。我有兴趣通过Java服务器和C客户端之间的套接字建立网络连接并保持连接无限打开的可能吗?我想保持连接打开状态以在客户端之间交换XML数据。 问题答案: 从理论上讲,可以无限期地打开服务器套接字;但是,使用客户端套接字是不可能的。主要原因是因为客户端套接字取决于处理数据的服务器端套接字,并且服务器套接字可能会关闭连接。 尽管可以无限期地保持连接打开,但实际情况通常会确

  • 问题内容: 我正在尝试在Python中建立安全的套接字连接,而使用SSL有点麻烦。我已经找到一些有关如何与SSL建立连接的代码示例,但它们都涉及密钥文件。我尝试连接的服务器不需要接收任何密钥或证书。我的问题是,我该如何实质上包装带有SSL的python套接字连接。我知道我应该使用的密码是,协议是。这就是我一直在尝试的: 运行此代码时,没有任何错误,但响应为空。当尝试在命令行中调试此代码时,通过在终

  • 我对Java和套接字还是新手。我有一个侦听连接的程序,如果有连接,它会将其发送到处理连接的类,并使用ExecutorService启动处理线程。 我想限制连接的数量,所以我发现套接字有一个参数。这是主要代码: 在本例中,我想将连接限制为1。我试图用大量并行执行python脚本来轰炸它,该脚本将数据发送到此端口。但我从未收到“连接被拒绝”或明显的连接延迟,就好像没有遵守限制一样。 我做错了什么?

  • 问题内容: 如何限制在JTextField中输入的字符数? 假设我要输入最多5个字符。此后,不能输入任何字符。 问题答案: 然后 (谷歌的第一个结果)