sql >> Database >  >> NoSQL >> Redis

JSON-objecten cachen aan serverzijde

Je zou memcached kunnen gebruiken, maar nogmaals, iedereen zou je databaseserver raken. In uw geval zegt u dat de resultaten van de zoekopdracht een beetje persistent zijn dus het kan logischer zijn om de JSON-reacties van uw webservice in de cache te bewaren.

Dit kan worden gedaan met behulp van een Reverse Proxy met een ingebouwde cache. Ik denk dat een voorbeeld je het meest kan helpen hoe we het doen met Jetty (Java) en NGINX:

In onze opstelling hebben we een Jetty (Java) instantie die een API voor onze mobiele clients bedient. De API luistert op localhost:8080/api en retourneert JSON-resultaten die zijn opgehaald uit enkele zoekopdrachten in een lokale Mysql-database.

Op dit moment kunnen we de API rechtstreeks aan onze klanten aanbieden, maar hier komt de Reverse Proxy:

Voor de API zit een NGINX-webserver die luistert vanaf 0.0.0.0:80/ (overal, poort 80) Wanneer een mobiele client verbinding maakt met 0.0.0.0:80/api, probeert de ingebouwde Reverse Proxy de exacte queryreeks op te halen van het is cache. Als dit niet lukt, haalt het het op van localhost:8080/api, plaatst het in zijn cache en serveert de nieuwe waarde die in de cache is gevonden.

Voordelen:

  • Je kunt andere NGINX-goodies gebruiken:automatische GZIP-compressie van de in de cache opgeslagen JSON-bestanden
  • SSL-eindpuntbeëindiging bij NGINX.
  • NGINX-werknemers kunnen u ten goede komen, wanneer u veel meer verbindingen heeft, alle gegevens uit de cache opvragen.
  • U kunt uw service-eindpunten consolideren

Denk aan cache-invalidatie:

Je moet nadenken over cache-invalidation. Je kunt NGINX vertellen om zijn cache bijvoorbeeld een week vast te houden voor alle HTTP 200-verzoeken voor localhost:8080/api, of 1 minuut voor alle andere HTTP-statuscodes. Maar als er een moment komt waarop u de API binnen een week wilt bijwerken, is de cache ongeldig, dus u moet deze op de een of andere manier verwijderen of de cachetijd verlagen tot een uur of dag (zodat de meeste mensen de cache).

Dit is wat we doen:we hebben ervoor gekozen om de cache te verwijderen als deze vuil is. We hebben een andere JOB op de server die luistert naar een Update-API-gebeurtenis geactiveerd via Puppet. De JOB zorgt voor het wissen van de NGINX-cache voor ons.

Een ander idee zou zijn om de functie voor het wissen van de cache toe te voegen aan uw webservice. De reden waarom we deze oplossing niet hebben gekozen is:de webservice zou moeten weten dat deze achter een reverse proxy draait, wat de scheiding van zorgen doorbreekt. Maar ik zou zeggen, het hangt af van wat je van plan bent.

Nog iets dat uw webservice juist zou maken zou zijn om bij elk JSON-bestand de juiste ETAG- en cache-expires-headers weer te geven. Nogmaals, dat hebben we niet gedaan, omdat we één grote update-gebeurtenis hebben, in plaats van kleine voor elk bestand.

Kanttekeningen:

  • Je hoeft NGINX niet te gebruiken, maar het is heel eenvoudig te configureren
  • NGINX en Apache hebben SSL-ondersteuning
  • Er is ook de beroemde Reverse Proxy (https://www.varnish-cache.org), maar voor zover ik weet doet deze (nog?) geen SSL

Dus als je Varnish zou gebruiken voor je Web Service + SSL, dan zou je een configuratie gebruiken zoals:NGINX -> Varnish -> Web Service.

Referenties:- NGINX-server:http://nginx.com- Varnish Reverse Proxy:https://www.varnish-cache.org- Puppet IT-automatisering:https://puppetlabs.com- NGINX reverse proxy-tutorial:http:/ /www.cyberciti.biz/faq/howto-linux-unix-setup-nginx-ssl-proxy/ http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html




  1. Mongo-time-out instellen in Spring Boot

  2. Memcached installeren op Debian 9

  3. Query MongoDB met $and en Multiple $or

  4. waarom kan ik de mongodb niet starten?