По-моему, решение «в лоб» очевидно. Автора вопроса напрягают запросы от клиента, но, кажется, он неверно трактует их суть. Клиент не должен говорить серверу, что «постройка здания закончилась, запиши это». Он может сообщить о начале постройки и спросить: «а не завершилась ли постройка?». Завершается постройка без участия клиента.
На сервере хранятся как общие данные о игровом мире (параметры игроков, их здания, объекты, юниты, прирост ресурсов и т.д.), так и очередь событий. Большая часть добавлений событий в очередь инициируется запросом от игрока: построить/проапгрейдить здание, тренировать юнита, отправить войска и прочее. Это те действия, которые должен совершать игрок, будучи онлайн. Возможно, какие-то события будут инициироваться и сервером.
Событие в очереди представляет собой некое описание события, а также метку времени, по которой событие должно произойти (например, здание строится 2 часа, значит в качестве метки будет записано время на два часа позже отправки запроса на постройку).
В бесконечном цикле сервер делает следующее: выбирает все события, время завершения которых уже наступило, и обрабатывает их: изменяет уровни/координаты объектов, пересчитывает характеристики, изменяет флаги, удаляет событие из очереди.
Ежечасный пересчет средств всех игроков, например, можно реализовать отдельным событием вне очереди, которое будет вызываться по таймеру, либо все тем же событием, завершение которого будет инициировать аналогично событие, завершающееся через час.
То все все делается на сервере. Клиент может только: получить доступную ему информацию на текущий момент, получить информацию о времени завершения всех событий, относящихся к нему, послать запрос на добавление какого-либо события в очередь.