Суть в том, что я не совсем понимаю работу вебсокетов
Клиент отправляет на сервер 1 HTTP запрос, после которого у него остаётся на длительное время открытое двухстороннее соединение, по которому он может общаться с сервером, будто у него сырой TCP-сокет (по факту так и есть).
Подробнее можно почитать на MDN.
Может быть сам чат никто с 0 не пишет и есть какие-то готовые решения?
На самом деле подобные анонимные чаты на столько легко реализуются, что проще написать самому, чем пытаться найти готовое решение.
Насколько хорош мой выбор(yii2+vue+mongo)?
Не уверен только на счёт mongo, тк в моих глазах это очень специфичное решение, которое не везде есть смысл применять.
Если у тебя зафиксирована структура данных, и при этом у тебя нет кучи разных данных, которые хочется хранить в денормализованном виде, то реляционная СУБД будет, вероятно, и эффективнее и проще.
Возможно, mongodb будет иметь смысл, если ты захочешь работать с сотнями тысяч клиентов, и тебе нужно будет распределять данные на несколько серверов (возможно, в разных ДЦ)
yii2 - вполне ок вариант, раз у тебя уже есть опыт работы с ним. Модули для работы с вебсокетами для него есть.