В академических целях запилил простой 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 и микросервисный подход.