Programmering

Hvordan bruke Redis til måleprogrammer i sanntid

Roshan Kumar er senior produktsjef i Redis Labs.

Måling er ikke bare et enkelt telleproblem. Måling forveksles ofte med måling, men det er vanligvis mer enn det. Måling innebærer måling, men som en pågående prosess, vanligvis med målet å regulere bruken eller strømmen av en ressurs over tid. Moderne applikasjoner inkluderer måling på mange forskjellige måter, alt fra å telle mennesker, objekter eller hendelser til å regulere bruken, kontrollere tilgang og tildele kapasitet.

Målerløsninger må generelt behandle store datamengder mens de oppfyller strenge ytelseskrav. Avhengig av løsningens omfang, kan telling og måling involvere tusenvis om ikke millioner av oppdateringer til en database hvert sekund. De primære kravene til en database for å støtte en slik løsning er høy gjennomstrømning for skriveoperasjoner og lav ventetid (under millisekund) for svar.

Redis, åpen kildekode-minne-databaseplattform, gir begge disse fordelene, samtidig som det er kostnadseffektivt når det gjelder å bruke minimale maskinvareressurser. I denne artikkelen vil vi undersøke visse funksjoner i Redis som gjør det til et godt valg for målerløsninger, og hvordan vi kan bruke Redis til det formålet. Men først, la oss se på noen av de vanligste bruksområdene med måling.

Vanlige måleprogrammer

Måling er nødvendig i alle applikasjoner som måler bruken av en ressurs over tid. Her er fire vanlige scenarier:

  1. Forbruksbaserte prismodeller. I motsetning til engangs- eller abonnementsbaserte betalingsmodeller tillater forbruksbaserte prismodeller forbrukere å betale bare for faktisk bruk. Forbrukere har større fleksibilitet, frihet og kostnadsbesparelser mens leverandører får større forbrukerretensjon.

    Å implementere slike modeller kan være vanskelig. Noen ganger målesystemet må spore mange brukselementer og mange beregninger i en enkelt plan. For eksempel kan en skyleverandør angi forskjellige prisnivåer for CPU-sykluser, lagring, gjennomstrømning, antall noder eller hvor lang tid en tjeneste brukes. Et telekommunikasjonsselskap kan angi forskjellige nivåer av tillatt forbruk i minutter, data eller tekst. Målerløsningen må håndheve capping, lading eller utvide tjenester avhengig av typen forbruksbasert pris.

  2. Begrensning av ressursutnyttelse. Hver tjeneste på Internett kan misbrukes ved overdreven bruk, med mindre denne tjenesten er begrenset. Populære tjenester som Google AdWords API og Twitter Stream API inneholder takstgrenser av denne grunn. Noen ekstreme tilfeller av misbruk fører til nektelse av tjeneste (DoS). For å forhindre misbruk må tjenester og løsninger som er tilgjengelige på Internett utformes med riktige hastighetsbegrensende regler. Selv enkle autentiserings- og påloggingssider må begrense antall forsøk i et gitt tidsintervall.

    Et annet eksempel der begrensning av ressursutnyttelse blir nødvendig, er når endrede forretningskrav legger større belastning på eldre systemer enn de kan støtte. Takstbegrensende samtaler til eldre systemer gjør det mulig for bedrifter å tilpasse seg den økende etterspørselen uten å måtte erstatte sine eldre systemer.

    I tillegg til å forhindre misbruk og redusere belastning, hjelper god hastighetsbegrensning også med håndteringen av tøffe trafikkscenarier. For eksempel kan et API som håndhever en hastighetsbegrensende metode for brute force tillate 1000 samtaler hver time. Uten en trafikkformende policy på plass, kan en klient ringe API 1000 ganger i løpet av de første sekundene av hver time, kanskje overstige det infrastrukturen kan støtte. Populære hastighetsbegrensende algoritmer som Token Bucket og Leaky Bucket forhindrer utbrudd ved ikke bare å begrense samtalene, men også distribuere dem over tid.

  3. Ressursfordeling. Trengsel og forsinkelser er vanlige scenarier i applikasjoner som håndterer pakkeruting, jobbadministrasjon, trafikkbelastning, mengdekontroll, sosiale meldinger, datainnsamling og så videre. Kømodeller tilbyr flere alternativer for å administrere køstørrelsen basert på ankomst- og avgangshastigheten, men det er ikke enkelt å implementere disse modellene i stor skala.

    Etterslep og overbelastning er konstant bekymring når du arbeider med raske datastrømmer. Smarte designere må definere akseptable kølengdsgrenser, mens de inkluderer både overvåking av køytelse og dynamisk ruting basert på køstørrelser.

  4. Teller i stor skala for beslutningstaking i sanntid. Netthandelssider, spillapplikasjoner, sosiale medier og mobilapper tiltrekker seg millioner av daglige brukere. Fordi flere øyeepler gir større inntekter, er det viktig for virksomheten å telle besøkende og deres handlinger nøyaktig. Telling er like nyttig for brukstilfeller som feilsøking, problemopptrapping, DDoS-angrepsforebygging, trafikkprofilering, ressursallokering etter behov og svindelreduksjon.

