Стратегия управления подключениями к базам данных из 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 и несколькими экземплярами, мы могли бы получить больше информации из документа.