Проведя некоторые исследования, я обнаружил, что 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 параллельно?
Задача ещё не решена.
Других решений пока нет …