Кластер akka / удаленное подключение удаленного абонента на большой громкости, медленный абонент

Попытка понять, какой уровень кластеризации АККА отправляет случайные сообщения мертвому последнему, когда увеличение объема или все принимающие субъекты заняты выполнением работы, а также как настроить его, чтобы устранить такое поведение.

Вот основная топология: 2 узла. Node1 состоит из набора действующих лиц (назовем их публикующими действующими лицами) и маршрутизатора с поддержкой кластера akka. Публикующие субъекты публикуют сообщения на маршрутизаторе (RoundRobin), который, в свою очередь, перенаправляет сообщения на Node2, состоящий из рабочих акторов (чтобы не называть их подписчиками), которые получают сообщение, выполняют некоторую работу и возвращаются обратно к публикуемым маршрутизаторам.

Наблюдения: при высокой частоте (ну, не так уж и высокой для akka, 10K за 10 секунд) опубликованных сообщений и подписчиков заняты, я вижу случайных мертвых последних с обеих сторон (издатели и подписчики отстают). Частота мертвых последних составила почти 30-40%, но после профилирования и уведомления о потере потоков и настройки отдельного диспетчера для кластера и PinnedDispatcher для рабочих подписчиков мы смогли снизить частоту мертвых последних до 1-2%. Стоит отметить, что высокий уровень мертвых последних наблюдался при использовании диспетчера по умолчанию с пулом потоков for-join и количестве действующих лиц, превышающих количество потоков; и гораздо меньшая скорость, когда число действующих лиц меньше числа потоков, что приводит нас к убеждению, что пул fork-join используется другой системой обработки akka. Ram, GC и CPU выглядят под контролем. Он использует неограниченный почтовый ящик по умолчанию, поэтому не может быть связан с буфером. Насколько я знаю, Акка Доу сопли справиться с обратным давлением

Конечно, мы понимаем, что akka doe snot гарантирует доставку, и мы должны реализовать нашу собственную логику повторных попыток. Основная попытка здесь состоит в том, чтобы понять, что является причиной мертвых последних: происходит ли это при удаленном взаимодействии akka, на транспортном уровне netty..., реализовано ли некоторое время ожидания, которое можно настроить и настроить.

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

Любые советы, вещи, которые можно попробовать или дополнительная информация очень ценится

Вот конфиг, который мы добавили:

cluster-dispatcher {   type = "Dispatcher"   executor = "fork-join-executor"   fork-join-executor {
    parallelism-min = 2
    parallelism-max = 4   } }

#usde by worker worker-pinned-dispatcher {   executor = "thread-pool-executor"   type = PinnedDispatcher }

0 ответов

Другие вопросы по тегам