Email Sender - это проект на Go, который реализует компонент системы для отправки писем через очередь. Этот компонент может использоваться несколькими экземплярами приложения одновременно, обеспечивая stateless отправку писем.
Интерфейсы и структуры определены для отправки email и работы с очередью.
Используется библиотека для отправки email, предоставляющая возможность легко заменить её на любую другую.
Реализована очередь для хранения писем, без привязки к конкретному брокеру (Redis, RabbitMQ, Kafka и т.д.).
Возможность установки лимита на количество отправляемых писем в минуту.
Полное покрытие тестами, использующими моки для отправки писем и работы с очередью.
Предусмотрено место для внедрения метрик в будущем (например, для Prometheus).
-
Создайте .env.prod файл:
-
Перейдите в папку с Docker файлами:
cd docker
- Создайте Docker сеть:
docker network create email-sender
- Запустите Docker Compose:
docker-compose up -d
package email
type Message struct {
To string `json:"to"`
Subject string `json:"subject"`
Body string `json:"body"`
}
- Отправка сообщений происходит по таймеру. Приложению нужно отправлять письмо как только оно появилось в очереди, не дожидаясь таймеров. Использовать таймер для отслеживания лимита. +
- В сигнатуру Send стоит добавить контекст. +
- Добавить ошибки на уровне пакета, вместо fmt.Errorf для удобства их отлавливания в других пакетах (и тестах). +
- log вместо fmt.Print, консистентный лог с единым форматом всегда лучше). +
- в Dockerfile лучше использовать multistage сборку. +
- Добавить негативные кейсы, и применить табличные тесты. // с тестами пока шляпа, нужно больще времени чтобы поглубже разобраться
- Перенести интерфейсы в места их использования. // (у меня один интерфей используетс в двух местах, поэтому я его вынес отдельно и импортировал в оба места, возможно раз у меня так получилось, то я не правильно построил приложение???)
- Убрать комментарии в docker-compose. +/-
- Порт 8080 кажется, что не используется, его не нужно открывать наружу. (поменял на 587 +/- честно говоря не уверен, что это правильно)