Реализация чата и входящих сообщений, таких как SO, с помощью веб-сокетов

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

Я пришел к следующей стратегии для этого. Как только пользователь войдет в систему, я открою ему соединение.

public function onOpen(ConnectionInterface $conn)
{
//add user to the database or data structure
}

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

Q.1 Как я могу сохранить эту дополнительную идентификационную информацию с ConnectionInterface так, чтобы при отправке сообщения у меня была ссылка на соединение для конкретного пользователя, и я мог направить сообщение этому выбранному пользователю, скажем, ID = 20.

foreach ($this->clients as $client) {
if($client->id == $receiver_id)
$client->send($msg);
}

Например, когда пользователь с идентификаторами 43, 54 и 78 находится в чате, а 43 отправлен на 54 & 78, я могу отправить сообщение всем в чате, кроме самого отправителя. Таким образом, приватный чат также обрабатывается, так как в это время будет только два пользователя.

Q.2 Во-вторых, я должен поддерживать локальную структуру данных, такую ​​как куча в бэкэнде, чтобы хранить эту информацию об идентификаторах чата и соответствующих пользователях или использовать redis. Какой из них будет более надежным и даст хорошую производительность (я ничего не знаю о Redis, только что узнал, что SO использует, поэтому необходимо выяснить, прежде чем тратить время на Redis)

Q.3 Как я могу определить между сообщением чата и входящими уведомлениями на стороне клиента, так как с сервера я могу просто отправить сообщение.

Я рассматривал это решение как отправку тегов-идентификаторов, таких как 0 — чат, 1-входное оповещение, 2-изменение репутации и т. Д. Является ли этот подход правильным?

Q.4 Пользователь может иметь две или более чаты, открытые одновременно. Как я буду отличаться на бекконде?

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

В.5 Если ответ на вопрос 2 — redis, могу ли я использовать Redis с Mysql параллельно?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]