# #redis #google-cloud-functions #ioredis
Вопрос:
Я использую ioredis
set
значения для экземпляра redis enterprise.
- Как закрыть соединение через несколько секунд, чтобы уменьшить количество созданных клиентов ?
- Нужно ли мне вообще закрывать соединение ?
- Порождает ли каждый вызов клиента redis ?
- Нужен ли мне разъем VPC ?
- Как я могу убедиться, что 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).
- Да; Если вы проверите 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-адреса сервера), но целевой сервер является внутренним для вашего проекта. Вы можете направлять только внутренний трафик. - Служба облачных функций создает и уничтожает экземпляры в соответствии с трафиком HTTP. Вы не можете предотвратить создание или уничтожение экземпляров, это бессерверно. Аналогично, у вас нет IP/порта, связанного с вашим экземпляром облачных функций, он бессерверный. Если вы хотите иметь только 1 экземпляр облачных функций, вы можете установить максимальное значение 1. Но будьте осторожны, облачные функции могут обрабатывать только 1 запрос одновременно в одном экземпляре. При максимальном экземпляре 1 у вас есть 2 одновременных запроса, 1 будет обработан, другой будет ждать, и через 10 секунд будет возвращена ошибка HTTP 417.
Комментарии:
1. Спасибо Вам за вашу проницательность. Я переместил инициализацию внутрь функции. Надеюсь, это не изменит транзакции
2. Если вы измените это, это означает, что вы будете «оплачивать» продолжительность инициализации по каждому запросу, а не один раз за созданный экземпляр. Это должно быть проще в управлении, но не самое эффективное!