2016-06-20 2 views
0

Мы используем Finatra и имеем сервисы, возвращающие Twitter Future. В настоящее время мы используем либо Future { ... }, либо Future.value(..), чтобы построить Future экземпляров, но, глядя на источник, это не выглядит правильным.Как правильно построить будущее Twitter

В Future.apply источник doc говорит: «что в вызывающем потоке выполняется a, и поэтому необходимо соблюдать осторожность при блокировании кода».

Итак, как создать Future, который выполняет функцию в отдельном потоке, как это делает Scala Future?

+0

Я бы порекомендовал создать проблему [здесь] (https://github.com/twitter/util/issues) – thefourtheye

+0

@thefoureye, что «проблема»? – Dima

+0

Согласен с @Dima. Это не проблема, которая плохо документирована. –

ответ

2

Для этого вам нужен FuturePool. Что-то вроде val future = FuturePool.defaultPool { doStuff() }

И Future.value, и Future.apply являются незамедлительными. Они более или менее эквивалентны scala.concurrent.Future.successful.

+0

Спасибо. Я также нашел это: https://twitter.github.io/scala_school/finagle.html#DontBlock, говорящее то же самое. Слишком плохо, что это неправильно описано в документации Finagle. –

0

+1 к ответу Димы, но ...

Поступать в фоновом потоке (FuturePool), потому что ваш сервер пытается не отставать от запроса нагрузки обычно не правильное решение. Предполагая, что вы просто обрабатываете задачу с интенсивным процессором в течение 100 мс, возможно, лучше сохранить ее в одном потоке и отрегулировать количество серверов, которые у вас есть, и количество запросов на обслуживание потоков.

Но если вы делаете что-то вроде запроса к базе данных или удаленной службе, этот вызов в идеале возвращает действительно асинхронное Будущее, которое не блокирует нити finagle.

Если у вас есть API-интерфейс sync, который обертывает сетевую услугу, то FuturePool, вероятно, является правильной вещью для ее устранения.

+0

Мы выполняем вызовы внешних и внешних служб, поэтому зачем-то нужно запускать async, поэтому ресурсы этих служб освобождаются, поэтому они могут продолжать обрабатывать следующие запросы, «ожидая» ответа от внешних систем. –

+0

В идеальном мире вы бы использовали клиента finagle, чтобы поговорить с db и этими внешними службами, и вам не понадобится FuturePool. Если это не вариант, это звучит так, будто вы поступаете правильно. –

+0

@YuriSchimke Знаете ли вы о реализации клиента finagle, способном разговаривать с базой данных (и/или cassandra/dynamo/S3)? Я не знаю ни одного ... – Dima