TTLs e notificação de expiração

O Couchbase inclui um TTL (Time To Live) como parte dos campos de metadados de cada documento. Todos os SDKs do cliente incluem suporte para definir/consultar/tocar esse valor. O valor é definido como o "número de segundos que um documento deve durar" para documentos que devem expirar em 30 dias ou menos. Para valores superiores a 30 dias, deve ser passado um valor de tempo de época unix. Os TTLs são frequentemente usados em armazenamentos de sessão de alto desempenho e aplicativos de cache. O que acontece com uma sessão quando um documento expira pode ser problemático e complicado de gerenciar na camada do aplicativo. E se o alto desempenho e a flexibilidade do Couchbase Server fossem aproveitados para fornecer retornos de chamada para a expiração de documentos? Apresentamos o "expiry-notifier" do Couchbase Labs. O aplicativo, o código-fonte e as instruções podem ser baixados em o repositório do couchbaselabs no github.**

Notificador de expiração do Couchbase Labs

O aplicativo executa uma pequena instância de aplicativo do node.js e do express. Ele é configurado e acessado por meio de uma API REST. Por que o Node.js? O Node.js é uma plataforma de aplicativos bem suportada para o Couchbase, é incrivelmente leve, gerencia seu espaço de forma eficiente e é adequado para aplicativos RESTful. O Expiry-notifier pode ser chamado diretamente ou pode ser configurado para executar automaticamente retornos de chamada de expiração em um determinado intervalo de tempo. A funcionalidade de retorno de chamada de expiração retorna meta ids e tempo de expiração (ou segundos até a expiração) para documentos que expirarão em uma janela de tempo especificada.

Por exemplo, para receber uma chamada de retorno de expiração de um aplicativo que pesquisará diretamente o serviço, um documento é definido no Couchbase com uma expiração de 300 segundos:


Chave (meta.id): triunfo

{
"valor": "1966 Triumph Spitfire Mark II 4 velocidades com overdrive e carburadores Weber duplos."
}

Se o notificador de expiração estiver em execução, o tempo relativo foi definido como verdadeiro (falaremos mais sobre isso em um segundo) e, após 10 segundos, o ponto de extremidade REST será chamado para pesquisar retornos de chamada de expiração:

http://servername:3000/poll/300

Um objeto JSON será retornado:

(triunfo:290)

Como funciona o notificador de expiração

O Expiry-notifier pode ser executado em qualquer servidor que tenha o node.js instalado. Depois que o expiry-notifier for instalado (as instruções podem ser encontradas em no repositório do couchbaselabs no github), o aplicativo precisa ser iniciado. No diretório raiz em que o aplicativo está instalado, execute

"npm start"

Por padrão, o aplicativo será executado usando a porta 3000. Para testar se o aplicativo está em execução, chame o seguinte comando REST:

"http://:3000/status"??????

Para configurar o serviço para se comunicar com um cluster do couchbase, chame o seguinte comando REST:

“http://:3000/setup/server/192.168.60.101/8091/beer-sample”

O comando REST acima é definido como: /setup/server/:server/:port/:bucket [RETURNS: {JSON OBJECT} with status change].  A chamada desse comando REST executa o seguinte:

  • Instancia o cliente inteligente para se comunicar com o cluster do Couchbase
  • Configura um índice leve no couchbase que mantém metadados apenas por tempo de expiração.

Para configurar um ponto de extremidade para que o serviço envie retornos de chamada de expiração para um servidor de aplicativos, use o seguinte comando REST:

"http://:3000/setup/endpoint//3000/receive_callback"

O comando REST acima é definido como: /setup/endpoint/:hostname/:port/:path/ [RETURNS: {JSON OBJECT} with status change] Observação: o sinalizador "https" só é usado se o notificador de expiração tiver de enviar retornos de chamada pelo protocolo https. Consulte a documentação para obter informações mais específicas.

Para começar a enviar retornos de chamada para o ponto de extremidade definido acima para documentos que estão definidos para expirar nos próximos 30 segundos e a cada 30 segundos depois disso, use o seguinte comando REST:

"http://:3000/setup/poll/30/loop"

O comando REST acima é definido como:/setup/poll/:interval/:loop [RETURNS: {JSON OBJECT} com alteração de status] Esse comando enviará um objeto JSON de meta ids e sua expiração em tempo de época UNIX (número de segundos após 1/1/1970 em que o documento está definido para expirar). Se preferir o número de segundos até a expiração do documento, use o comando abaixo.

Para retornar o número de segundos até a expiração de um documento em vez da hora da época do UNIX, use o seguinte comando:

"http://:3000/setup/relative/true"

O comando REST acima é definido como: /setup/relative/:bool [RETURNS: {JSON OBJECT} com alteração de status]

** Isenção de responsabilidade: o Couchbase Labs fornece código experimental apenas para fins de pesquisa e desenvolvimento. O código e os aplicativos do Couchbase Labs não são suportados por nenhum contrato de suporte do Couchbase e são fornecidos no estado em que se encontram, sem garantia de qualquer tipo.  

Autor

Postado por Todd Greenstein

Todd Greenstein é arquiteto de soluções na Couchbase. Todd é especializado em design de API, arquitetura, modelagem de dados, desenvolvimento em nodejs e golang.

Um comentário

  1. Artigo muito bom, e eu adoro esse recurso.

    Mas o que eu realmente quero é um recurso integrado que, quando um documento específico expira, o próprio CouchBase aciona algo como:
    http://TARGET_TO_RECEIVE/:bucket_name/:key
    com o corpo da solicitação (opcional) para o candidato a ser excluído.

    TARGET_TO_RECEIVE é configurado por meio do administrador do CouchBase.

    1. Você tem algum plano para implementar esse recurso em uma versão futura?

    Ou, se o próprio CB deixar um registro com o documento expirado, isso seria de grande ajuda para mim, mas não consigo encontrar um registro de expiração separado com o link a seguir:
    http://docs.couchbase.com/admi

    2. O CB deixa um registro de expiração do documento? Melhor ainda, deixa esse registro em um arquivo de registro separado, ou seja, expired.log?

Deixar uma resposta