9. [Serie] Redis Redis es una aplicación avanzada - la limitación de embudo

Original: 9. [Serie] Redis Redis es una aplicación avanzada - la limitación de embudo

Funnel límite actual es uno de los métodos más comúnmente utilizado de limitar, como el nombre sugiere, la inspiración viene de la estructura del embudo algoritmo (embudo) de.

image.png

Capacidad de la tolva está limitada, si el pico de descarga bloqueada, a continuación, el riego se ha introducido, se convertirá por completo, hasta que ya no pretender que no fuera. Si la boca de desagüe abierta, el agua fluirá hacia abajo, entonces el flujo de distancia parte de ella y puede continuar conduciendo el riego. Si usted se desliza en el agua a una tasa mayor que la tasa de riego, a continuación, el embudo que nunca se llena. Si la tasa de fuga es menor que la tasa del agua de la boca de riego, a continuación, una vez que la tolva está llena, necesitamos hacer una pausa y esperar a que el riego embudo desocupado.

Por lo tanto, el espacio restante del embudo representa el número de este comportamiento puede ser continuado, el caudal del tubo de descarga representa la frecuencia máxima permitida del comportamiento del sistema. Aquí se utiliza el código para describir el algoritmo de embudo sola.

public class FunnelRateLimiter {

  static class Funnel {
    int capacity;
    float leakingRate;
    int leftQuota;
    long leakingTs;

    public Funnel(int capacity, float leakingRate) {
      this.capacity = capacity;
      this.leakingRate = leakingRate;
      this.leftQuota = capacity;
      this.leakingTs = System.currentTimeMillis();
    }

    void makeSpace() {
      long nowTs = System.currentTimeMillis();
      long deltaTs = nowTs - leakingTs;
      int deltaQuota = (int) (deltaTs * leakingRate);
      if (deltaQuota < 0) { // 间隔时间太长,整数数字过大溢出
        this.leftQuota = capacity;
        this.leakingTs = nowTs;
        return;
      }
      if (deltaQuota < 1) { // 腾出空间太小,最小单位是1
        return;
      }
      this.leftQuota += deltaQuota;
      this.leakingTs = nowTs;
      if (this.leftQuota > this.capacity) {
        this.leftQuota = this.capacity;
      }
    }

    boolean watering(int quota) {
      makeSpace();
      if (this.leftQuota >= quota) {
        this.leftQuota -= quota;
        return true;
      }
      return false;
    }
  }

  private Map<String, Funnel> funnels = new HashMap<>();

  public boolean isActionAllowed(String userId, String actionKey, int capacity, float leakingRate) {
    String key = String.format("%s:%s", userId, actionKey);
    Funnel funnel = funnels.get(key);
    if (funnel == null) {
      funnel = new Funnel(capacity, leakingRate);
      funnels.put(key, funnel);
    }
    return funnel.watering(1); // 需要1个quota
  }
}

método make_space objeto embudo embudo es el núcleo del algoritmo, que se llama a fugas de disparo, para hacer espacio en el embudo antes de cada riego. ¿Cuánto espacio puede hacer depende de cuánto tiempo más tarde y la velocidad del agua que fluye. objetos de embudo ocupan el espacio ya no es proporcional a la frecuencia y el comportamiento, su huella es una constante.

La pregunta es, cómo canalizar algoritmos distribuidos que permitan alcanzar? Se puede utilizar para obtener la estructura de datos básica de Redis?

Embudo de objetos que observamos varios campos, podemos encontrar el objeto de contenido por los almacenes de campo embudo de una estructura de hash, será sacado cuando configuración del campo de hash de riego después de la operación lógica, entonces se rellenó en el valor hash de la nueva estructura para completar la detección de la frecuencia de un comportamiento.

Pero hay un problema, no podemos garantizar la atomicidad de todo el proceso. valor Hash de la estructura, entonces la operación de memoria, entonces el relleno a la estructura de hash, no el proceso de tres atomización, los medios de bloqueo deben ser controlados de manera apropiada. Una vez bloqueado, significa que no habrá fallos de bloqueo, bloqueo no tiene que elegir reintentar o darse por vencido.

Si el reintento, que podría causar una degradación del rendimiento. Si nos damos por vencidos, que afectará a la experiencia del usuario. Al mismo tiempo, la complejidad del código seguido también aumentó mucho. Fue una decisión difícil, ¿cómo resolvemos este problema? Redis-Cell salvador que viene!

Redis-Cell

4,0 Redis Redis proporciona un módulo de limitación de corriente, se denomina de células redis. El módulo también utiliza algoritmos de embudo, y un limitador de flujo ofrece átomos de instrucciones. Con este módulo, lo que limita el problema es muy simple.

El único módulo de instrucción cl.throttle, sus parámetros y valores de retorno son un poco complicadas, vamos a echar un vistazo a cómo esta directiva el uso específico.

> cl.throttle laoqian:reply 15 30 60 1
                      ▲     ▲  ▲  ▲  ▲
                      |     |  |  |  └───── need 1 quota (可选参数,默认值也是1)
                      |     |  └──┴─────── 30 operations / 60 seconds 这是漏水速率
                      |     └───────────── 15 capacity 这是漏斗容量
                      └─────────────────── key laoqian

Los medios de comando anterior para permitir una frecuencia máxima de 30 veces por 60 (tasa de fuga), la capacidad inicial de la tolva 15, que es una respuesta a comenzar continuamente mensaje 15 y, a continuación, comenzaron a gotear tasa afectada. Consideramos que esta tasa de fuga de instrucciones se convierte en dos parámetros en lugar de un único número de coma flotante antes. Dividiendo el resultado con dos parámetros relativos a la expresión de una única tasa de fugas de punto flotante para ser más intuitiva.

> cl.throttle laoqian:reply 15 30 60
1) (integer) 0   # 0 表示允许,1表示拒绝
2) (integer) 15  # 漏斗容量capacity
3) (integer) 14  # 漏斗剩余空间left_quota
4) (integer) -1  # 如果拒绝了,需要多长时间后再试(漏斗有空间了,单位秒)
5) (integer) 2   # 多长时间后,漏斗完全空出来(left_quota==capacity,单位秒)

La limitación de la instrucción cuando se ejecuta, si es rechazada, es necesario desechar o reintento. instrucciones cl.throttle consideración muy reflexivo, tiempo de reintento siquiera se consideran buenas para ti, toma un resultado directo del valor de retorno de una cuarta serie de sueño puede ser, si no bloquear las discusiones también pueden ser una tarea programada asíncrona para volver a intentarlo.

Supongo que te gusta

Origin www.cnblogs.com/lonelyxmas/p/12515051.html
Recomendado
Clasificación