Azure функции - пул dbconnection для снежинки python разъем - PullRequest
0 голосов
/ 15 января 2020

У меня есть приложение функций azure (python), которое подключается к базе данных снежинок (создает объект dbconnection), выполняет запрос и возвращает результаты, и все работает нормально. Единственная проблема - время, необходимое для возврата запроса. Он создает объект dbconnection каждый раз, когда он вызывается.

Вопрос: Возможно ли объединение в пул соединения с помощью приложения функций (учитывая, что приложение функций не имеет состояния)

1 Ответ

1 голос
/ 15 января 2020

Короткий ответ ДА, вот мой пример кода Azure Функция с триггером HTTP, как показано ниже.

import logging

import azure.functions as func

def inc(n):
    while True:
        n += 1
        yield n

count = inc(0)

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    return func.HttpResponse(f"Count: {count.__next__()}!")

Я объявил глобальную переменную count со значением генератора inc(0) вне функции main, тогда я могу получить увеличенный ответ на счет, как показано на рисунке ниже.

enter image description here

Это так же, как мой другой ответ на SO поток Azure использует python flask инфраструктуру для приложения функций .

Так что я думаю, что действительно нужно реализовать пул соединений в Azure функциях, таких как использование snowflakedb/snowflake-sqlalchemy для создания пула соединений для базы данных Snowflake в Python вне функции main из Azure Функция, как показано ниже, ссылаясь на документ SQLAlchemy Пул соединений .

import logging
import azure.functions as func
from sqlalchemy import create_engine
import sqlalchemy.pool as pool

engine = create_engine(
    'snowflake://{user}:{password}@{account}/'.format(
        user='<your_user_login_name>',
        password='<your_password>',
        account='<your_account_name>',
    )
)

def getconn():
    connection = engine.connect()
    return connection

mypool = pool.QueuePool(getconn, max_overflow=10, pool_size=5)

def main(req: func.HttpRequest) -> func.HttpResponse:
    try:
        conn = mypool.connect()
        # Do the code what you want, such as
        # cursor = conn.cursor()
        # cursor.execute("select foo")
        ....
    finally:
        conn.close()
    return func.HttpResponse(f"......")

Объяснение приведенного выше кода состоит в следующем:

  1. Azure Функции для Python запускаются для компиляции исходного кода сверху вниз и загрузить свой байт-код в память, тогда объект mypool Он вызывается из памяти после выполнения функции main до тех пор, пока mypool не будет удален из памяти после долгого простоя.
  2. При следующем запуске функции main после простоя новый объект mypool будет создан и непрерывно делает, как указано выше.
...