170 похожих чатов

Поясните кто нибудь за вебсокеты и лайв чат с историей,

в голове пока такое:

В бд таблица всех сообщений с уникальным айди комнаты, при заходе в комнату старые сообщения тянутся из таблицы по айди (там же пагинация и вот это все), дальше открывается сокет, при отправки сообщения пост запрос на добавление в бд и само сообщение в сокет, в правильном направлении думаю или что-то не то?

42 ответов

17 просмотров

В маша идет в школу примерах примерно так и есть. Как оно у взрослых людей без понятия

ɥ-h Автор вопроса

Чей ID будет? просто соединения сокета, а если он отвалиться он другой потом будет, при обновлении страницы экземпляр класса уничтожается и соединения дисконектиться и будет новый ID. Идентификатор пользователя нужен, отправлять его по сокету и получать ответ. Веб сокеты тема)

ɥ-h Автор вопроса

Тогда мне как в Маше вариант подойдет больше

ɥ-h Автор вопроса
Андрей Б
Чей ID будет? просто соединения сокета, а если он ...

Id румы, все комнаты также хранятся в бд, при реквесте открытия сокета буду делать чек румы и чек прав пользователя, если все ок - открываемся, вроде звучит норм, нет?

ɥ h
Тогда мне как в Маше вариант подойдет больше

https://github.com/ezesundayeze/anonymouse-realtime-chat-app ну вот первая ссылка на которую я упал, без авторизации там смотри по своим обстоятельствам

ɥ-h Автор вопроса
ɥ h
Id румы, все комнаты также хранятся в бд, при рекв...

Я прорабатывал/внедрял на вебсокете решение связанное с телефонией. На мой взгляд важно проработать момент того что могут попытаться стучаться на сокет и изучать "протокол" как бы проще будет. Я бы авторизацию на веб сокете не делал, ну т.е. в плане надо авторизовать/аутентифицировать пользователя обычными методами и решениями, а затем когда он прошел проверку можно пускать на нужный пейдж где поднимается сокет и там еще доп проверка.

ɥ h
Id румы, все комнаты также хранятся в бд, при рекв...

А на бекенде лесом слать другие попытки поднятия сокета если сокет не присылает данные авторизации.

ɥ-h Автор вопроса
Андрей Б
А на бекенде лесом слать другие попытки поднятия с...

Ну в целом так и хотел сделать, авторизация уже есть access + refresh, просто access кидать при открытии и его чекать, то есть если я хочу что-то делать с бд или еще что, делать это в другом месте, сокет чисто для обмена сообщениями, верно?

ɥ h
Ну в целом так и хотел сделать, авторизация уже ес...

Зависит от реализации на бекенде. Если грамотный подход то устанавливается соединение клиент-сервер под конкретным ID на бекенде. Чтобы всем не слать мессаги. Получается бекенд знает что вот этот ID принадлежит этому пользователю т.е. какая-то мапа в оперативке или ещё где. Один пользователь может открыть несколько экземпляров соединений (страниц открыть) - вот тут надо серьезно подумать как будет осуществляться синхронизация между соединениями, особенно с учетом если отказоустойчивая кластеризация, балансировщик сети, ноды. Я бы рекомендовал сначала схему со всеми цепочками нарисовать прежде чем ввязаться в историю.

ɥ h
Ну в целом так и хотел сделать, авторизация уже ес...

Мы делали как, поднимается соединение и клиент отправлять стартовую мессагу с кое-какими данными условно говорящие серверу мол я такой-то, дай мне текущий статус по мне. Сервер в этот момент понимал что это последнее активное соединение с пользователем и есть гарантия что сообщение от сервера прилетит в правильный сокет и страница перед глазами юзера. Сокет может разрываться хаотично на фоновой вкладке. Чтобы держать его "активным" пинг-понг "системными" мессагами можно держать в тонусе и не разорвалось или перезапускать при разрыве что выглядит дороже для бекенда. Это как бы с чем столкнулись. Шифровать надо, а по факту гоняешь JSON внутри, т.е. что угодно можно засунуть. Мы прям протокол взаимодействия разработали.

