mirror of
https://github.com/azaion/satellite-provider.git
synced 2026-04-23 01:56:38 +00:00
parallel processing for routes and regions
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System.Threading.Channels;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using SatelliteProvider.Common.DTO;
|
||||
using SatelliteProvider.Common.Interfaces;
|
||||
|
||||
@@ -7,19 +8,33 @@ namespace SatelliteProvider.Services;
|
||||
public class RegionRequestQueue : IRegionRequestQueue
|
||||
{
|
||||
private readonly Channel<RegionRequest> _queue;
|
||||
private readonly ILogger<RegionRequestQueue>? _logger;
|
||||
private int _totalEnqueued = 0;
|
||||
private int _totalDequeued = 0;
|
||||
|
||||
public RegionRequestQueue(int capacity)
|
||||
public RegionRequestQueue(int capacity, ILogger<RegionRequestQueue>? logger = null)
|
||||
{
|
||||
var options = new BoundedChannelOptions(capacity)
|
||||
{
|
||||
FullMode = BoundedChannelFullMode.Wait
|
||||
};
|
||||
_queue = Channel.CreateBounded<RegionRequest>(options);
|
||||
_logger = logger;
|
||||
_logger?.LogInformation("RegionRequestQueue created with capacity {Capacity}", capacity);
|
||||
}
|
||||
|
||||
public async ValueTask EnqueueAsync(RegionRequest request, CancellationToken cancellationToken = default)
|
||||
{
|
||||
var queueDepthBefore = Count;
|
||||
_totalEnqueued++;
|
||||
_logger?.LogDebug("Enqueuing region {RegionId} (queue depth before: {Depth}, total enqueued: {Total})",
|
||||
request.Id, queueDepthBefore, _totalEnqueued);
|
||||
|
||||
await _queue.Writer.WriteAsync(request, cancellationToken);
|
||||
|
||||
var queueDepthAfter = Count;
|
||||
_logger?.LogDebug("Enqueued region {RegionId} (queue depth after: {Depth})",
|
||||
request.Id, queueDepthAfter);
|
||||
}
|
||||
|
||||
public async ValueTask<RegionRequest?> DequeueAsync(CancellationToken cancellationToken = default)
|
||||
@@ -28,6 +43,10 @@ public class RegionRequestQueue : IRegionRequestQueue
|
||||
{
|
||||
if (_queue.Reader.TryRead(out var request))
|
||||
{
|
||||
_totalDequeued++;
|
||||
var queueDepth = Count;
|
||||
_logger?.LogDebug("Dequeued region {RegionId} (queue depth: {Depth}, total dequeued: {Total})",
|
||||
request.Id, queueDepth, _totalDequeued);
|
||||
return request;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user