Måling design utfordringer

Løsningsarkitekter må vurdere mange parametere når de bygger en måleapplikasjon, og starter med disse fire:

  1. Designkompleksitet. Å telle, spore og regulere datamengder - spesielt når de kommer med høy hastighet - er en skremmende oppgave. Løsningsarkitekter kan håndtere måling ved applikasjonslaget ved hjelp av programmeringsspråkstrukturer. Imidlertid er en slik design ikke motstandsdyktig mot feil eller datatap. Tradisjonelle diskbaserte databaser er robuste, og lover en høy grad av holdbarhet under feil. Men ikke bare gir de ikke den nødvendige ytelsen, de øker også kompleksiteten uten riktige datastrukturer og verktøy for å implementere måling.
  2. Ventetid. Måling innebærer vanligvis mange, konstante oppdateringer av tellinger. Nettverks- og diskens lese- / skrivelatens legger seg opp mens du arbeider med store tall. Dette kan snøball i å bygge opp et enormt etterslep med data som fører til flere forsinkelser. Den andre kilden til ventetid er et programdesign som laster inn måledata fra en database til programmets hovedminne, og skriver tilbake til databasen når du er ferdig med å oppdatere telleren.
  3. Samtidighet og konsistens. Arkitektur av en løsning for å telle millioner og milliarder av ting kan bli komplisert når hendelser blir fanget i forskjellige regioner, og de trenger alle å samles på ett sted. Datakonsistens blir et problem hvis mange prosesser eller tråder oppdaterer det samme antallet samtidig. Låsingsteknikker unngår konsistensproblemer og gir konsistens på transaksjonsnivå, men reduserer løsningen.
  4. Varighet. Måling påvirker inntektstallene, noe som innebærer at kortvarige databaser ikke er ideelle når det gjelder holdbarhet. En minnelager med holdbarhetsalternativer er et perfekt valg.

Bruker Redis til måleprogrammer

I de følgende avsnittene vil vi undersøke hvordan du bruker Redis til telling og måling av løsninger. Redis har innebygde datastrukturer, atomkommandoer og time-to-live (TTL) -funksjoner som kan brukes til å bruke strømmålere. Redis går på en enkelt tråd. Derfor serialiseres alle databaseoppdateringene, slik at Redis kan fungere som et låsfritt datalager. Dette forenkler applikasjonsdesignet ettersom utviklere ikke trenger å bruke noe på å synkronisere trådene eller implementere låsemekanismer for datakonsistens.

Atomic Redis kommandoer for telling

Redis gir kommandoer for å øke verdiene uten å måtte lese dem til programmets hovedminne.

