Сценарий потери сообщений с помощью akka, когда все актеры работают в одном и том же jvm - PullRequest
0 голосов
/ 25 мая 2019

Однажды я написал многопользовательскую игру на Java с помощью фреймворка akka.С их доставкой «по крайней мере один раз» я всегда задавался вопросом, в каких случаях сообщение может потеряться, если все akka актеры работают в одном локальном jvm.

Дизайн игры был похож нагигантский конечный автомат (поскольку события должны обрабатываться по порядку), поэтому в большинстве случаев между всеми вовлеченными участниками проходило только одно сообщение.(Запуск нескольких сеансов в parralel был возможен)

Я прочитал, что общение актеров, когда они работают локально, осуществляется в памяти.Таким образом, не принимая во внимание ошибки нехватки памяти, являются ли их другим (желательно воспроизводимым) сценарием, когда сообщения фактически теряются?

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

1 Ответ

0 голосов
/ 26 мая 2019

Я читал, что общение актеров при локальном запуске происходит в памяти. Таким образом, не учитывая ошибки нехватки памяти, есть ли другой (желательно воспроизводимый) сценарий, в котором сообщения фактически теряются?

Таким образом, обычно доставка в память выполняется, но вы также указали, что говорите о функции «доставки как минимум один раз». А в документах (https://doc.akka.io/docs/akka/current/persistence.html#at-least-once-delivery) конкретно говорится о том, как хотя бы один раз сильно меняется нормальное поведение. В частности, хотя бы один раз используется постоянство для отслеживания того, что было отправлено и что было подтверждено.

Итак, когда вы используете хотя бы один раз, при отправке сообщения должен произойти целый танец. Сначала сообщение должно быть сохранено таким образом, чтобы в случае сбоя отправляющего субъекта эта работа могла возобновиться в другом месте. Во-вторых, сообщение должно быть отправлено. В-третьих, любой ответ должен быть соотнесен с отправленным сообщением, а получение должно быть сохранено, чтобы в случае сбоя субъекта после этого момента возобновляющий субъект знал, что сообщение не нужно повторять.

Из-за этого не должно быть случаев, когда сообщение теряется. Даже когда JVM потеряна. (Даже когда все JVM потеряны.) В конце концов, это точка «по крайней мере, один раз», что сообщение гарантированно будет доставлено (и получено ответ). Тем не менее, обратите внимание, что это идет с компромиссами. (См. Документацию по компромиссам, хотя один очевидный из них - производительность.)

...