Servidor Couchbase

Crear un limitador de velocidad con Couchbase Eventing

Introducción

Couchbase Server 8.0 presenta un nuevo controlador de funciones de eventos llamado OnDeploy que permite a los clientes ejecutar la lógica empresarial durante la implementación o reanudación de funciones de eventos sin necesidad de ninguna mutación externa para activarla.

Anteriormente, los clientes con casos de uso que necesitaban ejecutar cualquier lógica antes de que se implementara o reanudara una función de Eventing tenían pocas opciones, como por ejemplo:

  1. Realizar manualmente la configuración necesaria por su cuenta.
  2. Automatice la configuración mediante un script externo antes de activar la implementación o reanudación de la función Eventing.

Ambos métodos son engorrosos y dependen de una intervención externa o manual.

Los eventos “implementación” y “reanudación” en el ciclo de vida de la función Eventing marcan los puntos en los que está a punto de comenzar a procesar mutaciones. Esto hace que el OnDeploy Manejador adecuado para inyectar lógica que requiere que se realicen cualquiera de las siguientes actividades:

  1. Realice comprobaciones previas al vuelo para asegurarse de que el entorno está configurado correctamente.
  2. Configure cachés (por ejemplo, tablas de consulta) para mejorar la eficiencia.
  3. Envía, recopila y procesa datos de diferentes servicios de Couchbase y externos.
  4. “Autoactivar” la función Eventing después de su implementación/reanudación modificando al menos un documento en su espacio de claves de origen.
    1. Esta mutación activará su OnUpdate y/o OnDelete manipulador.
    2. Este es un caso de uso avanzado de OnDeploy porque, tradicionalmente, la ejecución de la función Eventing se había restringido para que solo se activara cuando se producían cambios en su espacio de claves de origen por parte de entidades distintas de la propia función Eventing o por la expiración del temporizador.

Limitador de velocidad

En esta publicación, crearemos un limitador de velocidad robusto utilizando el algoritmo de cubeta de fichas y el servicio Eventing de Couchbase. A lo largo del proceso, obtendrá experiencia práctica con el nuevo controlador OnDeploy y descubrirá cómo Eventing simplifica la integración con otros servicios de Couchbase.

Diseño de alto nivel

Escala multidimensional

El clúster de 6 nodos debe tener las siguientes asignaciones de servicios a nodos:

N.º. Número de nodo Servicio(s)
1. 0 Datos
2. 1 Datos
3. 2 Datos
4. 3 Eventos, consulta
5. 4 Eventos, consulta
6. 5 Indexación

Algunos puntos a tener en cuenta sobre la configuración del clúster:

  • Utilizamos tres nodos de servicio de datos para garantizar la redundancia mediante la replicación de datos.
  • Ejecutamos el servicio Eventing en dos nodos para aumentar el paralelismo de la función Eventing.
    • Esto se hace además de contar con múltiples trabajadores para nuestra función Eventing.
  • Los servicios que requieren un uso intensivo de la CPU, como Data y Eventing, deben mantenerse en nodos de clúster separados.
  • Necesitamos el servicio Query porque ciertas operaciones, como eliminar todos los documentos de un espacio de claves, se pueden realizar cómodamente a través de este servicio.
  • Necesitamos el servicio de indexación para crear índices primarios para el bucket efímero.

Espacios de claves

Nuestro clúster debe tener los siguientes espacios de claves:

N.º. Nombre del cubo Tipo cubo Alcance Colección Descripción
1 por defecto Couchbase Por defecto Por defecto
  1. Se utiliza como el “ámbito de la función” de la función de evento.
  2. Se utiliza para almacenar los metadatos de las funciones de eventos.
_sistema _móvil
_sistema _query
2 limitador de velocidad Efímero Por defecto Por defecto
_sistema _móvil
_sistema _query
mi-llm límites Guarde el documento que contiene la asignación de límites por nivel y tasa.
mi-llm rastreador Guarde los documentos del mostrador de la tienda para llevar un registro del uso de cada usuario.
3 mi-llm Couchbase Por defecto Por defecto
_sistema _móvil
_sistema _query
usuarios cuentas Almacenar los datos de la cuenta de usuario, incluido su “nivel”.
usuarios eventos Almacena los eventos de usuario que deben tener una limitación de velocidad basada en el “nivel” del usuario.

Nota:

  • En limitador de velocidad el cubo es Efímero porque no necesitamos conservar esos datos. Utilizamos los datos de ese depósito para realizar un seguimiento del uso del límite de velocidad por usuario y para almacenar en caché la asignación entre niveles y límites de velocidad.

Puntos finales externos de la API REST

