Проект gRPC Document Microservice построен на принципах чистой архитектуры и Domain-Driven Design (DDD). Это обеспечивает модульность, тестируемость и легкость замены компонентов.
+-----------------------------+
| gRPC Interface | # Входной адаптер (Protobuf)
+-----------------------------+
|
▼
+-----------------------------+
| Inbound Adapter Layer | # DocumentServiceServicer
+-----------------------------+
|
▼
+-----------------------------+
| Application / Services | # Бизнес-логика (DocumentService)
+-----------------------------+
|
▼
+-----------------------------+
| Domain Models | # DTOs, Entities, Ports
+-----------------------------+
|
▼
+-----------------------------+
| Outbound Adapters / Repos | # MongoDB/PostgreSQL/Redis
+-----------------------------+
- Определен в
proto/service.proto. - Реализует CRUD, версионирование и восстановление документов.
- Использует асинхронный сервер (
grpc.aio).
- Файл:
src/infra/adapters/inbound/grpc/adapter.py. - Преобразует gRPC-запросы в DTO и вызывает бизнес-логику.
- Обрабатывает ошибки и преобразует их в gRPC-статусы.
- Файл:
src/application/document/service.py. - Содержит бизнес-логику через
DocumentService. - Использует DI для доступа к репозиториям и кэшу.
- Файлы:
src/domain/models/*,src/domain/dtos/*,src/domain/ports/*. - Определяет сущности (
Document,DocumentVersion), DTO и интерфейсы (порты). - Обеспечивает независимость от хранилищ и технологий.
- MongoDB:
src/infra/adapters/outbound/mongo/*с использованиемBeanie. - PostgreSQL:
src/infra/adapters/outbound/sql/*с использованиемSQLAlchemy. - Redis:
src/infra/adapters/outbound/redis/*для кэширования.
- Используется
Dishkaдля управления зависимостями. - Файл:
src/infra/di/provider.py. - Обеспечивает гибкость при замене репозиториев (MongoDB/PostgreSQL).
- MongoDB: Хранит документы в коллекции
documentsчерезBeanie. - PostgreSQL: Использует таблицы
documentsиdocument_versionsс JSONB для версий. - Переключение между базами через
DB_TYPEв.env.
- Redis: Хранит документы, списки и версии.
- Ключи:
document:{id},documents:skip={skip}:limit={limit},document_versions:{id}. - TTL: 300 секунд (настраивается через
CACHE_TTL).
- Модульность: Легкая замена хранилищ или добавление новых.
- Тестируемость: Четкие интерфейсы упрощают написание тестов.
- Масштабируемость: Поддержка асинхронности и кэширования.