Ich erstelle einen API Limiter, und ich habe Probleme bei der Entscheidung, welches System für die Datenspeicherung verwendet werden soll.Auswahl der Datenbanktechnologie basierend auf einem Anwendungsfall
Es ist wirklich klar, dass ich einen flüchtigen Speicher und einen dauerhaften Speicher brauche.
Auf dem flüchtig Ich mag einen Schlüssel-Wert wie folgt speichern:
read:14522145 100
read:99885669 16
read:78951585 100
Dies ist ein Schlüssel ist, bestehend aus: {action}:{client}
und ein Integer-Wert (verfügbare Mittel).
Auf der ständigen, möchte ich eine Aufzeichnung aller Ressourcenausfälle zu halten.
Der Algorithmus (Pseudocode) ist ziemlich einfach:
MAX_AMOUNT = 100
call(action, client, cost) {
key = action + ":" + client
if (volatileStorage.hasKey(key)) {
value = volatileStorage.getValue(key)
if (value >= cost) {
volatileStorage.setValue(key, value - cost)
return true
} else {
persistentStorage.logOutage(method, client, cost)
return false
}
} else {
volatileStorage.setValue(key, MAX_AMOUNT)
return call(action, client, cost)
}
}
Es ist ein paralleler Prozess, der alle N
Sekunden für jede method
läuft, erhöht, dass alle Tasten {action}:*
von M, bis O.
Zusätzlich möchte ich aus dem flüchtigen Speicher alle Elemente entfernen, die älter sind (seit dem nicht geändert) als P Sekunden.
Also im Grunde ist jede Aktion action<N, M, O, P>
. Zum Beispiel wird das Lesen von Benutzern alle 1 Sekunde, um 5 Punkte, bis zu 100 erhöht und nach 60 Sekunden Inaktivität entfernt: read_users<1, 5, 100, 60>
.
Also muss ich einen flüchtigen Speicher, der:
- wirklich schnell liest, ohne zu viele Ressourcen zu verbrauchen (was ist der Punkt einen Anruf abzulehnen, wenn der Prozess teurer als der eigene Ruf ist).
- Ermöglicht TTL für Elemente.
- Kann, mit guter Leistung, alle Schlüssel zu einem Muster (
read_users:*
) erhöhen, ohne aus einem definierten Limit zu kommen.
und einem persistenten Speicher, die:
- auch schnell ist.
- Kann viele Register verarbeiten.
Jeder Rat ist willkommen.
ich fürchte, th Aus Gründen, die den Rahmen dieses Beitrags sprengen, muss ich es selbst implementieren. –