Подтвердить что ты не робот

Можно ли использовать Socket.io с AWS Lambda?

Возможно ли построить функцию в AWS Lambda, которая создает веб-узел и отправляет данные в подписанные приложения?

Что-то вроде этого:

У Джона есть приложение SuperPhotoApp, открытое в его телефоне, но решает использовать браузер рабочего стола для загрузки фотографии в службу SuperPhotoApp (ведро S3), это событие выполняет функцию Lambda, которая создает сервер socket.io и выталкивает обновление для всех подписчиков его телефон открыл приложение, чтобы приложение автоматически обновлялось с новой фотографией.

Это то, что можно сделать с помощью push-уведомлений или Amazon SNS, но что, если мне нужно поведение в реальном времени, например, онлайн-игра, в которой мне нужно обновить положение персонажа.

Если это невозможно с Lambda, есть ли какое-либо решение, в котором я могу обновить свое открытое приложение с помощью браузера для рабочего стола?

Amazon EC2 - единственный вариант? Я читал, что у него проблемы с масштабированием, поэтому я комментирую Lambda.

4b9b3361

Ответ 1

Я не думаю, что Lambda будет работать для случая, который вы описали здесь. Ссылка на форум AWS ниже указывает на то, что функция Lambda может работать не более 15 минут, и, кроме того, поскольку вы платите за 100 мс времени выполнения функции, это, вероятно, будет чрезмерно затратным. Есть комментарий от Amazon о том, что они слышали запрос несколько раз, поэтому заинтересованы в том, чтобы это можно было учесть.

https://forums.aws.amazon.com/thread.jspa?threadID=205761

Вот сообщение от кого-то, кто, кажется, имеет большой успех, используя EC2 и NodeJS, но ему пришлось использовать альтернативу Socket.io, названную Websockets/ws.

http://www.jayway.com/2015/04/13/600k-concurrent-websocket-connections-on-aws-using-node-js/

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

https://web.archive.org/web/20160118124227/http://coding-ceo.ghost.io/how-to-run-socket-io-behind-elb-on-aws

Ответ 2

Недавно AWS выпустила поддержку сервиса WebSockets для IoT. Он очень прост в использовании в качестве системы сообщений Pub/Sub для серверных веб-приложений. Вы можете отправлять новые сообщения из AWS lambda function через http post request и получать их в виде сообщений websocket на клиенте.

Я написал небольшой пакет npm, который обрабатывает соединение с веб-сервером с сервером MQTT из внешнего приложения. Проверьте aws-mqtt-client

Ответ 3

Нет! Лямбда не была разработана для socket.io. Лямбда была разработана только для кратковременной обработки.

Если вы хотите предоставлять дешевые уведомления, вы можете попробовать внешние сервисы, такие как PubNub или Realtime Framework.

Если вы хотите продолжать использовать только сервисы Amazon, не пытайтесь использовать SNS, потому что он не подходит для этого варианта использования (для браузеров нет конечной точки).

Однако вы можете попробовать AWS IoT. Я знаю, что это звучит странно, но, поскольку он поддерживает браузеры через MQTT, это отличный инструмент для дешевых, быстрых и простых в разработке уведомлений. Перейдите по этой ссылке для хорошего учебника. Демо-код доступен здесь.

Ответ 4

Обновление (с момента выпуска AWS 2018 года): теперь API-шлюз поддерживает веб-сокеты! Посмотрите примеры, которые используют веб-сокеты API Gateway с Lambda здесь:

и документацию по этой функции API Gateway здесь: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html.

Есть также интересный пример инфраструктуры Node.js, которая использует socket.io с API Gateway, но я не исследовал, будет ли он работать конкретно для вашего случая использования: https://github.com/tiaod/moleculer-io


Вы должны рассмотреть возможность использования Amazon IoT Core. Я объясню.

Если у вас есть ситуация в реальном времени, когда вам нужно выполнить вычисления или использовать аналитику в потоке в реальном времени, вам нужно подумать о потоковой передаче событий (которые отражают изменения состояния в реальном времени) на платформу, предназначенную для быстрой потоковая передача событий высокой доступности, такая как реализация Kafka, такая как AWS Kinesis. Затем вы можете использовать поток событий из инструмента, предназначенного для потоковой аналитики в реальном времени, такого как Kinesis Analytics, Apache Spark или Apache Storm.

Затем вы можете использовать потоковую аналитику (и, возможно, также дополнительные данные, предоставляемые событиями), используя AWS Lambda (которая может быть вызвана событиями, проходящими через ваш конвейер Kinesis), чтобы отправлять обновления всем подписчикам. Вы можете отправлять обновления в реальном времени этим подписчикам, если они подключены через сервис Amazon IoT Core, особенно если вы создаете "тему" для каждого пользователя. Служба разработана таким образом, чтобы у вас не было верхнего предела количества тем, которые вы можете иметь, поэтому она должна масштабироваться эластично.

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

Вы даже можете отправлять события прямо в браузер клиента с помощью веб-сокетов через MQTT (что очень быстро и легко), если вы используете сервис Amazon IoT Core и можете напрямую интегрировать его с AWS Lambda. Здесь есть отличное демо-приложение, которое использует IoT Core: https://github.com/aws-samples/aws-iot-chat-example

Лично я предпочитаю подход, который дешевле, проще в обслуживании, работает лучше, позволяет мне спать по ночам и позволяет мне спать спокойно, без кошмаров.

Ответ 5

Я думаю, вы можете комбинировать AWS Lambda с другим сервисом PUB/SUB, например PUBNUB https://www.pubnub.com/docs/pubnub-rest-api-documentation.

  • front-end/app использовать AWS Lambda для динамического создания и управления темами
  • front-end/app получить информацию о теме от AWS Lambda или DB
  • front-end/app присоединяется к соответствующим темам и напрямую посылает сообщение PUBNUB

Ответ 6

Если вы ищете функциональность в реальном времени, я бы обратился к Firebase Real Time Database или Firestore. Я использую оба довольно сильно, и я должен сказать, что они потрясающие. Посмотрите здесь https://firebase.google.com

Ответ 7

Да, вы можете публиковать события в качестве клиента socket.io на сервере socket.io с помощью AWS Lambda.

Шаги для реализации:

  • Создайте приложение узла локально и выполните npm install socket.io-client --save в папке проекта.
  • Реализуйте код обработчика в index.js. Вот пример:

    exports.handler = async (событие) => {

    var io = require('socket.io-client');
    var socket = io.connect("http://example.com:9999");
    let payload = { "id": "1" };
    socket.emit("MyEvent", payload);
    return 'Sent message!';
    

    };

  • Создайте zip файл папки.

  • В AWS Lambda выберите Загрузить файл .Zip
  • Убедитесь, что после загрузки файлов структура файла выглядит примерно так:

проект
-node_modules
-index.json
-package -lock.json
-package.json

Сохраните и проверьте.

Ответ 8

Вы не можете использовать Lambda для размещения сервера socketio. Но вы можете использовать лямбду для отправки событий на внешний сервер socketio