Skip to content

Панкеев Глеб Лаб. 2 Группа 6512#97

Open
Pancake2021 wants to merge 16 commits into
itsecd:mainfrom
Pancake2021:lab2
Open

Панкеев Глеб Лаб. 2 Группа 6512#97
Pancake2021 wants to merge 16 commits into
itsecd:mainfrom
Pancake2021:lab2

Conversation

@Pancake2021
Copy link
Copy Markdown

ФИО: Панкеев Глеб Сергеевич
Номер группы: 6512
Номер лабораторной: 2
Номер варианта: 30
Краткое описание предметной области: Кредитная заявка
Краткое описание добавленных фич: Реализован балансировщик нагрузки QB

@github-actions github-actions Bot added In progress Код в процессе проверки Lab 2 Лабораторная №2. Балансировка нагрузки labels Apr 9, 2026
@github-actions github-actions Bot requested a review from Gwymlas April 9, 2026 08:09
@Pancake2021
Copy link
Copy Markdown
Author

Pancake2021 commented Apr 9, 2026

image

@Pancake2021
Copy link
Copy Markdown
Author

image

@Pancake2021
Copy link
Copy Markdown
Author

image

@Pancake2021
Copy link
Copy Markdown
Author

image

@Pancake2021
Copy link
Copy Markdown
Author

image

@Pancake2021
Copy link
Copy Markdown
Author

Накинул тестов базовых можете посмотреть

Снимок экрана 2026-04-09 в 11 58 38

Copy link
Copy Markdown

@Gwymlas Gwymlas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Дублируются проекты CreditSystem.* и ProjectApp.*, оставьте только необходимое (сейчас запускаются проекты ProjectApp.*)
Для первой и второй лабы localstack не нужен

  1. «Кэширование» - Реализация сервиса генерации контрактов, кэширование его ответов

В рамках первой лабораторной работы необходимо:

  • Реализовать сервис генерации контрактов на основе Bogus,
  • Реализовать кеширование при помощи IDistributedCache и Redis,
  • Реализовать структурное логирование сервиса генерации,
  • Настроить оркестрацию Aspire.
  1. «Балансировка нагрузки» - Реализация апи гейтвея, настройка его работы

В рамках второй лабораторной работы необходимо:

  • Настроить оркестрацию на запуск нескольких реплик сервиса генерации,
  • Реализовать апи гейтвей на основе Ocelot,
  • Имплементировать алгоритм балансировки нагрузки согласно варианту.

Redis нет, при запросе по одному и тому же id выдает разные данные
Добавить summary, где отсутствует

Приведите лабораторную работу в порядок

/// <param name="cancellationToken">Токен отмены операции</param>
/// <returns>Кредитная заявка</returns>
[HttpGet]
public async Task<ActionResult<CreditApplication>> GetById([FromQuery] int id, CancellationToken cancellationToken)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавить атрибут ProducesResponseType

Comment on lines +20 to +21
var nonTerminalStatuses = new[] { "Новая", "В обработке" };
var terminalStatuses = new[] { "Одобрена", "Отклонена" };
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Думаю стоит вынести в private static readonly поля

var maxApplicationDate = DateTime.Today.AddDays(-1);

_faker = new Faker<CreditApplication>("ru")
.RuleFor(c => c.Id, f => f.IndexFaker + 1)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Id будет заполняться запрошенным значением, можно убрать

ILogger<CreditApplicationService> logger) : ICreditApplicationService
{
private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web);
private static readonly TimeSpan CacheTtl = TimeSpan.FromMinutes(10);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В appsettings есть ExpirationMinutes, но его не используешь

