Redis iwwer VPN fillt sech lues un: manner Hiwen a Gaang pro Ufro
E VPN mécht aus engem wäiten Redis-Opruff keen lokalen. Budgetéiert Hiwen a Gaang pro Ufro, benotzt Verbindungen nach eng Kéier a haalt Pipelines vun Transaktiounen ewech.
Eng Säit, déi géint en lokale Redis a 200 ms äntwert, brauch véier Sekonnen, soubal de Client hannert engem VPN sëtzt, während d'Zieler vum Server stoe bleiwen. De luese Log weist näischt iwwer eng Millisekonn, de CPU-Graf ass flaach, an d'Instanz bedéngt aner Clienten ouni Klo. Wat sech geännert huet, ass d'Distanz, a wat d'Distanz multiplizéiert, ass d'Zuel vu Mol, wou Äre Code stoppt a waart. Gitt de Wee vun der Ufro vum Client no bausse fort, an d'Léisung ass bal ëmmer manner successiv Waarden amplaz engem méi schnelle Server.
Fänkt beim Client un, net bei de Servermetriken
Beobacht de Clientprozess tëscht dem éischten an dem leschte Kommando. Wann den Trace eng Äntwert, eng Paus, dann den nächste Kommando weist, bezuelt Dir eng voll Hiwen a Gaang pro Kommando a keng Serverupassung wäert dat änneren. De luese Log ass hei dat falscht Instrument, well en d'Ausféierungszäit notéiert a Kommunikatiouns-I/O bewosst ausschléisst. En proppere luese Log niewent engem luesen Endpunkt ass d'Signatur vun engem Problem mat Hiwen a Gaang.
Mooss de Wee selwer, ier Dir Code beréiert. redis-cli -h redis.example.internal --latency schéckt widderholl PINGen a dréckt duerchschnëttlech Ufro- a Äntwertzäit, dat ass Äre Käschte pro Austausch. Multiplizéiert dat mat der Zuel vu successiven Kommandos an enger Benotzeraktioun, an Dir hutt eng Ënnergrenz fir den Endpunkt.
Zielt d'Hiwen a Gaang, déi eng Benotzeraktioun wierklech brauch
Hëlt een eenzegen Endpunkt a schreift all Redis-Opruff an der Rei op, och déi, déi an engem ORM, enger Sessiouns-Middleware oder enger Feature-Flag-Sich verstoppt sinn. Déi meeschte lues Endpunkte maachen zwanzeg oder drësseg Opruffer, wou dräi duergéife géifen, an déi verstoppte sinn normalerweis d'Majoritéit.
Eng Ofhängegkeetskette kann net zesummegesat ginn: wann den zweeten Kommando de Schlëssel brauch, deen den éischten zréckgëtt, ass d'Waarden richteg, an déi eenzeg Optiounen sinn en anere Datemodell oder eng serversäiteg Operatioun, déi de ganze Schrëtt op eemol ausdréckt. Onofhängeg Liesunge sinn en anere Fall, well näischt Iech forcéiert, op déi éischt Äntwert ze waarden, ier Dir déi zweet schéckt. Markéiert all Opruff als ofhängeg oder onofhängeg, ier Dir eppes ännert, an d'Form vun der Léisung gëtt kloer.
D'Zuel déi zielt sinn successiv Waarden, net total Kommandos. Drësseg Kommandos an engem Batch kaschten nach ëmmer eng Waard.
Batch just d'Kommandos, déi net vunenee ofhängeg sinn
Eng Pipeline stellt onofhängeg Kommandos an d'Schlaang a sammelt d'Äntwerten an der Rei, wat N Waarden zu enger mécht. Déi meeschte Clienten ubidden et als Block, Callback oder Kontextmanager amplaz vun engem separate Verbindungsmodus, also kontrolléiert d'API, déi Är installéiert Versioun liwwert. De Gewënn skaléiert mat der Hiwen-a-Gaang-Zäit, an dat ass genee firwat et op engem VPN zielt an op localhost bal net ze spieren ass.
import redis
r = redis.Redis(host="redis.example.internal", port=6379, socket_timeout=2)
pipe = r.pipeline(transaction=False)
for key in ("user:1001", "user:1002", "user:1003"):
pipe.get(key)
print(pipe.execute())
Gitt transaction=False wann Dir just batchéiere wëllt. Mat der Standard wéckelt de Client de Batch a MULTI an EXEC, wat en atomar mécht an ännert, wat aner Clienten am Fluch kënnen observéieren. Atomarität ass eng Entscheidung iwwer Richtegkeet, keen Performance-Knäppchen, an eng Pipeline ass keng Transaktioun just well béid Hiwen a Gaang reduzéieren.
Liest all Äntwert amplaz just d'Batch-Ofgab. En agereihte Kommando kann e Feeler zréckginn, während de Batch als Ganzt fäerdeg gëtt, an e Client, deen d'Äntwertlëscht ewechgeheit, mécht aus engem feelgeschloene Schreiwen e stille. Vergläicht d'Längt vun der Äntwertlëscht mat der Zuel vun de Kommandos, déi Dir agereiht hutt.
Halt d'Verbindung lieweg tëscht den Aktiounen
All nei Verbindung bezuelt Nummensafléisung, en TCP-Handshake, en TLS-Handshake an en AUTH, an iwwer e VPN ass jiddwereen dovun eng Hiwen a Gaang, déi Dir net batchéiere kënnt. Erstellt de Client eemol pro Prozess a benotzt en nach eng Kéier, oder benotzt de Pool, deen Är Bibliothéik ubitt, mat enger limitéierter Gréisst. Den erneierte Verbannen pro Ufro ass déi zweet heefegst Ursaach vun dësem Symptom no de Waarden pro Kommando.
Halt de private Hostname an der Konfiguratioun amplaz enger wuertwiertlecher Adress. D'Zertifikatsvalidéierung an d'Servisidentitéit gëllen nach ëmmer op engem private Netz, an d'Festleeë vun enger IP geet futti an deem Moment wou de Provider en Ënernetz nei numeréiert. Wann d'Afléisung den luesen Deel ass, fléckt de Resolverwee amplaz de Verbindungsstring.
Setzt en explizitten Socket-Timeout, sou datt en hänkende Tunnel séier feelt amplaz en Aarbechter ze hänken. Bestätegt dann, datt de Pool wierklech nach eng Kéier benotzt gëtt, andeems Dir d'Verbindungserstellung am Client loggt.
Dimensiounéiert de Batch, ier en e Speicherproblem gëtt
Redis hält agereiht Äntwerten fir d'Dauer vun engem Batch, an de Client hält duerno dat analyséiert Resultat. Eng Pipeline vun zéngdausend grousse Wäerter tauscht Netzwierkwaarden géint Speicherspitzen a laang Pausen op béiden Enner.
Wielt d'Batchgréisst no dem Äntwertsvolumen an net no der Zuel vun de Kommandos. E puer Honnert kleng Kommandos an engem Batch si meeschtens bequem, honnert méi-Kilobyte-Payloads awer net. Deelt no Bytes wéi och no der Zuel, a haalt all Batch bannent dem Latenz-Budget, deen den Endpunkt wierklech huet.
Mooss vun Enn zu Enn no der Ännerung: redis-cli -h redis.example.internal --latency-history weist, ob de Wee selwer stabil ass, an Ären eegene Ufro-Timer weist, ob den Endpunkt sech verbessert huet. Wann den Endpunkt nach lues ass, während d'Latenzgeschicht flaach ass, ass de Reschtkäschte Serveraarbeit oder Är eege Serialiséierung, an den nächste Schrëtt ass e Profil vum Handler amplaz nach enger Batch-Ännerung.