Существует ли клиент Aws на основе асинхронного ввода-вывода? - PullRequest
9 голосов
/ 12 февраля 2012

1) Существует ли реализация aws sdk , которая использует асинхронный ввод-вывод вместо пулов потоков? Я работаю над хорошо масштабируемым веб-сервисом, и профилирование показывает, что ЦП тратит много времени на управление сетевым вводом-выводом в / из Amazon.

2) Текущий клиент использует Apache Http Client , если я не могу найти асинхронную реализацию, я создам собственную версию для ее реализации. Я думал об использовании Jetty Http Client . Это плохая форма для смешивания библиотек Jetty и Apache? Есть ли лучшая альтернатива?

Ответы [ 3 ]

7 голосов
/ 12 февраля 2012

1) Есть ли реализация AWS SDK, которая использует асинхронный Ввод / вывод вместо пулов потоков?

Не то, что я знаю, и я был бы удивлен, что это трудно найти, если бы оно уже существовало.

2) Текущий клиент использует Apache Http Client, если я не могу найти Асинхронная реализация Я создам свою собственную версию для ее реализации. [...] Есть ли лучше альтернатива?

Действительно, есть лучшая альтернатива - AWS SDK для Java в настоящее время использует Http Client версия 4.x (вместо этого вы связались с устаревшей версией JavaDocs версии 3.1) с Apache HttpComponents , который также предоставляет Async HttpClient :

Async HttpClient - реализация HTTP / 1.1-совместимого агента HTTP на основе компонентов HttpCore NIO и HttpClient. Это дополняющее Модуль для Apache HttpClient предназначен для особых случаев, когда возможность обрабатывать большое количество одновременных соединений является более важным чем производительность с точки зрения пропускной способности необработанных данных. [Акцент мой]

Как подчеркивалось, это должно быть облегчено только для соответствующих случаев использования, но (согласно вашему комментарию ) вы отправляете тысячи запросов в AW, что означает, что открытые запросы имеют тенденцию накапливаться , так что это действительно может помочь.

2 голосов
/ 08 января 2018

Новый AWS SDK для Java 2.0 предварительного просмотра был объявлен в июне 2017 года и предоставляет эту функциональность.

SDK теперь поддерживает действительно неблокирующуюI / O.Версия SDK 1.11.x уже имеет асинхронные варианты обслуживания клиентов.Однако они являются просто оберткой вокруг пула потоков и блокирующего клиента синхронизации, поэтому они не обеспечивают преимущества неблокирующего ввода-вывода (высокий параллелизм с очень небольшим количеством потоков).Из-за ограничений и плохого использования ресурсов в модели потоков на соединение многие клиенты обращались за поддержкой для неблокирующего ввода-вывода, поэтому мы рады объявить о первоклассной поддержке неблокирующего ввода-вывода в наших асинхронных клиентах.Под капотом мы используем HTTP-клиент, построенный поверх Netty, для выполнения неблокирующего HTTP-вызова.

Для получения дополнительной информации см.

Однако, имейте в виду:

  • В настоящее время в режиме предварительного просмотра (пока не рекомендуется для производственного использования)
  • Требуется Java 8 +

ОБНОВЛЕНИЕ (январь 2019)

Текущая версия 2.3.0 (долгое время не просматривается).

Рекомендуется использовать эту спецификацию на основе Mavenпроекты:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>software.amazon.awssdk</groupId>
      <artifactId>bom</artifactId>
      <version>2.3.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
2 голосов
/ 12 февраля 2012

Асинхронный ввод-вывод не является «серебряной пулей» - поток-на-соединение обычно быстрее (по пропускной способности) и намного проще кодировать:

http://www.mailinator.com/tymaPaulMultithreaded.pdf

Это звучит для менякак и ваш ограничивающий фактор - это ввод-вывод в Amazon, а не процессорная обработка всех этих соединений.Тот факт, что вы видите много процессорного времени, затрачиваемого на опрос сокетов, может быть просто артефактом профилирования из-за того, что эти вызовы блокируются.(Что-то проверить: действительно ли вы максимально используете процессор?)

...