W tej chwili pracuję nad nowym projektem gry, który będzie składał się z front-endu React Native i zaplecza opartego na Lambdzie. Aplikacja wymaga pewnych funkcji czasu rzeczywistego, takich jak aktywne rekordy użytkowników, geofencing itp.
Patrzyłem na bazę danych czasu rzeczywistego Firebase, która wygląda na naprawdę eleganckie rozwiązanie do synchronizacji danych w czasie rzeczywistym, ale nie sądzę, aby AWS miało coś podobnego.
Trzy opcje, które przychodzą mi do głowy w przypadku „bezserwerowego” czasu rzeczywistego przy użyciu tylko usług AWS, to:
Opcja 1: AWS IoT Messaging over WebSockets
To jest dość oczywiste, zarządzane połączenie WebSockets przez IoT SDK. Myślałem o wyzwalaniu Lambd w odpowiedzi na zdarzenia przychodzące i wychodzące i po prostu używać WebSockets jako warstwy czasu rzeczywistego, budując niestandardową logikę obsługi na kliencie aplikacji, tak jak zwykle.
Wadą tego rozwiązania, przynajmniej w porównaniu z Firebase, jest to, że będę musiał sam obsługiwać dane w zdarzeniach, co doda kolejną warstwę zarządzania na szczycie WebSockets i będzie musiało zostać ujednolicone z warstwą danych API w sklepach aplikacji .
Plusy:
- Skalowalne dwukierunkowe połączenie w czasie rzeczywistym
Cons:
- Działa tylko wtedy, gdy aplikacja jest otwarta
- Należy zaimplementować strukturę wiadomości
- Zarządzanie wieloma warstwami transportowymi
Opcja 2: ponowne pobieranie wyzwalane przez push
Inną opcją jest użycie powiadomień wypychanych jako wyzwalaczy w czasie rzeczywistym, ale użycie zwykłego żądania HTTP do bramy API, aby faktycznie uzyskać zaktualizowany ładunek.
Podoba mi się to podejście, ponieważ trzyma się tylko jednej warstwy transportowej i jednego źródła prawdy dla stanu aplikacji. Będzie również wyzwalać aktualizacje, gdy aplikacja nie jest otwarta, ponieważ są to powiadomienia push.
Wadą jest to, że jest to dużo niestandardowej pracy z potencjalnie trudnymi mapowaniami między powiadomieniami push a danymi, które należy pobrać.
Plusy:
- Powiadomienia push działają nawet wtedy, gdy aplikacja jest zamknięta
- Pojedyncze źródło prawdy, warstwa transportowa
Cons:
- Najbardziej niestandardowe rozwiązanie
- Będzie obejmować znacznie więcej żądań HTTP
Opcja 3: Cognito Sync To jest dla mnie nowsza i nie jestem pewien, czy rzeczywiście można się z nim połączyć z serwera.
Cognito Sync oferuje synchronizację stanu użytkownika. na różnych urządzeniach z obsługą trybu offline i jest częścią zestawu Cognito SDK, którego i tak będę używać. Wygląda na to, że właśnie tego szukam, ale nie mogłem znaleźć żadnych rozstrzygających dowodów na to, czy można zmodyfikować lub „uruchomić” aktualizacje z AWS, a nie tylko z jednego z urządzeń.
Plusy:
- Zapewnia abstrakcyjny model danych w czasie rzeczywistym
- Połączono z rekordami użytkowników Cognito OOTB
Cons:
- Nie jestem pewien, czy można go zmodyfikować lub zaktualizować z Lambdas
Zastanawiam się, czy ktoś ma doświadczenie w pracy w czasie rzeczywistym na AWS w ramach architektury opartej na Lambdzie i czy masz opinię na temat tego, jaki jest najlepszy sposób postępowania?