Контекст:
У меня есть специальное требование для хранения "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 };
}