У нас есть 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