Попытка понять, какой уровень кластеризации АККА отправляет случайные сообщения мертвому последнему, когда увеличение громкости или все принимающие субъекты заняты выполнением работы, а также как настроить его, чтобы устранить такое поведение.
Вот базовая топология: 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 }