Повторяющиеся данные с несколькими экземплярами микросервиса - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблема с дублирующимися данными. У меня есть клиент, который вызывает API несколько раз, чтобы заполнить какую-то сетку. Экземпляр API - это служба, которая проверяет, существуют ли данные, а если нет, то создает все данные. Проблема заключается в том, что когда метод, который создает данные, является тяжелым и занимает много времени. Таким образом, 2 метода выполняются одновременно, и оба сохраняют данные, создавая дубликаты. Могу ли я поставить вызов API в очередь и выполнить их по одному? Или есть другой способ добиться этого? Вот код API

[Produces("application/json")]
[Route("api/v1/Combinations")]
public class CombinationsController : Controller
{
    private readonly ICommonService _CommonService;
    private readonly ILogger _logger;

    public CombinationsController(ICommonService CommonService,
        ILogger<CombinationsController> logger)
    {
        _logger = logger;
        _CommonService = CommonService;
    } 

    [HttpPost("GenerateCombinationsByAttributes",Name ="GenerateCombinationsByAttributes")]
    public async Task<IActionResult> GenerateCombinationsByAttributes([FromBody] List<Guid> attributeIds)
    {
        if (attributeIds == null || attributeIds.Count == 0 || attributeIds.Contains(Guid.Empty))
            return BadRequest();

        var ret = await _CommonService.GenerateCombinationByAttributesList(attributeIds);

        return Ok();
    }

}

1 Ответ

0 голосов
/ 06 ноября 2018

Я думаю, что мне удалось решить его с помощью простого семафора Я объявил

static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1);

внутри класса микросервисов а затем

 public async Task<Result> GenerateCombinationByAttributesList(List<Guid> attributeIds)
    {
        var result = new Result();
        await semaphoreSlim.WaitAsync();
        try
        {
            DoHeavyStuffHere();

        }
        catch (Exception ex)
        {
            _logger.LogError(ex.Message);
            result.SetError(ex.Message);
        }
        finally
        {
            semaphoreSlim.Release();
        }
        return result;
    }
...