La función Eventing interactúa con puntos finales API externos que proporcionan las siguientes funcionalidades:

  1. Proporcione la última asignación de niveles a límites de velocidad.
  2. Aceptar modificaciones en la asignación de niveles a límites de tarifas.
  3. Acepta las solicitudes entrantes que estén dentro del límite de frecuencia del usuario mediante nuestra función Eventing.
    1. En este proyecto, nuestro punto final mantendrá un recuento de estas solicitudes entrantes.
      Este recuento nos ayudará a verificar si nuestra aplicación limitadora de velocidad funciona como se espera.
  4. Proporcione el número de solicitudes entrantes que nuestra función Eventing ha considerado que están dentro del límite de tasa del usuario.

El enlace a la especificación OpenAPI de los puntos finales de la API anterior se puede encontrar en aquí.

Nota: El programa Go que aloja estos puntos finales de la API REST se encuentra vinculado en el Apéndice.

Diseño de bajo nivel

Configuración de la función de eventos

A continuación se muestra una lista de todos los cambios que debemos realizar en la configuración predeterminada de la función Eventing.

Espacios de claves

N.º. Campo Valor
1. Ámbito de la función predeterminado._predeterminado
2. Espacio de claves de origen mis-usuarios-llm.eventos
3. Espacio de almacenamiento de eventos predeterminado._predeterminado._predeterminado

Ajustes

N.º. Campo Valor
1. Nombre mi-limitador-de-velocidad-llm
2. Límite de la fuente de implementación A partir de ahora
3. Descripción Esta función Eventing actúa como un limitador de velocidad.
4. Trabajadores 10

Fijaciones para cubetas

N.º. Cubo
Alias
Espacio clave Acceda a
Cubo Alcance Colección
1. Cuentas de usuario mi-llm usuarios cuentas Solo lectura
2. limitador de velocidad limitador de velocidad mi-llm rastreador Leer y escribir
3. Límites de nivel limitador de velocidad mi-llm límites Leer y escribir

Enlaces URL

N.º. Alias de URL URL Autenticación Nombre de usuario Contraseña
1. llmEndpoint http://localhost:3054/my-llm Básico Eventos Eventing123
2. nivelesPuntoFinal http://localhost:3054/tiers

Nota: Las opciones “permitir cookies” y “validar certificado SSL” están desactivadas.

Diagrama completo del flujo de la solicitud

Complete Application Flow Diagram

Este diagrama muestra las interacciones entre los controladores de funciones de Eventing, los puntos finales de la API REST externa y los espacios de claves para comportarse como un limitador de velocidad basado en el algoritmo de cubeta de tokens.
En las siguientes secciones, implementaremos el limitador de velocidad paso a paso.

OnDeploy Configurar

Obtener y almacenar los niveles desde el punto final de la API REST externa

Get and Store the Tiers From the External REST API Endpoint

Cuando el OnDeploy El controlador comienza a ejecutarse, primero debe obtener la asignación de niveles a límites de velocidad desde el punto final de la API REST externa representado por el nivelesPuntoFinal Vinculación de URL.
La respuesta de la /niveles La API REST externa será un valor JSON que contiene la asignación del nombre del nivel (de tipo Cadena) a un límite de tasa por hora representado por el recuento total de solicitudes permitidas por hora (es decir, total_request_count) (de tipo número).
Almacenamos la asignación de niveles a límites de tasa en el límite de velocidad.mis-llm.límites espacio de claves.

Restablecer todos los rastreadores de límite de velocidad al implementar

Reset All Rate Limit Trackers When Deploying

En nuestra aplicación, modelamos la desactivación de la función Eventing como un apagado completo; por lo tanto, durante su implementación, eliminamos todos los documentos que registran el uso de los límites de velocidad de los usuarios. Modelamos la pausa como una suspensión temporal de las actividades de limitación de velocidad; por lo tanto, no borramos esos documentos en caso de que se reanude la función Eventing.

¿Te das cuenta de cómo tratamos las operaciones de implementación y reanudación por separado? OnDeploy hace posibles estos casos de uso porque Eventing también pasa un motivo en el campo acción objetar lo OnDeploy handler para especificar si la función Eventing se está implementando o reanudando.

Restablecer los límites de velocidad de los usuarios cada hora

Reset the Users’ Rate Limits Every Hour

Dado que estamos implementando un algoritmo de cubo de fichas, restablecemos los límites de velocidad de los usuarios cada hora utilizando temporizadores, una funcionalidad de Eventing que es fundamental para nuestro caso de uso. Creamos el primer temporizador en el OnDeploy handler para que se active después de una hora. Una vez que se activa la devolución de llamada del temporizador, se creará un nuevo temporizador que se activará después de una hora, y así sucesivamente, creando un temporizador recurrente que se activa cada hora mientras la función Eventing esté implementada.

