кластер akka / удаленное подключение удаленного абонента на большой громкости, медленный абонент - PullRequest
0 голосов
/ 22 мая 2018

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

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

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

Конечно, мы понимаем, что 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 }
...