Вообще, по классике, ты делаешь конверсейшен (диалог). Это отдельная сущность. На него привязываешь сабскрайберов (подписчиков). И когда в конверсейшен приходит сообщение, раздаешь всем подписчикам.
Подписчик идентифицирует себя по своему уникальному id.
Историю чата предложил бы вынести в API. А не в сокете передавать. Сокет оставить только для реалтайма.