Разрабатывайте с помощью SDK Durable Task для Go

Используя Durable Task SDK для Go, вы можете определить оркестрации, операции и долговечные сущности как функции Go. Разместите приложение на собственной вычислительной платформе. Durable Task Scheduler хранит историю выполнения и отправляет работу вашим Go-воркерам.

Important

Go SDK находится на стадии бета. Эта статья и быстрый старт Go используют v1.0.0-beta3. Бета-версия не является прямой заменой версии 0.6.0: она не поддерживает встроенные SQLite и PostgreSQL бэкенды или отдельный хост gRPC. Go — это не язык Устойчивые функции.

Необходимые условия и установка

Установите выпущенную бета-версию из существующего модуля Go:

go get github.com/microsoft/durabletask-go@v1.0.0-beta3

После добавления импорта SDK в ваш код запустите go mod tidy для записи транзитивных зависимостей и контрольных сумм.

Для полноценного приложения, которое запускает работника, планирует параллельные активности, читает их результаты и завершает работу, смотрите раздел «Создать приложение с Durable Task SDKs — Go».

Модель программирования

SDK поставляется в виде одного модуля Go. Её основные пакеты:

Package Purpose
task Контексты оркестрации, активности и сущностей; регистрация задач; надёжные примитивы рабочих процессов.
durabletaskscheduler Опции подключения и отдельные подключения клиента и работников к Durable Task Scheduler.
client Конфигурация воркеров, включая параллельность, версионирование и фильтры рабочих элементов.
api Идентификаторы экземпляра и сущности, метаданные оркестрации и опции запросов управления.

У оркестратора есть сигнатура func(*task.OrchestrationContext) (any, error). Активность имеет сигнатуру func(task.ActivityContext) (any, error). Функциональная сущность имеет сигнатуру func(*task.EntityContext) (any, error). Прочитать введённые данные с GetInput, и вернуть сериализируемый результат или ошибку. JSON — это стандартный формат данных.

Зарегистрируйте и выполните задачи

Создайте registry с task.NewTaskRegistry. Регистрируйте стабильные имена с AddOrchestratorN, AddActivityN и AddEntityN, и проверяйте ошибки регистрации. Имена, используемые в вызовах активности и планировании клиентом, должны совпадать с регистрациями.

Разберите строку подключения с помощью durabletaskscheduler.NewOptionsFromConnectionString. Передайте параметры в:

  • durabletaskscheduler.NewClient для запуска и управления экземплярами оркестрации.
  • durabletaskscheduler.NewWorker для выполнения зарегистрированных задач.

Вызовите Start на воркере, чтобы начать обработку элементов работы. Используйте client.WithAutoWorkItemFilters(), чтобы получить фильтры маршрутизации рабочих из реестра. Не позволяйте сотруднику обрабатывать задачи, зарегистрированные только другим приложением.

У клиента и работника есть отдельные соединения. Закройте клиент по завершении работы. Выведите worker из эксплуатации с помощью Shutdown, используя свежий, замкнутый контекст, если контекст выполнения приложения истёк. Быстрый старт проверяет наличие ошибок в обеих операциях.

Пишите детерминированные оркестраторы

Используйте контекст оркестрации для длительных операций:

Operation Go API Узнать больше
Последовательность действий ctx.CallActivity(...).Await(&result) Цепочка вызовов функций
Разветвление и слияние Запланируйте все задачи, затем ctx.WhenAll(tasks...) и прочитайте результаты с помощью Await Фан-аут/фан-ин
Delay ctx.CreateTimer(duration).Await(nil) Устойчивые таймеры
Дождитесь события ctx.WaitForSingleEvent(name, timeout).Await(&result) Внешние события
Вызов дочернего рабочего процесса ctx.CallSubOrchestrator(...).Await(&result) Вложенные оркестрации
Повторная попытка действия task.WithActivityRetryPolicy Обработка ошибок и повторные попытки
Начните новый журнал ctx.ContinueAsNew Вечные оркестрации
Проверить ход выполнения ctx.SetCustomStatusValue Пользовательский статус
Вызовите или подайте сигнал сущности ctx.CallEntity и ctx.SignalEntity. Устойчивые сущности

Не выполняйте сетевые вызовы, файловый ввод-вывод, чтения переменных среды или другую недетерминированную работу в оркестраторе. Включите эту работу в действия. Используйте прочные примитивы параллелизма SDK вместо нативных горутин, каналов, sync.WaitGroup, или time.Sleep в оркестраторном коде. Используйте ctx.Logger() для логирования с учётом повторов. Для подробностей см. ограничения кода Orchestrator.

Активности могут выполнять обычные операции ввода-вывода Go, но их можно выполнять более одного раза. Сделайте внешние побочные эффекты идемпотентными.

Просмотреть результаты завершения

WaitForOrchestrationCompletion Возвращение без ошибки означает, что экземпляр достиг терминального состояния, но это не обязательно означает, что рабочий процесс завершился успешно. При запросе данных с api.WithFetchPayloads(true) проверьте, что RuntimeStatus — это api.RUNTIME_STATUS_COMPLETED, а затем декодируйте выходные данные с помощью ReadOutput.

Для неуспешных экземпляров проверьте FailureDetails. Не сообщайте о неудачной или прерванной оркестровке как о успешном результате. См. Управление экземплярами.

Подключитесь к эмулятору или Azure

В кратком руководстве по началу работы используется строка подключения Endpoint=http://localhost:8080;TaskHub=default;Authentication=None. Используйте Authentication=None для локальной разработки с эмулятором, а не для аутентифицированного доступа к Azure.

Для Azure используйте HTTPS-конечную точку планировщика и имя хаба задач. Выберите Authentication=DefaultAzure для цепочки учетных данных Azure Identity или Authentication=AzureCLI для удостоверения разработчика, выполнившего вход через Azure CLI. Go SDK также поддерживает управляемые удостоверения и удостоверения рабочей нагрузки. Для подробностей конфигурации и поддерживаемых режимов аутентификации смотрите руководство по подключению Go SDK.

Быстрый старт считывает строка подключения из DTS_CONNECTION_STRING переменной окружения и передаёт её в NewOptionsFromConnectionString. SDK не считывает эту переменную автоматически.

Samples

Репозиторий Go SDK включает исполняемые сэмплы для своих функциональных областей, включая последовательности действий, фанаут/фан-ин, внешние события, повторные попытки, устойчивые сущности, расписания, большие полезные нагрузки, экспорт истории и распределённое отслеживание. Полный список, требования и инструкции по запуску смотрите образцы Go SDK.

Тестовые оркестрации

SDK не включает бэкенд хранилища, поэтому оркестрации работают только с Durable Task Scheduler или его эмулятором. Тестируйте активности и другую бизнес-логику с помощью обычных модульных тестов Go. Для проверки поведения оркестрации, включая повторное воспроизведение, проведите интеграционные тесты с эмулятором или выделенным хабом задач.

Особенности совместимости бета-версии

  • Расписания: Расписания Go не разделяют формат сохраненного состояния с другими SDK. Используйте центр задач только для Go для запланированных задач.
  • Блокировки сущностей: Go и Python используют другой порядок блокировки нескольких сущностей, чем в .NET. Не приобретайте одновременно перекрывающиеся наборы блокировок между оркестрациями Go/Python и .NET.
  • Перемотка: Воркер Go консервативно отвергает истории с дополнительными событиями, не относящимися к жизненному циклу, после неудачной деятельности или дочерней операции. Принятый запрос на откат не доказывает восстановление; проверьте новый ID выполнения и успешный вывод.
  • API управления эмуляторами: Список экземпляров и выборочная очистка имеют задокументированные ограничения эмуляторов. Для примеров предпочитайте очистку на уровне экземпляра и не очищайте общий хаб.
  • Экспорт истории (предварительная версия): Используйте изолированный концентратор задач только для Go и изолированный адрес экспорта, чтобы задания на экспорт не могли экспортировать или удалять несвязанные данные приложения.

Смотрите матрицу функций Go SDK и руководство по транспорту для подробной совместимости и поведения жизненного цикла.