Функции Redis и Google Cloud

# #redis #google-cloud-functions #ioredis

Вопрос:

Я использую ioredis set значения для экземпляра redis enterprise.

  1. Как закрыть соединение через несколько секунд, чтобы уменьшить количество созданных клиентов ?
  2. Нужно ли мне вообще закрывать соединение ?
  3. Порождает ли каждый вызов клиента redis ?
  4. Нужен ли мне разъем VPC ?
  5. Как я могу убедиться, что fucntion работает на том же ip:port самом, чтобы предотвратить создание других экземпляров
 import * as functions from "firebase-functions";

import Redis = require("ioredis");
const redis = new Redis("redis://default:jMSNpTm3JXs1@redis-15360.c228.us-central1-1.gce.cloud.redislabs.com:15360");

export const SaveRecord = functions.https.onCall(async (data,context)=>{
  const {record,recordID} = data;
  try{
    var result =  await redis.multi().set(recordID, record).expire(recordID,3600).exec();
    return resu<
  }catch(e){
    console.log(e);
    return "error";
  }
})


 

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

1. Где размещен ваш экземпляр redis? В Облаке Google? В Хранилище Памяти? В другом месте?

2. Корпоративное облако Redis

3. Вы установили его с торговой площадки? Видите ли вы развернутую инфраструктуру в своем проекте?

4. Нет… Вызов его при инициализации

5. Я тебя не поймал. Как вы инициализировали свой экземпляр Redis cloud? где он размещен?

Ответ №1:

Я никогда не развертывал Redis Cloud Enterprise в своем проекте, но я уже могу предоставить эти ответы

1,2,3. Вам не нужно закрывать соединение при каждом подключении. В вашем коде вы запускаете (строка 4) соединение с вашим Redis и сохраняете его в глобальной переменной (в глобальной области, а не в теле функции).

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

Однако вам необходимо проверить тайм-аут подключения redis Cloud по умолчанию и иметь возможность выполнить повторное подключение в случае закрытого подключения (обработка исключений в вашем коде).

Что касается закрытия соединения, это также зависит от конфигурации Redis Cloud: автоматически ли закрывается неактивное соединение? Если нет, то это будет трудно. Попробуйте закрыть соединение в режиме ожидания с помощью конфигурации сервера Redis после 1 часа бездействия или менее. (Экземпляры облачных функций обычно выгружаются после 30 минут бездействия без каких-либо обязательств Google Cloud).

  1. Да; Если вы проверите IP, зарегистрированный на вашем URL (например nelookup redis-15360.c228.us-central1-1.gce.cloud.redislabs.com ), вы найдете URL в 172.26.x.x. Это частный IP-адрес RFC 1918. Разрешение DNS является внешним (запросите у redislab URL-адрес IP-адреса сервера), но целевой сервер является внутренним для вашего проекта. Вы можете направлять только внутренний трафик.
  2. Служба облачных функций создает и уничтожает экземпляры в соответствии с трафиком HTTP. Вы не можете предотвратить создание или уничтожение экземпляров, это бессерверно. Аналогично, у вас нет IP/порта, связанного с вашим экземпляром облачных функций, он бессерверный. Если вы хотите иметь только 1 экземпляр облачных функций, вы можете установить максимальное значение 1. Но будьте осторожны, облачные функции могут обрабатывать только 1 запрос одновременно в одном экземпляре. При максимальном экземпляре 1 у вас есть 2 одновременных запроса, 1 будет обработан, другой будет ждать, и через 10 секунд будет возвращена ошибка HTTP 417.

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

1. Спасибо Вам за вашу проницательность. Я переместил инициализацию внутрь функции. Надеюсь, это не изменит транзакции

2. Если вы измените это, это означает, что вы будете «оплачивать» продолжительность инициализации по каждому запросу, а не один раз за созданный экземпляр. Это должно быть проще в управлении, но не самое эффективное!