Кластер 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 }