开发者社区> 问答> 正文

带有Undertow的MockServer

我目前正在尝试创建一个模拟服务器,该服务器以200ms的睡眠时间生成静态json响应(100KB)。我在启动时从光盘中读取了Json一次,并将其作为字符串存储在实例变量中,并针对每个请求进行渲染。

public class Bot {

    private String json;

    public Bot() {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("huge.json");
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

        try {
            JSONObject jsonObject = (JSONObject) new JSONParser().parse(inputStreamReader);
            json = jsonObject.toJSONString();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    @GET
    @Path("/endpoint")
    @Produces(MediaType.APPLICATION_JSON)
    public Response api(@QueryParam("sleep") String sleep) {

        if (sleep != null && !sleep.isEmpty() && Integer.valueOf(sleep) > 0) {
            try {
                Thread.sleep(Integer.valueOf(sleep));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


        return Response.status(200).entity(json).build();
      }
  }

另外我的下排设置看起来像这样-

final Undertow.Builder builder = Undertow.builder()
            //.addHttpsListener("port", "0.0.0.0", sslContext)
            .addHttpListener(4080, "0.0.0.0")
            .setSocketOption(Options.SSL_CLIENT_AUTH_MODE, SslClientAuthMode.REQUESTED)
            .setSocketOption(Options.CONNECTION_LOW_WATER, 20000)
            .setSocketOption(Options.CONNECTION_HIGH_WATER, 21000)
            .setBufferSize(1024 * 16)
            .setIoThreads(Math.max(config.minIOThreads, Runtime.getRuntime().availableProcessors() - 1))
            .setSocketOption(Options.BACKLOG, 2048)
            .setServerOption(UndertowOptions.ALWAYS_SET_DATE, true)
            .setServerOption(UndertowOptions.SSL_USER_CIPHER_SUITES_ORDER, true)
            .setServerOption(Options.SSL_ENABLED_CIPHER_SUITES, CIPHER_SUITES)
            .setHandler(Handlers.header(Handlers.path().addPrefixPath("/", getRestEasyServlet(config)),
                    Headers.SERVER_STRING, "Mock Server"))
            .setWorkerThreads(20000);

    undertow = builder.build();
    undertow.start();

我正在以非常基本的最小并发/线程数为1运行apache基准测试。

ab -t 9999 -k -n 10000 -c 1 host

我原以为只有1个保持活动连接(工作线程将休眠200毫秒,并将json写入连接,最终连接将返回到池中,ab将重用此连接以发送后续请求)考虑到我要睡200ms,我将得到5的rps。但是我注意到,当我监视进程套接字时,会创建很多管道,最终它们会由于TooManyFile open Exception而最大化。

我不确定我在这里缺少什么。

展开
收起
垚tutu 2019-12-04 17:12:03 763 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载