Вы можете подключить свой экземпляр redis к своему экземпляру приложения Google App Engine Flex, вам просто нужно знать, что оба они должны находиться в одном регионе и иметь одну и ту же сеть с авторизованным доступом. Вы можете выполнить пошаговое руководство по документации , чтобы добиться этого.
Я опишу здесь общие шаги:
1 .- Создать экземпляр Redis. Запишите зону, IP-адрес и порт экземпляра Redis.
2 .- Создайте приложение сервера HTTP, которое устанавливает соединение с экземпляром Redis из экземпляра гибкой среды App Engine в том же регионе, что и экземпляр Redis. Ваш app.yaml будет выглядеть примерно так:
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 3
# update with Redis instance host IP, port
env_variables:
REDISHOST: redis-ip
REDISPORT: 6379
# update with Redis instance network name
network:
name: default
3 .- Разверните ваше приложение, используя gcloud app deploy
.
Я попробовал поведение Redis Pub / sub в GAE Flex с Nodejs и сработало для меня следующее:
на стороне сервера :
'use strict';
const redis = require('redis');
const http = require('http');
const nconf = require('nconf');
const express = require('express');
const app = express();
// Read in keys and secrets. Using nconf use can set secrets via
// environment variables, command-line arguments, or a keys.json file.
nconf.argv().env().file('keys.json');
// Connect to a redis server provisioned over at
// Redis Labs. See the README for more info.
const pub = redis.createClient(
nconf.get('redisPort') || '6379',
nconf.get('redisHost') || '127.0.0.1',
{
'auth_pass': nconf.get('redisKey'),
'return_buffers': true
}
).on('error', (err) => console.error('ERR:REDIS:', err));
app.get('/', (req, res) => {
// subscribe to the publisher
// publisher publish a message and exit
pub.publish('notification', '{\'message\': '+req.query.message +'}', function(){
res.send('message sent:'+ req.query.message);
});
});
const server = app.listen(8080, () => {
const host = server.address().address;
const port = server.address().port;
console.log(`Example app listening at http://${host}:${port}`);
});
key.json выглядит примерно так (я использовал redislab для создания экземпляра redis):
{
"redisHost": "redis-23123.c124.us-central1-1.gce.cloud.redislabs.com",
"redisPort": 99999,
"redisKey": "random-bunch-of-letters-for-password"
}
На стороне клиента :
'use strict';
const redis = require('redis');
const nconf = require('nconf');
nconf.argv().env().file('keys.json');
const sub = redis.createClient(
nconf.get('redisPort') || '6379',
nconf.get('redisHost') || '127.0.0.1',
{
'auth_pass': nconf.get('redisKey'),
'return_buffers': true
}
).on('error', (err) => console.error('ERR:REDIS:', err));
sub.on('message', function (channel, message) {
console.log('Message: ' + message + ' on channel: ' + channel + ' is arrive!');
});
sub.subscribe('notification');
Примечания:
Чтобы попробовать это, вы должны отправить сообщения через GET-параметры в URL (параметр с именем «message»).
Помните, что GAE обычно распределяет запросы равномерно между доступными экземплярами, поэтому не все запросы от одного и того же пользователя будут отправляться в один и тот же экземпляр, однако, поскольку клиент будет подключаться напрямую к клиенту redis, это не будет иметь значения пока он остается в режиме ожидания и прослушивает входящие сообщения (это будет зависеть от того, как вы реализуете логику вашего приложения).
Если вам необходимо установить постоянное соединение между вашим сервером и клиентом, попробуйте использовать поддерживаемые Websockets . Если вы используете что-то вроде «socket.io», которое возвращается к http long polling , есть функция Beta , называемая Session affinity , которая позволяет отправлять запросы по один и тот же пользователь к тому же экземпляру.
Чтобы активировать Session affinity, используйте это в своем app.yaml (куки должны быть включены на всех клиентах):
network:
session_affinity: true
Имейте в виду, что документация предупреждает:
Приложения App Engine всегда должны быть терпимы к схожести сеанса
прерывания, особенно потому, что все экземпляры App Engine
периодически перезагружается. Включение соответствия сеанса также может ограничивать
Эффективность алгоритмов балансировки нагрузки App Engine и может привести к
ваш экземпляр перегружен.
Вы также можете использовать Google Cloud Pub / Sub и управлять всем из своего приложения, используя клиентскую библиотеку Google Cloud, вот пример о том, как этого добиться.