Разработка каждого приложения или библиотеки должны обоснованными. Например, я изучаю котлин и мне надо немного попрактироваться, но чтобы это было не просто так, я буду делать приложение, которое мне пригодится.
Во время предыдущей разработки часто была ситуация, когда есть рабочий сервер и есть тот, который я запускаю на потестировать дома. И это всегда разные сервера и работают с разными клиентами. Например клиент, который я поставил на телефон должен уметь коннектиться и туда и сюда. Второй момент, это обновление сервера. Сейчас чтобы обновить сервер я должен закрыть старую версию, а потом запустить новую. В этот момент все клиенты получают дисконнект и это выглядит неправильно. Еще момент, имея на руках хостинг не всегда хочется ставить туда сервер. Особенно на этапе разработки хочется запустить сервер у себя и сделать его доступным
В итоге, держа в уме Kafka, ZeroMQ, я придумал свою похожую систему, в которой тоже есть аналоги топиков, и назвал я этот сервис gateway. Если еще немного подумать, то наверное можно сделать возможность работы двух серверов на одном канале, чтобы можно было поддерживать приложение при увеличении нагрузки. Для этого надо будет вынести состояние игр отдельно от сервера, но раз у нас микросервисы, то почему нет? Для реалтайм экшена может быть так и не получится, но если не требуется мгновенная реакция на события, то почему нет? В общем-то все эти сетевые узлы в общей сложности дадут задержку 1мс и может быть имеет смысл ей пожертвовать в угоду расширяемости и возможности разделить приложение на куски.
Немного подумав у меня получилась такая картинка:
Таким образом у меня получается приложение, которое работает на хостинге(edge) и которое позволяет подключаться различным клиентам и серверам. Да, надо продумать механизм версионности и возможно, хранение сообщений и будет все как надо.
Для реализации этой затеи я взял netty и сразу начал писать на kotlin. Да, конечно, сначала я сделал все неправильно, потом порефакторил и вроде бы получилось что-то рабочее.
На текущий момент gateway пропускает через себя более миллиона сообщений в секунду на локальном компе. Что мне кажется вполне рабочим вариантом даже для шутера. Да, на хостинге будет меньше, но все равно.
Выложил а github небольшой проект, который позволяет попробовать gateway в действии, у меня получается где-то 1.1 - 1.2 миллиона сообщений в секунду.
В ближайшее время планирую сделать небольшое клиент серверное приложение-полу игру, чтобы протестировать как все работает и понабивать руку.
Про игры
довольно старая игра на java: Spiral Knights: https://store.steampowered.com/app/99900/Spiral_Knights/
В свое время(вроде бы еще до стима) поигрывал в неё, с мыслью что и на java можно делать игры. Сейчас в игре многое что поменялось, она стала более сложной, ну и не люблю я прокачку, она сильно ломает баланс между новичками и опытными. Предпочитаю когда опытные игроки, просто за счет каких-то мелкий деталей и знаний побеждают новичков.