- Хранить NPC имеет смысл в сущности «текущий бой», а вот где её хранить уже есть разница.
- Если под сохранением в сессию подразумевается сохранение в cookies, то это плохая идея, т.к., в случае двух одновременных запросов от пользователя, будут конфликты.
- Если под сохранением в сессию подразумевается сохранение на стороне сервера, то это скорее всего и есть сохранение в БД.
- «Если рассчитывать на 20 тыс игроков в онлайне, не нагнется ли…» — вопрос не корректен, т.к. не описана логика игры и железо на сервере. Если расчёт хода раз в сутки, то не нагнётся, если раз в секунду, то может и нагнуться.
- Число онлайна, кстати, дико оптимистично.
Варианта два:
1. Хранить в БД.
2. Хранить в фоновом процессе в памяти, который и делает обсчет логики, не обращаясь к БД.
Во втором случае, общаться с таким процессом можно, например, через отправку сообщений amqp. Результаты вычислений процесс может как ложить в кэш (который много быстрее БД), так и слать сразу клиенту (websockets).
Если это коммерческий проект ОБЪЕКТИВНО имеющий возможность получить 20к онлайна, заморочайтись 2-ым вариантом. Если это хобби, прототип или просто изучение новой технологии — не заморачивайтесь и начните с 1-ого, когда игра разовьётся, всё станет более очевидным.