Поддерживает ли движок приложений Google повторную публикацию и подписку - PullRequest
0 голосов
/ 09 июля 2019

Будет заново публиковать и подписывать работу на движке приложений Google (гибкая среда).

Я использую node.js

Причина этого вопроса, я понимаю, websockets / realtime не поддерживается наGAE.

1 Ответ

1 голос
/ 09 июля 2019

Вы можете подключить свой экземпляр 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');

Примечания:

  1. Чтобы попробовать это, вы должны отправить сообщения через GET-параметры в URL (параметр с именем «message»).

  2. Помните, что GAE обычно распределяет запросы равномерно между доступными экземплярами, поэтому не все запросы от одного и того же пользователя будут отправляться в один и тот же экземпляр, однако, поскольку клиент будет подключаться напрямую к клиенту redis, это не будет иметь значения пока он остается в режиме ожидания и прослушивает входящие сообщения (это будет зависеть от того, как вы реализуете логику вашего приложения).

  3. Если вам необходимо установить постоянное соединение между вашим сервером и клиентом, попробуйте использовать поддерживаемые 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, вот пример о том, как этого добиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...