Spring Boot: Architecture: разделение объекта между игроками - PullRequest
0 голосов
/ 14 марта 2020

Уважаемые,

Я занимаюсь разработкой игры и хочу, чтобы объект "Доска" был доступен игрокам, играющим в нее.

Пока все хорошо для одной игры за раз, но Я уже сталкивался со следующей проблемой:

При звонке:

@GetMapping({ "/judge/" })
public String judge(Model model,
        @RequestParam(value = "id", required = true, defaultValue = "World") final String hash) {

    ColorsTaken user = colorsTakenRepository.findByHash(hash);

    Board board = BoardController.getInstance().getBoard(gameHash);

    ...

    model.addAttribute("board", board);
    model.addAttribute("user", user);

    return "judge";

}

Параллельные звонки судье (...) мешали, и призыв игрока А судить (... ) обработал вызов, который выполнял игрок B в одно и то же время ...

Я "решил" эту проблему, используя ReentrantLock и блокируя вызов до тех пор, пока судья не будет обработан. jsp, но это далеко от элегантное решение ...

Кроме того, как только появятся разные параллельные игры, вызов:

board.getLock().lock();

будет проходить, если используется другой объект на доске и выполняется блокировка c это сигнал тревоги, который я не должен go включать с этим «решением» ...

(Существует также метод:

@GetMapping({ "/board/" })
public String board(Model model,
        @RequestParam(value = "id", required = true, defaultValue = "World") final String hash) {

, который отображает плату,

если бы я использовал stati c ReentrantLock для этих звонков, все игроки будут Нужно подождать, пока не будут отображены все параллельные платы, что не является хорошим решением вообще ...)

(Если есть 100 одновременных игр, 100 * 4 людям придется подождать, пока все доски отображаются, и это просто неправильно ...)

Теперь, что мне делать вместо этого?

Объект Board должен быть разделен между 4 игроками (любые изменения в нем должны быть доступны другим игрокам), но игрок A игры 1 не должен знать игрока F игры 2, но (конечно) все изменения в игре 1 должны быть доступны игроку B, C и D игры 1 ...

Код, который я показал, взят из:

@Controller
public class HelloController {

Какую архитектуру я должен использовать, чтобы не полагаться на ReentrantLocks?

С уважением и благодарностью,

S.

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Видимо, одновременные вызовы методов @Controller обрабатываются в разных потоках:

Как указано здесь ...

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

Green: ${board.greenName}: ${board.getPlayerString(0, user)}<br /> <br /> 
Blue: ${board.blueName}: ${board.getPlayerString(1, user)}<br /> <br /> 
Red: ${board.redName}: ${board.getPlayerString(2, user)}<br />  <br /> 
Yellow: ${board.yellowName}: ${board.getPlayerString(3, user)}<br /> <br />

И "greenName", "blueName", ..., где были изменены в общем объекте Board, если вызовы будут выполняться с различными объектами Board, эти вызовы будут обрабатываться разными потоками и модифицировать разные объекты доски (если эти вызовы исходили от игроков с разных досок ...)

0 голосов
/ 14 марта 2020

Совместно используемые данные должны быть помещены в базу данных, например mysql и postgresql, а не в память приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...