Как хранить зависимость / активность. Идентификатор перед зависимостью. - PullRequest
0 голосов
/ 26 января 2020

Контекст:

У меня есть специальное требование для хранения "dependencyActivity.id" в транзакции, см. Строку кода, прикрепленную ниже: await SaveOutgoingEventAsyn c (String.Empty); В настоящее время я сохраняю пустую строку в качестве временной версии dependencyActivity.id и обновляю ее до фактического значения dependencyActivity.Id после запуска зависимостей. Используйте этот способ для передачи родительских и дочерних отношений следующему внешнему процессу, dependencyActivity.Id, как OperationParentId моей нисходящей службы.

Вопрос:

1: Как лучше хранить зависимые идентификатор перед началом и окончанием операции телеметрии?

Код:

public async Task<ReturnOrderDto> SubmitOrderAsync(SubmitOrderDto order)
{
    var executionStrategy = _orderDbContext.Database.CreateExecutionStrategy();
    await executionStrategy.ExecuteAsync(async () =>
    {
        using (var transaction = _orderDbContext.Database.BeginTransaction(IsolationLevel.ReadCommitted))
        {
            //Some processing code
            ......
            ......

            //Store empty string as dependencyActivity.Id in database
            await SaveOutgoingEventAsync(String.Empty);
            // Commit incoming, business and outgoing entities together in outbox pattern
            await transaction.CommitAsync();
        }
    });

    var dependencyActivity = new Activity("Publish Message");
    dependencyActivity.SetParentId(Activity.Current.Id);
    dependencyActivity.Start();
    var operation = _telemetryClient.StartOperation<DependencyTelemetry>(dependencyActivity);
    var messageHeader = new KafkaMessageHeader(dependencyActivity.TraceId.ToString(), dependencyActivity.Id);
    kafkaMessage.UpdateHeader(messageHeader);
    await _publisher.ProduceAsync(kafkaMessage);
    _telemetryClient.StopOperation(operation);

    //update previous stored empty Id to dependencyActivity.Id
    outgoingEvent.UpdateOutgoingIntegrationEvent(dependencyActivity.TraceId.ToString(), dependencyActivity.Id);
    outgoingEvent.MarkAsSent();
    await _outgoingEventRepository.SaveChangesAsync();

    return new ReturnOrderDto { OrderId = _orderEntity.OrderId };
}
...