Я пытаюсь повысить производительность своего решения AWS для серверной части мобильного приложения.
Я использую API WebSocket, который интегрирован с лямбдами для маршрутов $ connect, $ disconnect и $ default. Первоначально лямбда-данные брали данные из DynamoDB, но затем я решил использовать ElastiCache с Redis (EC) для некоторого набора таких данных, и я также решил хранить идентификаторы соединений WebSocket в этом EC.
Первая ловушка, с которой я столкнулся, это то, что EC находится в VPC, и мне нужно было подключить свои Lambdas к этому VPC. Затем я назначил VPC для лямбд и добавил использование Redis-клиента из этих лямбд. Здесь я столкнулся с проблемой, что эти лямбды (с назначенным VPC) не могут использовать ApiGatewayManagementApi#postToConnection
- такие вызовы начали возвращать Forbidden
.
Я думаю, это потому, что мои вызовы стали походить на вызовы внешнего API и, следовательно, стали требовать аутентификации (в моем случае IAM), или этот API стал недоступным из VPC. В обоих случаях я понял, что решение этой проблемы потребует слишком много дополнительных усилий, и я решил использовать дополнительную лямбду.
![enter image description here](https://i.stack.imgur.com/OpSoN.png)
Итак, я создал отдельную лямбду, назначенную тому же VPC с EC. А для лямбда-API - я удалил связь VPC и добавил вызовы для лямбда-EC, как это:
LAMBDA.invoke({
FunctionName: 'dataCache',
Payload: JSON.stringify(data)
},
(e,d)=>{
if (e) {
callback(e);
}
else {
callback(null, JSON.parse(d.Payload));
}
}
);
Таким образом, таким образом, у меня есть лямбды конечных точек API, которых нет в VPC, и я делаю вызовы в EC через лямбду, которая находится в том же VPC с EC.
Системы работают, но я сталкиваюсь с очень большой задержкой при первом подключении клиента - это более 15-20 секунд !! Появляется не всегда, но через некоторое время, если ни один клиент не подключен.
Я думаю, что создал здесь несколько громоздкую архитектуру и понимаю, что проблемы возникают из-за использования VPC. Мне просто не нравилось задействовать дополнительную функциональность, такую как NAT, или вообще перенести API в VPC.
Все части системы находятся в одном регионе AWS us-east-1, хотя я нахожусь в Украине.
Кто-нибудь может подсказать, как разрешить это дело?