Как корректно создавать ws соединение?

Как корректно создавать ws соединение?
В учебных целях начал ознакамливаться aiohtt.
Делаю пет проект где на фронте испольую VueJs, на бэке aiohttp соответственно.
Столкнулся с задачей как правильно сделать оповещения в режиме реального времени, к примеру, как это реализовано в ВК, когда приходят новые сообщения/добавляются друзья/прочее.

На фронте, если пользователь авторизирован, то автоматически устанавливается ws соединение с сервером
ws = new WebSocket(URL);
На бэке есть обработчик ws:
async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)
    request.app['websockets']['user_id'] = ws

    async for msg in ws:
        pass   # корректна ли эта инструкция, чтобы при потери соединения выполнялась строчка ниже?
    request.app['websockets'].remove(ws)

    return ws


Так же есть несколько эндпоинтов(new_message, new_friend, etc), которые должны посылать в этот вебсокет какую-то информацию
async def new_message(request):
    # тут валидируем и сохраняем сообщение

    # отправляем данные в сокет
    ws = request.app['websockets']['receiver_id']:
    ws.send_str('new message detail')


Ожидается, что в какой бы части приложения клиент не находился, ему всегда будут залетать оповещения о новых событиях, т.к. вебсокет открывается раз, когда пользователь авторизируется, и не закрывается, пока не будет потеряна связь.
Правильно или плохо так делать? Почему?
Как будет вести себя приложение, если к примеру одновременно будет открыто 10к соединений?
  • Вопрос задан
  • 372 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
В целом всё правильно, только await ws.send_str('new message detail') и вместо pass стоит добавить

if msg.type == WSMsgType.ERROR:
    какая-нибудь реакция на ошибку


Как будет вести себя приложение, если к примеру одновременно будет открыто 10к соединений?

Для этого aiohttp и создавался.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы