Высокопроизводительный микросервис для обработки и доставки уведомлений, построенный на Go с поддержкой масштабирования в Kubernetes кластерах.
- Высокая производительность: Написан на Go для максимальной скорости и эффективности
- Масштабируемость: Поддержка горизонтального масштабирования в K8s/K3s кластерах
- Реальное время: WebSocket соединения для мгновенной доставки уведомлений
- Push-уведомления: Интеграция с Firebase Cloud Messaging (FCM)
- Надежность: Использование Redis для кэширования и Pub/Sub
- Асинхронность: Обработка сообщений через Kafka
- Мониторинг: Health check endpoints для проверки состояния сервиса
Сервис построен по принципам Clean Architecture с четким разделением на слои:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Kafka Input │ │ HTTP API │ │ WebSocket │
│ (Consumer) │ │ (REST) │ │ (Real-time) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
┌─────────────────┐
│ Processor │
│ (Business │
│ Logic) │
└─────────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Redis │ │ PostgreSQL │ │ Push FCM │
│ (Cache/PubSub) │ │ (Storage) │ │ (Mobile) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
- Язык: Go 1.24+
- База данных: PostgreSQL
- Кэш и Pub/Sub: Redis
- Очередь сообщений: Apache Kafka
- WebSocket: Socket.IO v2
- Push-уведомления: Firebase Cloud Messaging
- Контейнеризация: Docker
- Оркестрация: Kubernetes/K3s
- Миграции: golang-migrate
- Go 1.24+
- Docker
- Kubernetes кластер (K8s/K3s)
- PostgreSQL
- Redis
- Apache Kafka
- Клонируйте репозиторий
git clone https://github.com/your-username/notification-service.git
cd notification-service- Установите зависимости
go mod download- Настройте переменные окружения
export DATABASE_PASSWORD=your_password
export FCM_KEY=your_fcm_key- Запустите сервис
go run main.godocker build -t notification-service .
docker run -p 3000:3000 -p 4000:4000 notification-service- Примените базовую конфигурацию
kubectl apply -k kustomise/base/- Или используйте overlay для продакшена
kubectl apply -k kustomise/overlay/prod/Сервис настраивается через переменные окружения и конфигурационные файлы:
| Переменная | Описание | По умолчанию |
|---|---|---|
DATABASE_PASSWORD |
Пароль PostgreSQL | - |
FCM_KEY |
Ключ Firebase Cloud Messaging | - |
REDIS_ADDR |
Адрес Redis сервера | redis-master.default.svc.cluster.local:6379 |
KAFKA_BROKERS |
Адреса Kafka брокеров | 10.8.1.1:9092 |
type PostgresConfig struct {
Host string // 10.8.1.1
Port int // 5432
User string // avenir
Password string // из переменной окружения
DBName string // notification_service
}GET /health
Возвращает статус сервиса
GET /api/v1/notifications
Возвращает список уведомлений для авторизованного пользователя
Заголовки:
Authorization: Bearer <JWT_TOKEN>
Ответ:
{
"data": [
{
"id": "uuid",
"title": "Заголовок уведомления",
"message": "Текст уведомления",
"created_at": "2024-01-01T00:00:00Z"
}
],
"hasNextPage": false
}Сервис подписывается на Kafka топик message.created и обрабатывает события создания сообщений:
- Получение события из Kafka
- Обработка бизнес-логики в processor
- Сохранение в PostgreSQL
- Отправка через WebSocket и Push FCM
- Кэширование в Redis
- Endpoint:
/health - Метод:
GET - Ответ:
Pongпри успешной работе
Сервис выводит логи в stdout/stderr для интеграции с системами логирования Kubernetes.
# Увеличить количество реплик
kubectl scale deployment notification-deployment --replicas=3
# Автоматическое масштабирование (HPA)
kubectl apply -f - <<EOF
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: notification-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: notification-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
EOFНастройте ресурсы в deployment.yaml:
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"- JWT аутентификация для API endpoints
- Переменные окружения для чувствительных данных
- Kubernetes Secrets для хранения паролей
- Валидация входящих данных
# Запуск unit тестов
go test ./...
# Запуск интеграционных тестов
go test -tags=integration ./...
# Запуск e2e тестов
go test -tags=e2e ./...Сервис оптимизирован для:
- Низкого потребления памяти: ~5-20MB на инстанс
- Быстрой обработки: <10ms для типичных операций
- Высокой пропускной способности: 1000+ уведомлений/сек
- Эффективного использования CPU: <5% в idle состоянии
- Fork репозитория
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Commit изменения (
git commit -m 'Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Откройте Pull Request
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Go team за отличный язык программирования
- Сообщество Kubernetes за инструменты оркестрации
- Redis, Kafka и PostgreSQL за надежные технологии
⭐ Если проект оказался полезным, поставьте звездочку!