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 и микросервисный подход.
  • Вопрос задан
  • 190 просмотров
Пригласить эксперта
Ответы на вопрос 1
Color
@Color
Golang SWE, Cloud & DevOps
Для gRPC какой-то хорошей практики в этом плане нет, это просто вызов удаленного действия.
Если ожидаете, что все выполнится быстро, делаете синхронно.
Если ожидаете, что *может* выполниться долго, делаете асинхронно.

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

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

Похожие вопросы