ɥ-h Автор вопроса
Андрей Б
Мы делали как, поднимается соединение и клиент отп...

Звучит не очень весело, но хотя бы в голове начинает складываться пазл, спасибо

ɥ h
Звучит не очень весело, но хотя бы в голове начина...

Блин может я жути нагоняю, мы не юзали сторонние либы (ну кроме проксирования вебсокета) на фронте браузерный WebSoket клиент + React+Node.js бекенд java spring boot. Наверное за месяца 2-3 все подняли, что выглядит довольно быстро наверное. Просто очень много кейсов которые на старте надо учитывать - если 1 клиент отвалился с остальными соединениями что, синхронизироваться чем (Kafka, RabbitMQ? и прочее) и т.д. "Живой" фронт реагирующий на веб сокеты это выглядит как магия) я думаю ещё бы заюзал сокеты где-нибудь.

ɥ-h Автор вопроса
Андрей Б
Блин может я жути нагоняю, мы не юзали сторонние л...

Да нет, в целом ожидал что будет запара, в инете много примеров кода и туториалов поверхностных, а в плане архитектуры и логики особо не нашел, так что такое чтиво это вообще супер

А что если твоё сообщение отправится пост запросом, а сокет провалится? По факту будет добавлено, но текущие пользователи в комнате не увидят его. Можно записывать сообщение в основную БД и уже отформатиованное и готовое в, к примеру, redis, а затем отправить уведомление (pub/sub система), а пользователей подключившихся по сокету подписывать в redis и получать эти самые уведомления и уже отправлять в комнату.

ɥ-h Автор вопроса
ᅠ ᅠ
А что если твоё сообщение отправится пост запросом...

Да я думаю это уже на стадии подводных камней буду решать, сейчас мне главное понять как реализовать минимальный работоспособный вариант, а там уже буду думать что можно лучше сделать

ɥ h
Да нет, в целом ожидал что будет запара, в инете м...

Вот он хорошо рассказывает на примере. Вообще, смотрю его давно, чувак молодец. https://youtu.be/gzIcGhJC8hA

ɥ h
Да я думаю это уже на стадии подводных камней буду...

Тогда пили на ajax'е, а потом уже перепишешь! Очевидные вещи нужно сразу решать, а не откладывать, а потом волосы на жопе рвать.

ɥ-h Автор вопроса
ᅠ ᅠ
Тогда пили на ajax'е, а потом уже перепишешь! Очев...

Для меня больше половины услышанного было неочевидно, в каких то моментах даже вопрос сформулировать не могу что хочу сделать, так что где то придётся сначала сделать говно, а потом сделать не говно

ɥ h
Да я думаю это уже на стадии подводных камней буду...

С таким подходом камней будет выше крыши! Если отправлять сообщение пост запросом, а это же сообщение по сокету, то отправленное по сокету не будет иметь id сообщение. Более того, на сервере возможно будет санетизация сообщений, связка с какими то другими данными и т.д. В таком случае, тебе нужно будет два валидатора ставить, один на основном бэке, другой на в стороне сокета. В общем, такая реализация точно убого-кривая

ᅠ ᅠ
С таким подходом камней будет выше крыши! Если отп...

Это просто транспорт, АПИ может быть одно

ᅠ ᅠ
С таким подходом камней будет выше крыши! Если отп...

Погоди. Какой пост запрос. Сайт должен проверить и авторизовать пользователя штатными методами сокет тут вообще не причем, в результате этого он он перенаправиться на другую страницу и уже может коннектиться по сокету. По сокету отправляет хелло месседж с инфой о пользователе, а бекенд 1) не принимает сокет запросы от других доменов, 2) удостоверился что пользователю разрешен коннект. Тут просто все взаимосвязи увидеть и проанализировать надо.

Artem Soroka
Это просто транспорт, АПИ может быть одно

Так а пользователи, которые в комнате, они что увидят? По факту, подменить сообщение можно и текущие пользователи увидят совсем другое сообщение. Здесь нужен контроль тоже

ɥ h
Да я думаю это уже на стадии подводных камней буду...

Я думаю надо нарисовать примерную схему взаимодействия между модулями и начать дело, а там по ходу будет легко разобраться.

