Я разрабатываю программное обеспечение, например, управление складом.
И у меня 1 проблема.
Проблема:
У меня есть X треков. Каждый трек имеет различную вместимость.
Теперь у меня есть несколько операторов, которые принимают заказы и заполняют трек. При нажатии оператором «Принять» - оператор синхронизации должен получить ответ, если заказы приняты на выбранную дорожку. Допустим, у Трека А есть емкость на 100 заказов, а внутри - 98 заказов.
Теперь 3 оператора принимают заказы на этот трек ...
Я хочу только 2 заказа и на 3-й заказ показать сообщение, как - извините, ваш заказ не принят, потому что здесь нет места в треке.
Подход № 1: Просто установите блокировку на сервере.
Код:
Контроллер API:
[Route("api/[controller]")]
[ApiController]
public class TrackController : ControllerBase
{
public async Task<IActionResult> Test()
{
Console.WriteLine("Handle Request ");
bool result = await TrackManager.ReservePlace();
return Ok(result);
}
}
TrackManager:
public static class TrackManager
{
private static SemaphoreSlim _semaphore { get; set; }
public static void Init()
{
_semaphore = new SemaphoreSlim(1);
}
public static async Task<bool> ReservePlace()
{
await _semaphore.WaitAsync();
Console.WriteLine("Order in process...");
await Task.Delay(2500); <<< ==== Just simulate the biggest delay with database
_semaphore.Release();
return true;
}
}
Мне действительно не нравится этот подход.
Второй подход - сделать что-то вроде взаимоблокировки в БД.
Ограничения в базе данных не очень хороший вариант - потому что емкость дорожки другая.
Вопросы:
1) Каков наилучший способ обработки запросов на параллелизм и синхронизацию ответов?
2) Я думаю о переносе всего этого приложения на сервер (AWS Lambda) и их облачную базу данных. Какое решение я могу сделать их ... потому что даже мое решение блокировки может быть реализовано с помощью Lambda ....
Спасибо.