Задать вопрос
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 и микросервисный подход.
  • Вопрос задан
  • 196 просмотров
Подписаться 2 2 комментария