Как я могу безопасно генерировать идентификаторы GUID в надежной функции Azure?

#c# #guid #azure-durable-functions

#c# #идентификатор guid #azure-durable-функции

Вопрос:

Я пишу надежную функцию, и мне нужно сгенерировать несколько идентификаторов GUID. Согласно документации, вам необходимо проявлять особую осторожность, поскольку генерация идентификаторов GUID не является детерминированной. При воспроизведении оркестровки он должен использовать тот же идентификатор GUID, и обходной путь, описанный в документации, заключается в

Используйте NewGuid в .NET или newGuid в JavaScript для безопасной генерации случайных идентификаторов GUID.

Я предполагаю, что они означают статический метод Guid.NewGuid() , но когда я использую его в своем коде, например:

 [FunctionName("Orchestration")]
public static async Task Orchestration([OrchestrationTrigger] IDurableOrchestrationContext context, ILogger logger) {
    var guid = Guid.NewGuid();
  

Я получаю предупреждение компилятора:

Предупреждение DF0102: ‘Guid.NewGuid’ нарушает ограничение детерминированного кода оркестратора. (DF0102)

и когда я запускаю функцию, я вижу, что при воспроизведении она выдает другой идентификатор GUID, поэтому она определенно не детерминирована. Я знаю, что могу написать функцию activity для генерации идентификатора GUID, но это кажется немного излишним, если для этого есть специальная поддержка. В этом комментарии на GitHub упоминается, что он был выпущен в версии v1.7.0 (я использую версию v2.3.1).

Ответ №1:

При написании этого вопроса я понял, в чем была моя проблема. Это предположение:

Я предполагаю, что они имеют в виду статический метод Guid.NewGuid()

Оказывается, в IDurableOrchestrationContext интерфейсе также есть NewGuid() метод, который

Создает новый идентификатор GUID, который безопасен для воспроизведения в оркестровке или операции.

 [FunctionName("Orchestration")]
public static async Task Orchestration([OrchestrationTrigger] IDurableOrchestrationContext context, ILogger logger) {
    var guid = context.NewGuid();
  

Комментарии:

1. Не могли бы вы привести пример?

2. @user989988 не уверен, что пример действительно полезен, но вот он.