KommandoBeskrivelse
INCR nøkkelØk heltalsverdien til en nøkkel en
INCRBY nøkkeltilvekstØk heltallverdien til en nøkkel med det angitte tallet
INCRBYFLOAT nøkkeltilvekstØk flyteverdien til en nøkkel med det gitte beløpet
DECR nøkkelReduser heltallverdien til en nøkkel en
FORKJENNELSE nøkkelreduksjonReduser heltallverdien til en nøkkel med det angitte tallet
HINCRBY nøkkelfeltøkningØk heltallet til et hash-felt med det angitte tallet
HINCRBYFLOAT økning i nøkkelfeltØk flyteverdien til et hash-felt med det gitte beløpet

Redis lagrer heltall som et base-10 64-bits signert heltall. Derfor er maksimumsgrensen for et helt tall et veldig stort tall: 263 - 1 = 923372,036,854,775,807.

Innebygd time-to-live (TTL) på Redis-tastene

En av de vanligste brukssakene i måling er å spore bruken mot tid og å begrense ressursene etter at tiden løper ut. I Redis kan man sette en time-to-live-verdi for tastene. Redis vil automatisk deaktivere tastene etter en angitt tidsavbrudd. Tabellen nedenfor viser flere metoder for utløp av nøkler.

KommandoBeskrivelse
UTLØPE nøkkel sekunderAngi tidspunktet for nøkkelen til å leve i sekunder
UTLØP nøkkel tidsstempelAngi utløpet for en nøkkel som et Unix-tidsstempel
PEXPIRE viktige millisekunderAngi nøkkeltiden til å leve i millisekunder
PEXPIREAT nøkkel tidsstempelAngi utløpet for en nøkkel som et UNIX-tidsstempel i millisekunder
SETT nøkkelverdi [EX sekunder] [PX millisekunder]Sett strengverdi til en nøkkel sammen med valgfri tid for å leve

Meldingene nedenfor gir deg tid til å leve på tastene når det gjelder sekunder og millisekunder.

KommandoBeskrivelse
TTL nøkkelFå tid til å leve for en nøkkel
PTTL nøkkelFå tid til å leve for en nøkkel i millisekunder

Redis datastrukturer og kommandoer for effektiv telling

Redis er elsket for sine datastrukturer som lister, sett, sorterte sett, hash og hyperloglogger. Mange flere kan legges til via Redis moduler API.

Redis Labs

Redis datastrukturer kommer med innebygde kommandoer som er optimalisert for å utføre med maksimal effektivitet i minnet (akkurat der dataene er lagret). Noen datastrukturer hjelper deg med å oppnå mye mer enn å telle objekter. For eksempel garanterer Set-datastrukturen unikhet til alle elementene.

Sortert sett går et skritt videre ved å sikre at bare unike elementer blir lagt til settet, og lar deg bestille elementene basert på en score. Å bestille elementene dine etter tid i en sortert sett datastruktur, for eksempel, vil tilby deg en tidsseriedatabase. Ved hjelp av Redis-kommandoer kan du få elementene dine i en bestemt rekkefølge, eller slette elementer du ikke trenger lenger.

Hyperloglog er en annen spesiell datastruktur som estimerer antall millioner unike ting uten å måtte lagre gjenstandene selv eller påvirke minnet.

Data strukturKommandoBeskrivelse
ListeLLEN nøkkelFå lengden på en liste
SettSCARD nøkkelFå antall medlemmer i et sett (kardinalitet)
Sortert settZCARD nøkkelFå antall medlemmer i et sortert sett
Sortert settZLEXCOUNT nøkkel min maksTell antall medlemmer i et sortert sett mellom et gitt leksikografisk område
HashHLEN nøkkelFå antall felt i en hash
HyperloggPFCOUNT nøkkelFå den omtrentlige kardinaliteten til settet observert av Hyperloglog-datastrukturen
BitmapBITCOUNT tast [start slutt]Teller settbiter i en streng

Redis utholdenhet og replikering i minnet

Måling av brukstilfeller som betalinger innebærer lagring og oppdatering av informasjon som er viktig for bedrifter. Tap av data har direkte innvirkning på inntektene. Det kan også ødelegge faktureringsoppføringer, som ofte er et krav til samsvar eller styring.

Du kan stille konsistens og holdbarhet i Redis basert på dine datakrav. Hvis du trenger et permanent bevis for måling av dataene dine, kan du oppnå holdbarhet gjennom Redis utholdenhetsfunksjoner. Redis støtter AOF (kun append-fil), som kopierer skrivekommandoer til disken mens de skjer, og snapshotting, som tar dataene slik de eksisterer på et øyeblikk og skriver dem til disken.

Innebygd låsfri Redis-arkitektur

Redis-behandlingen er enkelt gjenget; Dette sikrer dataintegritet, ettersom alle skrivekommandoer automatisk blir seriellisert. Denne arkitekturen avlaster utviklerne og arkitektene fra byrden ved å synkronisere tråder i et flertrådet miljø.

Når det gjelder en populær mobilapp for forbrukere, kan tusenvis og noen ganger millioner av brukere få tilgang til applikasjonen samtidig. La oss si at applikasjonen måler tiden som brukes, og to eller flere brukere kan dele minutter samtidig. De parallelle trådene kan oppdatere det samme objektet uten å påføre den ekstra byrden å sikre dataintegriteten. Dette reduserer kompleksiteten i applikasjonsdesignen, samtidig som det sikres hastighet og effektivitet.

Redis måleeksempelimplementeringer

La oss ta en titt på eksempelkoden. Flere av scenariene nedenfor vil kreve svært komplekse implementeringer hvis databasen som ble brukt ikke var Redis.

Blokkerer flere påloggingsforsøk

For å forhindre uautorisert tilgang til kontoer, blokkerer nettsteder noen ganger brukere fra å gjøre flere påloggingsforsøk innen en angitt tidsperiode. I dette eksemplet begrenser vi brukerne fra å gjøre mer enn tre påloggingsforsøk på en time ved hjelp av enkel nøkkel-tid-til-live-funksjonalitet.

Nøkkelen til å holde antall påloggingsforsøk:

bruker_innloggingsforsøk:

Fremgangsmåte:

Få gjeldende antall forsøk:

FÅ bruker_innloggingsforsøk:

Hvis null, så sett nøkkelen med utløpstiden i sekunder (1 time = 3600 sekunder):

SET bruker_innloggingsforsøk: 1 3600

Hvis ikke null, og hvis antallet er større enn 3, kan du kaste en feil:

Hvis ikke null, og hvis antallet er mindre enn eller lik 3, øk antallet:

INCR bruker_innloggingsforsøk:

Ved et vellykket påloggingsforsøk kan nøkkelen slettes som følger:

DEL bruker_innloggingsforsøk:

Betal når du går

Redis Hash-datastrukturen gir enkle kommandoer for å spore bruk og fakturering. La oss anta at hver kunde har faktureringsdataene sine lagret i en Hash, som vist nedenfor:

kunde_fakturering:

bruk

koste

     .

     .

Anta at hver enhet koster to øre, og brukeren spiste 20 enheter. Kommandoene for å oppdatere bruk og fakturering er:

hincrby-kunde: bruk 20

hincrbyfloat-kunde: kostnad .40

Som du kanskje har lagt merke til, kan applikasjonen din oppdatere informasjonen i databasen uten å kreve at den laster inn dataene fra databasen i sitt eget minne. I tillegg kan du endre et enkelt felt i et Hash-objekt uten å lese hele objektet.

Merk: Formålet med dette eksemplet er å vise hvordan du bruker hincrby og hincrbyfloat kommandoer. I god design unngår du å lagre overflødig informasjon som både bruk og pris.

$config[zx-auto] not found$config[zx-overlay] not found