Как HawtDispatch отличается от Java-исполнителей? (и нетто)

Разочаровательно сайт HawtDispatch описывает его как "объединение потоков и API-интерфейс уведомления о событиях NIO".

Сначала возьмем часть "объединение потоков". Большинство исполнителей, предоставляемых Java, также являются в основном пулами потоков. Как отличается HawtDispatch?

Это также, по-видимому, "API-интерфейс уведомления о событиях NIO". Я предполагаю, что это тонкий слой поверх NIO, который принимает входящие данные и переходит к понятию "пул потоков" и передает его потребителю, когда планировщик пула потоков находит время. Верный? (Любое улучшение по сравнению с NIO приветствуется). Кто-нибудь сделал какой-либо анализ производительности netty против HD?

Ответ 1

HawtDispatch предназначен для единого пула потоков фиксированного размера. Он обеспечивает реализацию 2 вариантов Java-исполнителей:

  • Глобальная очередь отправки: Представленные Runnable объекты выполняются одновременно (вы получаете тот же эффект с помощью исполнителя Executors.newFixedThreadPool(n))
  • Серийная очередь отправки: Представленные Runnable объекты выполняются серийно (вы получаете тот же эффект с помощью исполнителя Executors.newSingleThreadExecutor())

В отличие от модели исполнителей java, все глобальные и последовательные очереди отправки используют один пул потоков фиксированного размера. Вы можете использовать тысячи очередей серийной рассылки, не увеличивая количество потоков. Серийные очереди отправки могут использоваться как почтовые ящики Erlang для приведения в действие приложений реактивного актера.

Так как HawtDispatch использует пул потоков фиксированного размера для обработки всех глобальных и последовательных очередей, все выполняемые Runnable задачи должны быть неблокируемыми. В некотором роде это похоже на архитектуру NodeJS, за исключением того, что используется несколько потоков вместо одного.

По сравнению с Netty, HawtDispatch не является основой для фактической обработки данных сокетов. Он не обеспечивает рамки для кодирования/декодирования, буферизации и обработки данных сокета. Все, что он делает, это выполнить настроенный пользователем Runnable, когда данные могут быть прочитаны или записаны в неблокирующем сокете. Это для вас приложение, а затем для фактического чтения/записи данных сокета.