Контекст: я пытаюсь создать службу чата. В чате у меня есть (скажем, 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))