@gelerum

Куда и как добавить асинхронность в телеграм бота?

Здравствуйте, я использую библиотеку telebot вместе с MongoDB

Через GetClient() и GetBot() я общаюсь с одноименными структурами
type client struct {
	client *mongo.Client  // установливаю соединение и не закрываю через другую функцию
}


Соединение с базой создается в самом начале и не закрывается.
func main() {
    telegram.InitBot() // создаю соединение с апи бота 
    storage.InitClient() // создаю соединение с mongodb и добавляю клиент в структуру
    telegram.GetBot().Bot.Handle("/start", telegram.GetBot().HandleStart)
}


Функция ниже выполняется, по сообщению пользователя /start
func (b *bot) HandleStart(message *tb.Message) {
	b.Bot.Send(message.Sender, "Hello")
	storage.GetClient().CreateUserDocument(message.Sender.ID) // создает документ в бд, если еще не существует с таким id пользователя
}


Так я создаю документ с начальной структурой и пользовательским id, если еще с таким id не создано:
func (c client) CreateUserDocument(chatID int) {
	coll := c.client.Database("db").Collection("users")
	count, _ := coll.CountDocuments(context.TODO(), bson.D{{"chatID", chatID}})
	if count != 1 {
		document := bson.D{{"chatID", chatID}, {"expenses", bson.A{}}, {"income", bson.A{}}}
		coll.InsertOne(context.TODO(), document)
	}
}


Как мне оптимизировать этот код и где добавить асинхронность? Это не весь код проэкта, на другие комманды бота делаются другие запросы в бд.
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Можно сделать работу бота через webhook'и, тогда каждый запрос будет изначально обрабатываться в отдельной горутине.
Плюс при таком подходе можно горизонтально масштабировать нагрузку, т.е. запустить бот на нескольких серверах и через какой нибудь балансировщик раскидывать на них запросы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы