Как использовать InetResolver с пользовательским Threadpool для Finagle HTTP Client - PullRequest
0 голосов
/ 04 декабря 2018

У нас есть HTTP-клиент finagle, который использует логику ClientBuilder для создания экземпляра службы.

После просмотра деталей здесь и здесь A few methods do not yet have one-to-one equivalents, such as ClientBuilder.retries and for these you should migrate to using MethodBuilder. Мы решили создатьСервис, использующий логику MethodBuilder.

Код, использующий логику построителя методов, выглядит ок.ниже в java.

    Long connectionTimeoutMillis = ???
    Long reqTimeoutMillis = ???
    hostConnectionLimit: Long = ???
    label: String = ???
    val StatsReceiver: StatsReceiver = ???
    host = ???

    Http.Client client = Http.client()
                .withDecompression(true)
                .withHttpStats()
                .withStatsReceiver(new MetricsStatsReceiver())
                .withSessionQualifier().noFailFast()
                .withSessionQualifier().noFailureAccrual()
                .withDecompression(true)
                .withHttp2()
                .withAdmissionControl().noNackAdmissionControl()
                .withLabel(label)
                .withSession().acquisitionTimeout(Duration.fromTimeUnit(connectionTimeoutMillis, TimeUnit.MILLISECONDS))
                .withTransport().connectTimeout(Duration.fromTimeUnit(connectionTimeoutMillis, TimeUnit.MILLISECONDS))
                .withRequestTimeout(Duration.fromTimeUnit(reqTimeoutMillis, TimeUnit.MILLISECONDS))
                .withSessionPool().maxSize(hostConnectionLimit);
    Service<Request, Response> service = client.newService(host);

    Future<Response> resp = service.apply(req).within(Duration.apply(reqTimeoutMillis, TimeUnit.MILLISECONDS), finagleTimer);

После обновления до логики построителя метода сервер вышел из строя и обнаружен из-за проблемы здесь .

Ошибка -

    2019-04-09 08:50:43,948 ERROR [UnboundedFuturePool-256142] [Monitor.scala:247] VM error
    java.lang.OutOfMemoryError: unable to create new native thread
            at java.lang.Thread.start0(Native Method)
            at java.lang.Thread.start(Unknown Source)
            at java.util.concurrent.ThreadPoolExecutor.addWorker(Unknown Source)
            at java.util.concurrent.ThreadPoolExecutor.execute(Unknown Source)
            at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
            at com.twitter.util.ExecutorServiceFuturePool.apply(FuturePool.scala:156)
            at com.twitter.finagle.DnsResolver$$anonfun$apply$3.apply(InetResolver.scala:36)
            at com.twitter.finagle.DnsResolver$$anonfun$apply$3.apply(InetResolver.scala:35)
            at com.twitter.util.Future$$anonfun$flatMap$1.apply(Future.scala:1808)
            at com.twitter.util.Future$$anonfun$flatMap$1.apply(Future.scala:1807)
            at com.twitter.util.Promise$FutureTransformer.liftedTree1$1(Promise.scala:240)
            at com.twitter.util.Promise$FutureTransformer.k(Promise.scala:240)
            at com.twitter.util.Promise$Transformer.apply(Promise.scala:215)
            at com.twitter.util.Promise$WaitQueue.com$twitter$util$Promise$WaitQueue$$run(Promise.scala:91)
            at com.twitter.util.Promise$WaitQueue$$anon$4.run(Promise.scala:86)
            at com.twitter.concurrent.LocalScheduler$Activation.run(Scheduler.scala:198)
            at com.twitter.concurrent.LocalScheduler$Activation.submit(Scheduler.scala:157)
            at com.twitter.concurrent.LocalScheduler.submit(Scheduler.scala:274)
            at com.twitter.concurrent.Scheduler$.submit(Scheduler.scala:109)
            at com.twitter.util.Promise$WaitQueue.runInScheduler(Promise.scala:86)
            at com.twitter.util.Promise.updateIfEmpty(Promise.scala:778)
            at com.twitter.util.ExecutorServiceFuturePool$$anon$4.run(FuturePool.scala:140)
            at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
            at java.util.concurrent.FutureTask.run(Unknown Source)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
            at java.lang.Thread.run(Unknown Source)

Я не уверен, как настроить InetResolver с клиентским пулом потоков для http-клиента, но безуспешно.

Может кто-нибудь предложить идею настроить finagle http-клиент с InetResolver с пользовательским пулом потоков.

Текущая версия finagle, которую мы используем - 19.3.0

...