Skip to content
 
 

Repository files navigation

Лабораторная работа №1 — «Кэширование»

Реализация сервиса генерации данных о товарах на складе с кэшированием ответов через Redis, оркестрацией через .NET Aspire и Blazor WebAssembly клиентом.

Стек технологий

Технология Назначение
.NET 8 Серверная часть
ASP.NET Core Minimal API HTTP-сервис
.NET Aspire Оркестрация сервисов
Redis + IDistributedCache Распределённое кэширование
Bogus Генерация тестовых данных
Blazor WebAssembly Клиентское приложение

API

Endpoint: GET /api/warehouse-item?id={int}

При первом запросе генерирует товар и кэширует его. При повторном запросе с тем же id возвращает данные из кэша. Время жизни записи в кэше настраивается через CacheExpirationMinutes в appsettings.json (по умолчанию 10 минут).

Пример ответа:

{
  "id": 42,
  "productName": "Fantastic Metal Shoes",
  "category": "Electronics",
  "quantity": 317,
  "pricePerUnit": 1234.56,
  "weightPerUnit": 2.45,
  "dimensions": "30х15х10 см",
  "isFragile": false,
  "lastDeliveryDate": "2024-11-03",
  "nextDeliveryDate": "2025-06-18"
}

Сущность «Товар на складе»

Поле Тип Правило генерации
1 id int Передаётся из запроса
2 productName string Commerce.ProductName()
3 category string Commerce.Categories(1)[0]
4 quantity int Случайное [0, 1000]
5 pricePerUnit decimal Случайное [1, 10000], 2 знака
6 weightPerUnit double Случайное [0.1, 500], 2 знака
7 dimensions string Формат **х**х** см
8 isFragile bool Случайный bool
9 lastDeliveryDate DateOnly Прошедшая дата ≤ сегодня
10 nextDeliveryDate DateOnly Дата ≥ lastDeliveryDate

Лабораторная работа №2 — «Балансировка нагрузки»

Реализация API-шлюза на основе Ocelot с кастомным алгоритмом балансировки нагрузки Weighted Random (взвешенный случайный выбор).

Что было сделано

  1. Оркестрация реплик — в AppHost.cs настроен запуск 5 реплик сервиса генерации (warehouseapp-api-0warehouseapp-api-4) на портах 7250–7254.
  2. API-шлюз на Ocelot — проект Api.Gateway принимает клиентские запросы и маршрутизирует их к репликам через конфигурацию ocelot.json.
  3. Кастомный балансировщик WeightedRandom — реализован алгоритм взвешенного случайного выбора реплики.

Алгоритм Weighted Random

Каждой реплике присваивается целочисленный вес. При поступлении запроса вероятность выбора реплики пропорциональна её весу:

$$P_i = \frac{w_i}{\sum_{j} w_j}$$

Конфигурация весов

Веса задаются в Api.Gateway/appsettings.json в секции LoadBalancer:Weights — массив целых чисел, где индекс соответствует номеру реплики:

{
  "LoadBalancer": {
    "Weights": [ 35, 25, 20, 12, 8 ]
  }
}

Лабораторная работа №3 — «Брокер сообщений и объектное хранилище»

Вариант: SNS + Minio. После генерации товар публикуется в SNS-топик в LocalStack, файловый сервис принимает уведомление по HTTP и кладёт JSON в бакет Minio.

Что было сделано

  1. CloudFormation-шаблон WarehouseApp.AppHost/CloudFormation/warehouse-template-sns.yaml с одним SNS-топиком warehouse-topic. В AppHost применяется через AddAWSCloudFormationTemplate.
  2. В AppHost.cs подняты контейнеры warehouse-localstack (порт 4566) и warehouse-minio. Реплики API и файловый сервис получают AWS-конфигурацию через WithReference(awsResources).
  3. В WarehouseApp.Api после промаха кэша WarehouseItemService вызывает SnsPublisherService.PublishAsync — сериализует WarehouseItem и публикует в топик. ARN читается из AWS:Resources:SNSTopicArn (заполняется outputs CloudFormation).
  4. WarehouseApp.FileService:
    • на старте создаёт бакет (S3MinioService.EnsureBucketExists) и подписывает свой HTTP-эндпоинт на топик (SnsSubscriptionService.SubscribeEndpoint);
    • POST /api/sns — вебхук, подтверждает SubscriptionConfirmation и сохраняет Notification в Minio под ключом warehouse_{id}.json;
    • GET /api/s3 и GET /api/s3/{key} — список ключей и чтение одного объекта.
  5. Интеграционные тесты:
    • GatewayCall_ProducesFileInS3WithSameId — дёргает GET /warehouse-item?id={id} у шлюза и поллит GET /api/s3/warehouse_{id}.json у файлового сервиса, сравнивая содержимое;
    • MultipleGatewayCalls_ProduceDistinctFilesInS3 — делает три запроса с разными id и проверяет, что все три ключа появились в GET /api/s3.

About

Современные технологии разработки программного обеспечения. 5 курс

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages