это продолжение этих вопросов здесь: https://groups.google.com/forum/#! Topic / vertx / MmcI2dJIcRM (мои сообщения от 08 и 20 января там)
У меня есть штат, 4 событияl oop Потоки / контексты и контекст для связывания состояний
T state;
Context contextToStateBinder;
в веб-запросах vertx направляются циклически в разные циклы событий, поэтому
request 1 -> eventloop A
request 2 -> eventloop B
request 3 -> eventloop C
request 4 -> eventloop D
request 5 -> eventloop A
...
, если я хочу получить доступ Исходя из этого, в запросе общего состояния у меня могут быть следующие решения:
Решение I
Доступ к состоянию разрешен только в той же теме / контексте, поэтому, возможно, я решу для contextToStateBinder -> eventl oop B context
, поэтому каждый раз, когда я хочу получить доступ к состоянию, я должен изменить событие l oop на: contextToStateBinder.runOnContext (...)
Решение II
Я должен синхронизировать состояние: синхронизирован или CAS-операция (состояние копирования, изменение состояния, запись его обратно в CAS, если успешно -> выполнено, если fail-> попробуйте еще раз)
И мой cas / synchronized или мой eventll * 10 72 * Коммутатор с runOnContext (внутренний a-mps c -queue) имеет изменчивое чтение и запись.
Итак, мой вопрос здесь: что дешевле?
Мое состояние там может быть игровой блок / чат-комната: я думаю, что лучший способ здесь - это изменить контекст и не обращаться к этому состоянию с помощью разных потоков, верно?
Мое состояние может быть состояние сеанса пользователей: здесь Джулиен (vertx-project-leader) упоминает, что это не очень хорошая идея связать пользователя с определенным контекстом (но почему?, он до сих пор не оправдал это) Может быть, это проблема, если я статически планирую разных пользователей в разных контекстах ...... так что может случиться так, что у одного события oop будет гораздо больше запросов, чем у другого. Но если я перенесу это (привязать пользователя к другим конкурсам, чтобы весь контекст имел равное количество traffi c), то я не вижу здесь никаких проблем?
Но какие еще проблемы я мог бы получить, если я это сделаю?
Почему я думаю, что это настолько мощно, привязка пользователя к определенной нити eventl oop является следующим примером:
Advanced Cache:
user1 -> request 1 -> eventloop A -> correct to B -> start a long-database-operation -> save the future of that operation in his state -> close the connection
user1 -> request 2 -> eventloop A -> correct to B -> want-to-recieve-the-database-result -> get the future from that state -> setTheReturn-Handler -> (maybe the result isnt yet completed) -> result-handler is executed after completion -> return the result to the user1
Так что я не знаю, как я могу решить эту проблему, если я не в том же контексте / eventl oop: я думаю, если запросы 1 и 2 обращаются к состоянию и Будущее из разных потоков, тогда оно не будет работать.
Должен ли я использовать там тот же Eventl oop? Или существует какая-то другая хорошая душа, получающая доступ к будущему из разных событийных циклов?
Вы можете найти этот вопрос также на форуме vertx здесь: https://groups.google.com/forum/#! Topic / vertx / m17fwSas6_0
LG knotenpunkt