Как я могу увеличить время чтения базы данных Firebase и предотвратить тайм-аут из Nginx - PullRequest
0 голосов
/ 23 октября 2019

Контекст: я пытаюсь создать службу чата. В чате у меня есть (скажем, 50000+) чаты. У меня есть 20 администраторов, которые могут получить доступ к определенным комнатам чата (скажем, около 5000 чатов). Итак, я хочу создать функции, чтобы я мог добавить нового администратора и получить список чатов на основе моего запроса (скажем, я получил 5000 чатов из моего запроса), добавить этого нового администратора в эти 5000 чатов, используяединая конечная точка. Я использую Golang и Firebase.

//GetAdmin user take a userID and it's return a user.
func GetAdminUser(userID int) (user *User, err error) {
    // It will query on the database 
    // then return the a user
    return user, nil
}

Проблема заключается в том, что я передаю список пациентов и пытаюсь прочитать тему пациента из базы данных Firebase. Чтение заняло около 20 минут. Так что это даст время на Nginx.

Можно ли как-то улучшить время чтения из firebase, используя параллелизм go, или каким-либо другим способом улучшить чтение из firebase и добавить их, не вызывая ошибки тайм-аута.

func AddNewAdminToPatientTopics(ctx context.Context, user User, patients []User) error {
    for _, patient := range patients {
        oldTopics := firebase.database.NewRef(fmt.Sprintf("USER_TOPICS/%d", patient.ID))
        for topicID, t := range topics {
            newUserTopics := firebase.database.NewRef(fmt.Sprintf("USER_TOPICS/%d/%s", user.ID, topicID))

            // Add this new admin as a participant in this topic
            topic := firebase.database.NewRef(fmt.Sprintf("TOPICS/%s/Participants/%d", topicID, user.ID))
            participant := &Participant{
                UserID: strconv.Itoa(user.ID),
                LastTimeSeenOnline: time.Now().Unix(),
                .......
            }
            err = topic.Set(ctx, participant)
            if err != nil {
                return err
            }
        }
    }

    return nil
}


func AddManager(w http.ResponseWriter, r *http.Request) {
    // Don't worry about error, I handle them gracefully

    // Get User
    user, err := GetAdminUser(UserID)

    // get patients list
    // Say, In this case you we have 5000+ patients
    patients, err := GetPatients(user.CustomerID)


    // Join this user to all chat rooms that the first admin has
    err = AddNewAdminToTopics(context.Background(), *user, patients)
}

Routers: 

http.HandleFunc("chat/managers/new/add", Post).Then(clinic.AddManager))

1 Ответ

0 голосов
/ 23 октября 2019

Не выполняйте огромных операций чтения или записи в вашей реальной базе данных, пожалуйста. Пока сервер обрабатывает такие огромные операции чтения / записи, он не обслуживает запросы от ваших клиентов.

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

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

...