Nikolino
@Nikolino

Grpc процедуры вызывать синхронно или асинхронно?

В академических целях запилил простой api с регистрацией, аутентификацией и несколько CRUD'ов.

Сразу после регистрации (добавлении юзера в базу) нужно отправить email с кодом подтверждения.

Решил вынести это в микросервис, сгенеренный через gRPC и протофайлы.
Процедура в микросервисе получает на вход текст email'a и адрес кому отправить. Формирует email и шлет это в сервис Mailgun.

В коде приложения сразу после регистрации вызывается этот метод:
func sendCode(code int, email string) error {
	conn, err := grpc.Dial(os.Getenv("MAILER_SERVICE_PORT"), grpc.WithInsecure())
	if err != nil {
		return err
	}
	c := pb.NewMailerClient(conn)

	_, err = c.SendEmail(context.Background(), &pb.EmailRequest{Email: email, Code: strconv.Itoa(code)})
	if err != nil {
		return err
	}

	return nil
}


Если вызывать синхронно, могут возникнуть две проблемы, долго отвечает микросервис или долго отвечает сервер рассылки email.

Хорошей ли практикой считается дергать микросервисы в горутине?
Или лучше соединение с сервером рассылки (внутри микросервиса) делать асинхронно, а соединение с микросервисом синхронно?

После ЯП с синхронной работой хочется всё делать в горутинах потому, что могу :)

P.S. Конкретно с email рассылкой, наверное всё это лучше было сделать асинхронно через сервер очередей. Но хотелось понюхать GRPC и микросервисный подход.
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 1
Color
@Color
Golang SWE, Cloud & DevOps
Для gRPC какой-то хорошей практики в этом плане нет, это просто вызов удаленного действия.
Если ожидаете, что все выполнится быстро, делаете синхронно.
Если ожидаете, что *может* выполниться долго, делаете асинхронно.

Email рассылки действительно делаются часто через очереди, но в вашем случае ничего не мешает просто при старте приложения поднять горутину (или несколько), которые будут читать емейлы из канала и асинхронно отправлять, а там писать в канал откуда вам надо.
Да и сами по себе такие действия как рассылки и прочее обычно выполняются асинхронно, потому нет нужды их дожидаться, чтобы вернуть ответ на запрос.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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