Я использую локальное приложение Windows и хочу знать, когда это приложение находится в автономном режиме (не позднее, чем через одну минуту).
Я думал создать API-шлюз с именем HeartbeatControllerAPI, и этот API будет вызывать лямбду, которая, в свою очередь, будет устанавливать последнее сердцебиение приложения в таблице Dynamodb под названием «Heartbeats», которая выглядит так:
Имя машины | Последнее сердцебиение
2:00 утра
Б 2:10 утра
С 2:05 утра
Поэтому, если у меня есть 3 машины следующим образом:
Машина 1 — с установленным приложением.
Машина 2 - с установленным приложением.
Машина 3 - с установленным приложением.
Затем я подумал, что каждую минуту все машины будут выполнять работу, как я описал выше, и тогда я смогу узнать, какая машина находится в автономном режиме / в сети.
Является ли этот метод правильным? Я беспокоюсь (с точки зрения биллинга и перегрузки), что произойдет, если у меня будет 1 миллион таких машин, тогда как каждую минуту все они будут получать доступ к шлюзу API и обновлять таблицу Dynamodb.





Как правило, сердцебиение — это наоборот, когда в вашем случае вы должны сделать что-то вроде запуска Lambda событием CloudWatch (событие cron, запускаемое каждые X минут), и эта Lambda будет вызывать ваши машины и подтверждать, что они работают и Бег. Таким образом, вашим машинам остается выполнять свою задачу, а ваша функция сердцебиения (лямбда) будет подтверждать, что они работают каждые X минут.
Это также будет означать, что вам нужна только одна лямбда для множества машин (в зависимости от производительности можно увеличить количество лямбд, если вы достигнете примерно 50 машин).
Поэтому, если вы будете следовать этому подходу, ваша Lambda будет запущена событием CloudWatch cron, проверьте, работают ли машины, а затем для каждой машины, если они работают, обновите таблицу со статусом, и если они не работают, вы могли бы, возможно, отправьте сообщение в тему SNS (и подпишитесь на эту тему), чтобы вы могли получать уведомления о том, что машина не работает (это также намного сложнее, если звонит машина, потому что, если она не работает, тогда вам нужно сканировать таблицу на время последнего обновления, это может стать дорогостоящим и неэффективным).
Да, либо сохраните их общедоступный IP-адрес (возможно, с помощью хранилища параметров SSM), либо откройте порт, через который они будут доступны для статуса.
Deiv, таким образом, пытаясь получить доступ к локальному компьютеру с сервера по IP, у меня могут быть проблемы с маршрутизатором. Не слишком ли это сложно? Я могу преодолеть брандмауэр, но маршрутизатор может доставить некоторые проблемы.
Хм, в этом случае ваш подход может быть единственным способом... дайте подумать. Итак, в этом сценарии я бы сделал прокси-сервер API-шлюза для dynamodb, сопоставил запрос так, чтобы его вызов обновлял таблицу с отметкой времени. Таким образом, у вас могут быть сотни машин, вызывающих этот API, и вы не вызываете никаких дополнительных лямбда-выражений. Затем у вас может быть Lambda на основе таймера, которая сканирует таблицу и ищет машины, которые не обновлялись в течение последних X минут, а затем вы знаете, что что-то не так, и отправляете предупреждение.
Я думал об этом, но это хорошо для сотен, я не уверен, насколько это хорошо для миллионов. Я нашел статью о реализации лямбда-выражений как Websocket вместо простого REST. Это может решить проблему. Каждая машина может отправить запрос на подключение к лямбде, идентификатор подключения сохраняется в базе данных Dynamo, а затем я могу отправлять сообщения клиентам с этими идентификаторами подключения. Что Вы думаете об этом?
Я думаю, что если вы говорите о миллионах, вы определенно хотите избежать использования Lambda в качестве посредника, потому что вы получите миллионы ненужных вызовов. Наличие лямбды хорошо для сотен, но прокси напрямую к dybamodb хорош для любого числа, так как между ними нет лямбды :)
Отлично, поэтому я пойду с лямбдой в качестве веб-сокета и посмотрю, как она подходит. Спасибо
Спасибо большое, я вас понимаю кроме одной детали. Как я могу узнать из функции Lambda, работающей через cron, если машина запущена и работает и подключена к Интернету. Вы имеете в виду, что я должен сохранить общедоступный IP-адрес этих компьютеров и попытаться проверить связь с сервером, чтобы проверить, работают ли они?