Comment on lines +31 to +53
var cachedPayload = await cache.GetStringAsync(cacheKey, cancellationToken);
if (!string.IsNullOrEmpty(cachedPayload))
{
var cachedApplication = JsonSerializer.Deserialize<CreditApplication>(cachedPayload, JsonOptions);
if (cachedApplication is not null && validator.TryValidate(cachedApplication, out _))
{
logger.LogInformation("Cache hit for credit application {Id}", id);
return cachedApplication;
}

if (cachedApplication is null)
{
logger.LogWarning("Cache entry for credit application {Id} cannot be deserialized. Regenerating value.", id);
}
else
{
validator.TryValidate(cachedApplication, out var cacheValidationError);
logger.LogWarning(
"Cache entry for credit application {Id} is invalid: {ValidationError}. Regenerating value.",
id,
cacheValidationError);
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Обернуть в try-catch

Comment thread ProjectApp.AppHost/Program.cs Outdated
Comment on lines +5 to +18
var apiReplica1 = builder.AddProject<Projects.ProjectApp_Api>("projectapp-api-r1")
.WithReference(cache)
.WaitFor(cache)
.WithEndpoint("http", endpoint => endpoint.Port = 7001);

var apiReplica2 = builder.AddProject<Projects.ProjectApp_Api>("projectapp-api-r2")
.WithReference(cache)
.WaitFor(cache)
.WithEndpoint("http", endpoint => endpoint.Port = 7002);

var apiReplica3 = builder.AddProject<Projects.ProjectApp_Api>("projectapp-api-r3")
.WithReference(cache)
.WaitFor(cache)
.WithEndpoint("http", endpoint => endpoint.Port = 7003);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделать в цикле

Comment thread ProjectApp.AppHost/Program.cs Outdated
.WithEndpoint("http", endpoint => endpoint.Port = 7000);

builder.AddProject<Projects.Client_Wasm>("client")
.WithReference(gateway)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не нужен WithReference

@@ -0,0 +1,52 @@
using Ocelot.LoadBalancer;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Удалить неиспользуемый using

/// </summary>
public class QueryBasedLoadBalancer(IServiceDiscoveryProvider serviceProvider) : ILoadBalancer
{
public string Type => "QueryBased";
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше использовать nameof

Comment on lines +23 to +32
Assert.Equal(first.Id, second.Id);
Assert.Equal(first.CreditType, second.CreditType);
Assert.Equal(first.RequestedAmount, second.RequestedAmount);
Assert.Equal(first.TermMonths, second.TermMonths);
Assert.Equal(first.InterestRate, second.InterestRate);
Assert.Equal(first.ApplicationDate, second.ApplicationDate);
Assert.Equal(first.RequiresInsurance, second.RequiresInsurance);
Assert.Equal(first.Status, second.Status);
Assert.Equal(first.DecisionDate, second.DecisionDate);
Assert.Equal(first.ApprovedAmount, second.ApprovedAmount);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно использовать Assert.Equivalent

@Pancake2021
Copy link
Copy Markdown
Author

в целом сделал 2 коммита

  1. API/кэш-сервис
  • Добавил [ProducesResponseType] в контроллер.
  • Вынес статусы в private static readonly в генераторе.
  • Убрал генерацию Id в генераторе (теперь Id ставится только из запроса).
  • В CreditApplicationService:
    • TTL теперь берётся из CacheSettings:ExpirationMinutes (appsettings).
    • Добавил try-catch на чтение из кэша.
    • Добавил try-catch на запись в кэш.
    • Убрал runtime-проверки CreditApplicationValidator при чтении/генерации (как просили).
  • Коммит: 7c......
  1. AppHost/Gateway/Validator/Tests
  • CreditApplicationValidator сделал static.
  • Переписал условия на pattern matching:
    • if (application is { Status: "Одобрена", ApprovedAmount: null })
    • if (application is { Status: "Отклонена", ApprovedAmount: not null })
  • AppHost:
    • Добавил Redis UI: redis-commander (порт 8081).
    • Реплики API сделал в цикле.
    • Убрал WithReference(gateway) у client.
  • Gateway:
    • Удалил неиспользуемый using.
    • Заменил строку типа на nameof(...).
  • Тест кэша:
    • Заменил пачку Assert.Equal на Assert.Equivalent.
  • Коммит: a50....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

In progress Код в процессе проверки Lab 2 Лабораторная №2. Балансировка нагрузки

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants