- Хранилище -- Redis.
- Брокер -- Nats.
- protoc для генерации go-структур из proto-файлов.
- Slog для логгирования запросов.
- Cleanenv для чтения конфига из yaml-файла.
- Docker и docker-compose для масштабируемости и переносимости.
- Taskfile для того, чтобы генерировать go-файлы из .proto и для того, чтобы запускать и удалять контейнеры одной командой.
Мною было решено разрешено сделать не только один метод, а также почти CRUD (delete не так сильно нужен, так как redis очищает сам себя от документов спустя заданное время). Таким образом, есть две возможности воспользоваться сервисом:
- gRPC-запрос, если наш сервис является endpoint'ом сервера, поэтому мы получаем ровно то, что от нас просили.
- Через подписку на канал, если сервис являеся middleware. При старте сервиса параллельно запускается подписчик на канал docs,
который принадлежит группе qrcv(поэтому есть возможность запустить несколько одинаковых контейнеров, так как каждый подписчик попадет в группу qrcv). Когда же в канал попадает сообщение, он обрабатывает его и сохраняет в кэш, а после отправляет уже в канал tdocs, откуда уже может читать любой желающий.
К моменту окончания приема задания, были написаны только unit-тесты(папка tests) и сделаны ручные тесты через postman, так как эти две недели выдались очень загруженными другими делами.
Для запуска сервис не требуется прилагать больших усилий:
- Запустите Docker Engine
- Перейдите в корень проекта
- Запустите сервис с помощью команды task run
- При завершении примените команду task delete, чтобы избавить от контейнеров.
service Documents{
rpc Create(UserTDocument) returns (TDocument);
rpc Update(UserTDocument) returns (TDocument);
rpc Process(TDocument) returns (TDocument);
rpc Get(GetRequest) returns (TDocument);
}
message GetRequest{
string url = 1;
}
message UserTDocument{
string Url = 1;
string Text = 2;
}
message TDocument{
string Url = 1;
uint64 PubDate = 2;
uint64 FetchTime = 3;
string Text = 4;
uint64 FirstFetchTime = 5;
}
- Запускаете сервис(см. предыдущий пункт).
- Запускаете postman(или что-нибудь другое).
- Если выбрали postman, то импортируйте .proto файл из ./proto/docs/docs.proto.
- Тестируйте на здоровье, ведь postman поможет вам в составлении правильных запросов.