Акка Слик и ThreadLocal

Я использую slick для хранения данных в базе данных, а там я использую threadLocalSession для хранения сеансов.

Репозитории используются для выполнения всякой ерунды, и у меня есть сервисный слой Akka, который обращается к гладким репозиториям.

Я нашел эту ссылку, где Адам Гент спрашивает что-то близкое к тому, что я здесь спрашиваю: Библиотеки Akka и Java, использующие ThreadLocals

Меня беспокоит то, как akka обрабатывает сообщение, поскольку я сохраняю сеанс базы данных в threadLocal, могу ли я одновременно обрабатывать два сообщения в одном потоке?

Скажем: два сообщения о добавлении пользователя (A и B), отправленные в пользовательскую службу, и сообщение A частично обработано и остановлено, поток B начинает обрабатываться в том же потоке, что и поток A начал обрабатывать, в котором будет храниться сеанс в его локальной сессии?


person dirceusemighini    schedule 16.01.2013    source источник
comment
Это может быть полезно: letitcrash.com/post/37482539796/   -  person sourcedelica    schedule 17.01.2013


Ответы (1)


Каждый актор обрабатывает свои сообщения по одному в том порядке, в котором он их получил*. Поэтому, если вы отправляете сообщения A, B одному и тому же актору, то они никогда не обрабатываются одновременно (конечно, ситуация будет иной, если вы отправляете каждое из сообщений разным акторам).

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

Таким образом, если вы отправляете сообщение M1, а затем сообщение M2 актору A, гарантируется, что M1 будет обработан раньше, чем M2. Что не гарантирует, что M2 обрабатывается в том же потоке, что и M1.

В общем, вам следует избегать использования ThreadLocals, так как весь смысл акторов в том, что они являются единицей согласованности, и вы можете безопасно изменять их внутреннее состояние посредством передачи сообщений. Если вам действительно нужно больше контроля над потоками, выполняющими обработку сообщений, загляните в документацию по диспетчерам: http://doc.akka.io/docs/akka/2.1.0/java/dispatchers.html


* За исключением случаев, когда вы изменяете реализацию их почтовых ящиков, но это не поведение по умолчанию.

person Endre Varga    schedule 16.01.2013
comment
Спасибо, Эндре, давайте представим, что у нас есть актеры A и B, и я посылаю сообщения M1 и M2 актеру A, а M3 и M4 актеру B, учитывая, что M1 начал, но еще не закончил, есть ли вероятность, что Запуск M3 или M4 был обработан в том же потоке, что и M1? - person dirceusemighini; 17.01.2013