Как эффективно показывать онлайн-статус пользователя в Laravel, Redis, SocketIO - PullRequest
0 голосов
/ 24 августа 2018

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

В моем контроллере входа в Laravel после того, как пользователь успешно вошел в систему, я сохранил электронную почту пользователя в качестве ключа и идентификатор пользователя в качестве значения в структуре хэша Redis.
В контроллере get usersЯ проверяю для каждого пользователя, присутствует ли его электронная почта в качестве ключа в хэше Redis, как показано ниже

$users = User::all();
$users->map(function($user){
    $user->setAttribute('online', 0);
    if(Redis::hget('ActiveUsers',$user->email)) {
        $user->setAttribute('online', 1);
    }
});
return $users;

А что касается отображения статуса в реальном времени, я использую SocketIO и функцию публикации / подписки Redis

redis.on('message', (channel, message) => {
    io.emit('someone-logged-in', msg.data.id);
});

io.on('connection', (socket) => {

redis.subscribe('logged-in');
socket.on('loggedOut', data => {
    ActiveUsersRedis.hdel("ActiveUsers", data.email);
    io.emit('someone-logged-out', data.id);
});

В моем приложении React я обрабатываю событие следующим образом

this.state.socket.on('someone-logged-out',data => {
    let i = this.state.activeUsersId.indexOf(parseInt(data, 10));
    if(i !== -1)
    {
        this.state.activeUsersId.splice(i, 1);
        this.setState({activeUsersId: this.state.activeUsersId});
    }
});
this.state.socket.on('someone-logged-in',data => {
    let e = true;
    if(this.props.users.data)
        e = this.props.users.data.some(user => user.id === data);
    if(e) this.setState({activeUsersId: [...this.state.activeUsersId,data]});
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...