Можно ли использовать Socket.io с AWS Lambda?
Можно ли создать в AWS Lambda функцию, которая создает веб-сокет и отправляет данные в подписанные приложения?
Что-то вроде этого:
Джон имеет приложение SuperPhotoApp, открытое в его телефоне, но решает использовать браузер на рабочем столе для загрузки фотографии в службу SuperPhotoApp (S3 Bucket), это событие выполняет функцию Lambda, которая создает сервер socket.io и передает обновление всем подписчикам. на его телефоне было открыто приложение, поэтому приложение автоматически обновляется с новой фотографией.
Это то, что можно сделать с помощью push-уведомлений или Amazon SNS, но что, если мне нужно поведение в реальном времени, например, онлайн-игра, где мне нужно обновить положение персонажа.
Если это невозможно с Lambda, есть ли решение, где я могу обновить свое открытое приложение с помощью браузера на рабочем столе?
Amazon EC2 это единственный вариант? Я читал, что у него проблемы с масштабированием, поэтому я комментирую Lambda.
7 ответов
Я не думаю, что Lambda будет работать на случай, который вы описываете. Ссылка на форум AWS ниже указывает на то, что функция Lambda может работать не более 5 минут, и, кроме того, поскольку вы платите за 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/
Если вы планируете запустить свой сервер за балансировщиком нагрузки, похоже, у вас будет еще несколько скачков, через которые вы сможете перейти:
Недавно AWS выпустила поддержку WebSockets для сервиса IoT. Его очень легко использовать в качестве системы сообщений Pub/Sub для безсерверных веб-приложений. Вы можете публиковать новые сообщения от AWS lambda function
с помощью http post request
и получать их как сообщения веб-сокета на клиенте.
Я написал небольшой пакет npm, который обрабатывает подключение websocket к MQTT-серверу из внешнего приложения. Проверьте aws-mqtt-client
Вам следует рассмотреть возможность использования 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
Лично я предпочитаю подход, который дешевле, проще в обслуживании, лучше работает, позволяет мне спать по ночам и позволяет мне спать без перерывов, без кошмаров.
Нет! Лямбда не была разработана для socket.io. Лямбда была разработана только для кратковременной обработки.
Если вы хотите предоставлять дешевые уведомления, вы можете попробовать внешние сервисы, такие как PubNub или Realtime Framework.
Если вы хотите продолжать использовать только сервисы Amazon, не пытайтесь использовать SNS, поскольку он не подходит для этого варианта использования (для браузеров нет конечной точки).
Тем не менее, вы можете попробовать AWS IoT. Я знаю, что это звучит странно, но, поскольку он поддерживает браузеры через MQTT, это отличный инструмент для дешевых, быстрых и простых в разработке уведомлений. Перейдите по этой ссылке для хорошего учебника. Демо-код доступен здесь.
Я думаю, что вы можете комбинировать AWS Lambda с другими сервисами PUB/SUB, такими как PUBNUB https://www.pubnub.com/docs/pubnub-rest-api-documentation.
- front-end / приложение использует AWS Lambda для динамического создания и управления темами
- front-end / app получает информацию о теме из AWS Lambda или DB
- front-end / приложение присоединяется к соответствующим темам и отправляет сообщение в PUBNUB напрямую
Да, вы можете публиковать события как клиент 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
Сохраните и проверьте.
Если вы ищете функциональность в реальном времени, я бы обратился к Firebase Real Time Database или Firestore. Я использую оба довольно сильно, и я должен сказать, что они потрясающие. Проверьте это здесь https://firebase.google.com/
Вы не можете использовать Lambda для размещения сервера socketio. Но вы можете использовать лямбду для отправки событий на внешний сервер socketio