Application проектов Discovery, Kanban, Pipeline, Settings, Tenants разделён на Abstractions/Exceptions/Extensions/Models/Registrars/Services; namespace приведён к путям, using потребителей мигрированы и дедуплицированы (169 файлов), cref/FQN обновлены.
43 lines
2.0 KiB
C#
43 lines
2.0 KiB
C#
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 L44–56).
|
||
/// </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);
|
||
}
|
||
}
|