Какой уровень асинхронизма в игре!фреймворк - PullRequest
4 голосов
/ 28 января 2012

Играть! рекламирует его функцию асинхронной обработки HTTP, хотя мне не очень понятно, что еще является действительно асинхронным (неблокирующим и без переключения потоков.) В асинхронных примерах, которые я читаю, нижеприведенный взят из Play! Framework Cookbook:

public static void generateInvoice(Long orderId) {
    Order order = Order.findById(orderId); // #a
    InputStream is = await(new OrderAsPdfJob(order).now()); // #b
    renderBinary(is);
}

Они фокусируются на длинном / дорогом шаге "бизнес-логики" на #b, но меня беспокоит вызов БД на #a. Фактически, большинство методов контроллера во многих приложениях просто пытаются сделать несколько CRUD для БД, например:

public static void generateInvoice(Long orderId) {
    Order order = Order.findById(orderId); // #a
    render(order);
}

Меня особенно беспокоит утверждение об использовании «небольшого количества потоков» при обслуживании этого шаблона доступа к БД.

Итак, вопросы

  1. Буду играть! будет блокировать вызовы JDBC?
  2. Если мы завершим такие вызовы в будущем / обещание / ожидание, это вызовет переключение потоков (помимо неудобств из-за распространенности вызовов БД), верно?
  3. В свете этого как его асинхронизм сравнивается с сервлет-сервером с разъемом NIO (например, Tomcat + разъем NIO, но без использования нового обработчика событий) при обслуживании этого шаблона доступа к БД?
  4. Планируется ли поддержка драйвера асинхронной БД, например http://code.google.com/p/adbcj/?

1 Ответ

1 голос
/ 08 ноября 2012
  1. Воспроизведение блокирует вызовы JDBC - нет волшебства, чтобы предотвратить это.
  2. Чтобы обернуть j.u.c.Future в F.Promise for Play, необходим цикл. Это может привести к большому количеству переключений контекста.
  3. Контейнеры сервлетов могут использовать NIO, например. держать соединения открытыми между запросами, не связывая потоки для неактивных соединений. Но вызов JDBC в коде обработки запросов точно так же блокирует и связывает поток.
  4. ADBCJ реализует j.u.c.Future, но также поддерживает обратные вызовы, которые можно привязать к F.Promise, см. https://groups.google.com/d/topic/play-framework/c4DOOtGF50c/discussion.

Я не уверен, что асинхронная функция Play имеет смысл, учитывая, насколько она усложняет код и тестирование. Может быть, если вам нужно обрабатывать тысячи запросов в секунду на одной машине при вызове медленных сервисов.

...