В последнее время я работаю над веб-приложением реального времени, созданным с использованием 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 тысяч пользователей.Итак, есть ли у кого-нибудь лучший подход или какие-либо предложения по улучшению этой реализации?