Interfejs API musi działać tak szybko, jak to możliwe, aby obsłużyć potencjalnie ogromną liczbę klientów. Skorzystaj z tych wskazówek, aby dostosować interfejsy API pod kątem maksymalnej szybkości.
Szybkie przyjęcie architektury mikrousług ugruntowało rolę interfejsów API jako podstawowego środka komunikacji we współczesnym rozwoju. Interfejsy API zapewniają wydajny sposób wymiany danych między klientami a aplikacjami po stronie serwera, a także między różnymi systemami zaplecza.
Express.js zapewnia eleganckie rozwiązanie do tworzenia interfejsów API RESTful. Konieczne jest jednak nadanie priorytetu miarom wydajności w trakcie opracowywania.
Gwarantuje to, że Twoje interfejsy API nie tylko działają skutecznie, ale także działają optymalnie. Ostatecznie dobrze działająca aplikacja internetowa zapewnia lepsze wrażenia użytkownika i większą szansę na sukces.
Optymalizacja wydajności dla interfejsów API REST Express.js
Express.js wykorzystuje asynchroniczny charakter Node.js i architekturę sterowaną zdarzeniami, aby osiągnąć wyjątkowy poziom szybkości i wydajności.
Niemniej jednak optymalizacja Express.js API REST może przynieść jeszcze większe korzyści. Obejmują one znacznie skrócony czas reakcji, zwiększoną niezawodność i zwiększoną wydajność aplikacji, co prowadzi do bezproblemowego i wciągającego środowiska użytkownika.
Priorytetowe traktowanie wydajności interfejsów API toruje drogę do sukcesu całego oprogramowania.
Oto kilka wskazówek, których możesz użyć, aby zwiększyć wydajność interfejsów API REST.
1. Zoptymalizuj zapytania do bazy danych
Wydajne pobieranie danych z bazy danych i manipulowanie nimi może znacząco wpłynąć na wydajność interfejsów API REST.
Optymalizując zapytania do baz danych, można znacznie skrócić czas wykonywania zapytań i zmniejszyć zużycie zasobów. Ostatecznie zwiększy to wydajność całej aplikacji Express.js.
Oto kilka pomocnych wskazówek dotyczących optymalizacji zapytań do bazy danych.
- Używać indeksy bazy danych. Zidentyfikuj często używane kolumny w zapytaniach i utwórz odpowiednie indeksy dla tych kolumn. Pozwala to silnikowi bazy danych na szybkie zlokalizowanie i pobranie wymaganych danych, co skutkuje szybszym wykonaniem zapytania.
- Zaimplementuj paginację. W przypadku dużych zbiorów danych należy stosować paginację. Zamiast pobierać wszystkie dane na raz, ogranicz ilość danych zwracanych w każdym zapytaniu.
- Unikaj zbędnych zapytań. Przeanalizuj swój kod, zidentyfikuj i pomiń zbędne zapytania. Odpowiednia refaktoryzacja zapytań może prowadzić do znacznej poprawy wydajności.
2. Używaj buforowania w całej aplikacji
Buforowanie to technika używana do przechowywania często używanych danych w pamięci podręcznej, tymczasowym systemie przechowywania. Mówiąc najprościej, gdy klient żąda danych, serwer najpierw sprawdza swoją pamięć podręczną zamiast bezpośrednio odpytywać bazę danych.
Jeśli znajdzie żądane dane w pamięci podręcznej, natychmiast je zwraca, omijając konieczność dalszego przetwarzania lub faktycznego dostępu do bazy danych. To znacznie poprawia wydajność interfejsów API, skracając czas odpowiedzi i minimalizując obciążenie aplikacji, zwłaszcza podczas przetwarzania wielu zapytań.
Oto prosty przykład kodu pokazujący, jak zaimplementować buforowanie.
konst ekspres = wymagać('wyrazić');
konst Pamięć podręczna węzłów = wymagać(„pamięć podręczna węzłów”);konst pamięć podręczna = nowy NodeCache();
konst aplikacja = ekspres();aplikacja.pobierz('/api/dane', (wymaganie, res) => {
konst klucz pamięci podręcznej = 'dane';
konst cachedData = cache.get (cacheKey);
Jeśli (!dane w pamięci podręcznej) {
konst pobrane dane = pobierz dane z bazy danych ();
cache.set (cacheKey, pobrane dane);
buforowane dane = pobrane dane;
}res.json (dane z pamięci podręcznej);
});
funkcjonowaćPobierz dane z bazy danych() {
//... logika pobierania danych idzie tutaj ...
powrót dane;
}
Powyższy kod ilustruje działanie buforowania przy użyciu biblioteki node-cache. Początkowo sprawdza, czy żądane dane są już przechowywane w pamięci podręcznej. Jeśli danych nie ma, uruchamia funkcję pobierania danych z bazy danych, a następnie przechowuje pobrane dane w pamięci podręcznej. Na koniec zwraca żądane dane do klienta jako odpowiedź JSON.
3. Włącz kompresję HTTP
Kompresja HTTP to technika, której można użyć do zmniejszenia rozmiaru danych przesyłanych między klientem a serwerem. Polega na kompresji odpowiedzi API po stronie serwera i dekompresji ich po stronie klienta.
Włączając kompresję HTTP, można znacznie zmniejszyć rozmiar ładunków odpowiedzi, co prowadzi do skrócenia czasu odpowiedzi.
Oto przykład kodu, który pokazuje, jak włączyć kompresję HTTP przy użyciu kompresja oprogramowanie pośrednie.
ekspres = wymagać('wyrazić');
konst kompresja = wymagać('kompresja');konst aplikacja = ekspres();
app.use (compression());
aplikacja.pobierz('/api/dane', (wymaganie, res) => {
// Zajmij się logiką API
});
Ten fragment kodu używa oprogramowania pośredniczącego do kompresji odpowiedzi interfejsu API przed zwróceniem ich do klienta.
4. Zaimplementuj przetwarzanie równoległe za pomocą Promise.all
Przetwarzanie równoległe za pomocą Obietnica.wszystko Metoda to technika używana do poprawy wydajności interfejsów API poprzez jednoczesne wykonywanie wielu zadań asynchronicznych.
Wykorzystując moc obietnic JavaScript, Promise.all umożliwia jednoczesne wykonanie zbioru obietnic, zamiast czekać, aż każda obietnica zostanie rozwiązana po kolei.
Ta technika jest szczególnie przydatna, gdy masz niezależne zadania, które można wykonywać jednocześnie, takie jak wysyłanie wielu powiązanych żądań interfejsu API do różnych punktów końcowych. Wykonując te zadania równolegle, możesz znacznie skrócić ogólny czas wykonywania i poprawić responsywność interfejsu API.
Oto prosty przykład kodu pokazujący, jak zaimplementować przetwarzanie równoległe przy użyciu Promise.all.
konst ekspres = wymagać('wyrazić');
konst osie = wymagać(„osi”);konst aplikacja = ekspres();
aplikacja.pobierz('/api/dane', asynchroniczny (wymaganie, res) => {
próbować {
konst żądanie1 = axios.get(' https://api.example.com/endpoint1');
konst żądanie2 = axios.get(' https://api.example.com/endpoint2');
konst żądanie3 = axios.get(' https://api.example.com/endpoint3');konst [odpowiedź1, odpowiedź2, odpowiedź3] = czekać naObietnica.Wszystko([
prośba1,
prośba2,
prośba 3
]);
// Przetwórz odpowiedzi zgodnie z potrzebami
} złapać (błąd) {
res.status(500.json({ błąd: 'błąd' });
}
});
W tym przykładzie kod wysyła żądania API do trzech różnych punktów końcowych. Używając funkcji Promise.all, przekazując tablicę obietnic, kod czeka na zakończenie wszystkich przed zwróceniem odpowiedzi w tablicy.
Po otrzymaniu wszystkich odpowiedzi możesz je przetworzyć zgodnie z wymaganiami. Należy jednak uważać z tym podejściem i unikać nadmiernego użycia, ponieważ może to spowodować przeciążenie serwera, powodując wąskie gardła odpowiedzi interfejsu API.
5. Użyj puli połączeń z bazą danych
Pule połączeń z bazami danych to metoda polegająca na tworzeniu puli połączeń z bazami danych wielokrotnego użytku w celu wydajnej obsługi wielu żądań klientów.
Zamiast nawiązywać nowe połączenie dla każdego żądania, aplikacja ponownie wykorzystuje istniejące połączenia z puli, zmniejszając narzut związany z nawiązywaniem nowych połączeń, co skutkuje szybszym i wydajniejszym zapytaniem wykonanie.
Oto krótki przykład kodu pokazujący, jak używać puli połączeń z bazą danych Mongoose w aplikacji Express.js.
konst mangusta = wymagać('mangusta');
konst { połączenie } = wymagać('mangusta');konst opcje połączenia = {
rozmiar basenu: 10,
useNewUrlParser: PRAWDA,
użyj ujednoliconej topologii: PRAWDA
};
mangusta.połącz('mongodb://localhost/mydatabase', opcje połączenia);
W tym przykładzie właściwość rozmiaru puli połączeń jest ustawiona na 10 — określa to maksymalną liczbę połączeń w puli.
Dzięki tej konfiguracji interfejs API może ponownie wykorzystywać połączenia, co skutkuje lepszą wydajnością interfejsu API dzięki zmniejszeniu narzutu związanego z nawiązywaniem nowych połączeń dla każdego żądania.
Priorytetyzacja wydajności API dla zysku
Istnieje kilka kroków, które możesz wykonać, aby zoptymalizować wydajność interfejsów API Express.js. API odtwarzają kluczową rolę, dlatego ważne jest, aby skupić się na ich działaniu, aby zagwarantować ogólny sukces oprogramowanie.