Sobes.tech
Назад к вопросам
Junior — Middle
81

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

Ответ от нейросети

sobes.tech AI

Для реализации механизма определения онлайн-статуса пользователя в Golang можно использовать несколько подходов, в зависимости от требований к точности и масштабируемости.

  1. Heartbeat (пульс) от клиента: Клиент периодически (например, каждые 30 секунд) отправляет запрос на сервер, обновляя отметку времени последней активности пользователя. Сервер хранит эту отметку (например, в Redis или базе данных).

  2. Определение статуса: Если с момента последнего обновления прошло меньше заданного порога (например, 1-2 минуты), пользователь считается онлайн, иначе — офлайн.

  3. WebSocket: При использовании WebSocket соединения можно считать пользователя онлайн, пока соединение активно. При разрыве соединения статус меняется на офлайн.

Пример простого обновления статуса с использованием Redis:

import (
    "time"
    "github.com/go-redis/redis/v8"
    "context"
)

var ctx = context.Background()

func SetUserOnlineStatus(rdb *redis.Client, userID string) error {
    // Устанавливаем ключ с TTL 2 минуты
    return rdb.Set(ctx, "user_online_"+userID, "online", 2*time.Minute).Err()
}

func IsUserOnline(rdb *redis.Client, userID string) (bool, error) {
    val, err := rdb.Get(ctx, "user_online_"+userID).Result()
    if err == redis.Nil {
        return false, nil // ключ не найден — офлайн
    } else if err != nil {
        return false, err
    }
    return val == "online", nil
}

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