Files
Deal/src/core/Deal.Modules.Discovery/Application/Services/DiscoveryPacer.cs
T
Rustam Khalimov cd0b3b606b Разбить модули Deal.Modules.* по назначению
Application проектов Discovery, Kanban, Pipeline, Settings, Tenants
разделён на Abstractions/Exceptions/Extensions/Models/Registrars/Services;
namespace приведён к путям, using потребителей мигрированы и
дедуплицированы (169 файлов), cref/FQN обновлены.
2026-09-11 13:18:14 +03:00

43 lines
2.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Deal.Modules.Settings.Application.Abstractions;
using Deal.Modules.Settings.Application.Models;
using Deal.Modules.Settings.Application.Registrars;
using Deal.Modules.Settings.Application.Services;
using Deal.Modules.Discovery.Application.Abstractions;
using Deal.Modules.Discovery.Application.Exceptions;
using Deal.Modules.Discovery.Application.Extensions;
using Deal.Modules.Discovery.Application.Models;
using Deal.Modules.Discovery.Application.Registrars;
namespace Deal.Modules.Discovery.Application.Services;
/// <summary>
/// Продовая реализация <see cref="IDiscoveryPacer"/>: случайная пауза из настроек тенанта (ban_guard L4456).
/// </summary>
/// <remarks>
/// Защита инварианта min ≤ max как в python L47–51: настройки мог изменить один конец интервала (single-key
/// PATCH), поэтому при инверсии концы меняются местами. Обе настройки не заданы/≤0 — паузы нет (крайний случай
/// L52–53). Детерминизма нет: интервал сэмплируется из <see cref="Random.Shared"/>.
/// </remarks>
public sealed class DiscoveryPacer(ISettingsStore settings) : IDiscoveryPacer
{
/// <inheritdoc />
public async Task WaitJoinDelayAsync(CancellationToken ct)
{
TenantSettingsSnapshot snapshot = await TenantSettingsSnapshot.LoadAsync(settings, ct);
int low = snapshot.GetInt(SettingsKeys.DiscJoinDelayMin, SettingsDefaults.DiscJoinDelayMin);
int high = snapshot.GetInt(SettingsKeys.DiscJoinDelayMax, SettingsDefaults.DiscJoinDelayMax);
if (low <= 0 && high <= 0)
{
return;
}
if (low > high)
{
(low, high) = (high, low);
}
double seconds = low + Random.Shared.NextDouble() * (high - low);
await Task.Delay(TimeSpan.FromSeconds(seconds), ct).ConfigureAwait(false);
}
}