Observe que este temporizador no requirió ninguna mutación externa para activar la función Eventing y crearlo. Todo esto se hizo durante la implementación/reanudación en el OnDeploy manipulador.

Actualizar los límites de tarifas diarios

Refresh Tier Rate Limits Daily

Diseñamos nuestra aplicación para permitir cambios en los límites de velocidad cada 24 horas; por lo tanto, nuestra función Eventing debe extraer la última asignación de niveles a límites de velocidad del punto final de la API REST externa cada 24 horas para garantizar que se apliquen los límites de velocidad correctos a nuestros usuarios.

Una vez más, utilizamos temporizadores recurrentes para obtener la última asignación de niveles a límites de velocidad cada 24 horas.

OnUpdate Configurar

Manejo de eventos de usuario

Handling User Events

Nuestra aplicación escuchará los documentos de solicitud entrantes desde el mis-usuarios-llm.eventos keyspace. Estos documentos tienen un identificador único y contienen datos en el formato:

Si la solicitud del usuario se encuentra dentro de su límite de velocidad, todos los datos del documento, excepto el user_id, se enviarán al punto final protegido por nuestro limitador de velocidad.

Lectura del nivel del usuario

Reading the User’s Tier
Cuando el OnUpdate El controlador se activa por un documento de evento de usuario entrante del paso anterior, debemos extraer el usuario_id campo de él.
Utilización de la usuario_id campo, recuperaremos el documento con los detalles de la cuenta del usuario desde el mis-usuarios.cuentas keyspace. De este documento, extraeremos el valor de nivel campo.

Lectura de los límites de tarifa del nivel

Reading the Tier’s Rate Limits

Obtenemos los límites de velocidad para el nivel del usuario a partir del documento que contiene la asignación de niveles a límites de velocidad, ubicado en el límite de velocidad.mis-llm.límites espacio de claves.

Decida si desea limitar la velocidad de la solicitud y actualizar el uso del límite de velocidad del usuario.

Decide Whether to Rate Limit the Request & Update the User’s Rate Limit Usage

Dado el límite de velocidad del usuario, ahora verificamos su uso actual para decidir si puede realizar una solicitud. El limitador de velocidad rastrea el uso de cada usuario con un documento contador en el rate-limit.my-llm.tracker keyspace. Creamos este documento contador bajo demanda para cada usuario_id para almacenar el recuento de solicitudes de ese usuario para la ventana actual, antes de que se actualice el límite del token bucket. Si el uso de un usuario alcanza o supera el límite de su nivel, bloqueamos su solicitud. De lo contrario, la reenviamos al punto final protegido. Por último, actualizamos el uso del límite de velocidad del usuario en su documento contador correspondiente en el rate-limit.my-llm.tracker espacio de claves.

Envía la solicitud “dentro del límite” al punto final deseado.

Send the “within the limit” Request to the Desired Endpoint

Las solicitudes de los usuarios, dentro de los límites de velocidad de su nivel correspondiente, se envían al punto final de la API REST protegido por nuestro limitador de velocidad.

Probando nuestra aplicación

Ahora que hemos implementado nuestro limitador de velocidad, podemos crear el entorno para ejecutarlo y probarlo:

  1. Ejecute el programa Go para cargar un conjunto de muestra de 100 usuarios.
  2. Ejecute el programa Go para iniciar el servidor HTTP que proporciona las API REST externas con las que interactúa nuestra función Eventing.
  3. Implemente la función Eventing.
  4. Para activar la función Eventing, debemos ejecutar el programa Go para cargar los documentos de eventos del usuario en su espacio de claves de origen, es decir, mis-usuarios-llm.eventos.
  5. Para obtener el número de solicitudes de usuario que llegan al punto final de la API REST externa protegido por nuestro limitador de velocidad, debe enviar un GET solicitud al /mi-llm punto final.

Conclusión

Esta publicación mostró cómo utilizar el nuevo controlador Couchbase Eventing., OnDeploy, para crear un limitador de velocidad de cubeta de fichas, lo que pone de relieve la potencia y flexibilidad de Couchbase Eventing para desarrollar soluciones integradas e independientes.
En términos más generales, esto demuestra un cambio en el desarrollo de aplicaciones: crear aplicaciones a partir de la propia base de datos. Esto permite ofrecer soluciones personalizadas para diversos requisitos, todo ello dentro de la plataforma Couchbase.

Anexo

Código completo de Eventing: Haga clic aquí
Código Go del servidor: Haga clic aquí
Código Go del cliente: Haga clic aquí
Código Go del cargador de usuario: Haga clic aquí

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Rishit Chaudhary

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.