Андрей Б
Погоди. Какой пост запрос. Сайт должен проверить и...

С таким подходом нужно делать проверку на авторизацию на стороне сокета т.к. к нему ведь можно будет и напрямую подключиться. Ты, скорее всего, не совсем понял о чем я

ᅠ ᅠ
Так а пользователи, которые в комнате, они что уви...

Зачем, бекенд адресно по конкретному ID сокет соединения шлет данные по сокету, другие пользователи вообще не в курсе что, что-то где-то происходит) т.е. это сообщение будет доставлено исключительно в этот браузер этого клиента.

ᅠ ᅠ
С таким подходом нужно делать проверку на авториза...

Можно, тут векторов взаимодействия много. Я выше писал - при установке соединения шлется хелло месседж с нужной инфой по пользователю, если инфа не та не она - бекенд просто отвергнет поднятие сокет соединения.

Андрей Б
Можно, тут векторов взаимодействия много. Я выше п...

Тогда на стороне сокета нужен доступ к бд. Вообще, такое масштабировать будет сложно.... Как по мне.

Андрей Б
Можно, тут векторов взаимодействия много. Я выше п...

Он с самого начала упомянул, что само сообщение отправляется пост запросом отдельным, а не по сокету. У него, может та часть вообще на другом языке написана и никак с нодой не связана.

ᅠ ᅠ
Тогда на стороне сокета нужен доступ к бд. Вообще,...

А как без БД то? Мы же о приложении говорим. Масштабируется это дело без особых проблем - я и проксирование делал, и через балансировщик работало, и клиенты на разных нодах кластера. Всё это дело прекрасно работает и проде жило лучше чем на деве.

ᅠ ᅠ
Он с самого начала упомянул, что само сообщение от...

Ну гонять пост запросом наверное в такой случае лишено смысла наверное. Если есть сокет то его и использовать надо - я в обе стороны взаимодействовал никаких проблем особо не заметил. Можно посмотреть как другие крупные сайты делают, Notion по сокету данные гоняет, что-то по rest api.

Андрей Б
А как без БД то? Мы же о приложении говорим. Масшт...

Предположим ты поднял два сокет сервера, где 10 человек подключены через балансировщик к серверу А, а другие 10 к серверу B. Допустим, что пользователь отправил сообщение на сервер А, как пользователи, которые подключены к серверу B узнают о поступление нового сообщения?

Андрей Б
Ну гонять пост запросом наверное в такой случае ли...

Вполне себе да, можно сразу и по сокету, если стек один и тот же.

ᅠ ᅠ
Вполне себе да, можно сразу и по сокету, если стек...

Но здесь, скорее всего, свои нюансы могут быть....

ᅠ ᅠ
Предположим ты поднял два сокет сервера, где 10 че...

Ну сообщение от клиента 1 пришло на бекенд А), то бекенд должен сохранить месседж в базу по нику и переслать что-то клиенту 2 на сервере В). Я писал выше про синхронизацию, что нужна мапа которая организует пользователей кто где на каком сокете. Зависит от возможностей - либо всем стучаться в базу данных и там самостоятельно организовывать синхронизацию, либо использовать платформы гарантированной доставки сообщений - кафка и т.д. Это самое очевидное что в голову приходит.

Андрей Б
Ну сообщение от клиента 1 пришло на бекенд А), то ...

Интересно, как ты подобное уже ревлизовывал, если у тебя нет точного представления об этом?)

Андрей Б
Я как раз реализовывал)

А что за синхронизация? Как именно работает?

ᅠ ᅠ
А что за синхронизация? Как именно работает?

Связка такая: react, websoket, hazelcast, mongodb. Бекенд где hazelcast, писал не я - т.к. я фронт)

Андрей Б
Связка такая: react, websoket, hazelcast, mongodb....

По сути, все то же самое, что и я описал

ᅠ ᅠ
По сути, все то же самое, что и я описал

А что требовалось услышать)? Расписать 10 000 строчек кода надо было? Где за бекенд конкретно я не отвечал. Прямо сейчас этим проектом я не занимаюсь уже пол года наверное. Прокси писал чтобы сокеты через балансировщик ходили.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта