Стратегия управления подключениями к базам данных из Azure Webjobs

Я использую веб-задания Azure с функциями, запускаемыми из очереди (которые зависят от sdk Azure webjobs), чтобы выполнить некоторую фоновую обработку. В рамках веб-заданий я делаю различные подключения к базе данных SQL Azure (используя PetaPoco, который использует System.Data.SqlClient).

Я хочу быть целеустремленным в своей стратегии подключения к базе данных - особенно потому, что существуют некоторые проблемы параллелизма, свойственные среде.

Один из сценариев параллелизма связан со свойством SDK BatchSize, которое можно установить для запускаемых по очереди веб-заданий. Насколько я понимаю, установка BatchSize > 1 приводит к тому, что несколько запущенных в очереди функций выполняются в одном и том же процессе веб-задания.

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

На моем веб-сайте у меня есть соединение с базой данных на запрос (по умолчанию машина обрабатывает пулы соединений). Там нет проблем.

Как мне относиться к соединениям в сценарии webjob, учитывая сценарии параллелизма, описанные выше? Конечно, веб-задания - это просто долгоживущие консольные процессы (это непрерывные веб-задания). Должен ли я создать соединение с базой данных при запуске веб-задания и просто повторно использовать это подключение в течение срока его службы? Должен ли я создавать и закрывать соединения для каждой функции, когда они мне нужны?

Это те вещи, которые я пытаюсь понять.

1 ответ

Конечно, веб-задания - это просто долгоживущие консольные процессы (это непрерывные веб-задания).

Основным процессом являются долгоживущие процессы, но для trigged sub- process будет выпущен после выполнения триггерной функции. Это означает, что соединение также будет автоматически разорвано в подпроцессе. Для лучших программных практик лучше закрыть их вручную перед выходом из функции.

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

Триггер очереди WebJob SDK автоматически предотвращает запуск очереди несколькими экземплярами.

Если ваше веб-приложение запускается в нескольких экземплярах, на каждом компьютере выполняется непрерывный WebJob, и каждый компьютер будет ожидать триггеров и пытаться запускать функции. Триггер очереди WebJobs SDK автоматически запрещает функции обрабатывать сообщение очереди несколько раз; функции не должны быть написаны, чтобы быть идемпотентными. Однако если вы хотите, чтобы только один экземпляр функции выполнялся, даже если есть несколько экземпляров веб-приложения хоста, вы можете использовать атрибут Singleton.

Насколько я понимаю, установка BatchSize > 1 приводит к тому, что несколько запущенных в очереди функций выполняются в одном и том же процессе веб-задания.

BatchSize означает, что количество сообщений в очереди, которые могут быть подобраны одновременно, должно быть выполнено параллельно в WebJob.

Как использовать хранилище очередей Azure с параллельным выполнением WebJobs SDK и несколькими экземплярами, мы могли бы получить больше информации из документа.

Другие вопросы по тегам