Moleculer tem uma solução integrada para armazenar em cache as respostas das ações dos serviços. Para ativá-lo, defina um tipo de cache
em opções do broker e defina cache: true
nas configurações de ações daquilo que quiser manter em cache.
Exemplo de ação em cache
const { ServiceBroker } = require("moleculer"); |
Mensagens do console:
[2017-08-18T13:04:33.845Z] INFO dev-pc/BROKER: Broker started. |
Como pode ver, a mensagem Handler called
aparece apenas uma vez porque a resposta da segunda requisição é retornada do cache.
Chaves de cache
O cache gera a chave a partir do nome do serviço, nome da ação e os parâmetros do context. A sintaxe da chave é:
<serviceName>.<actionName>:<parameters or hash of parameters> |
Então, se você chamar a ação posts.list
com parâmetros { limit: 5, offset: 20 }
, o cache calcula um hash dos parâmetros. Então, da próxima vez, quando você chamar esta ação com os mesmos parâmetros, ele encontrará a entrada no cache pela chave.
Exemplo de chave de cache para a ação “post.find”
posts.find:limit|5|offset|20 |
O objeto params pode conter propriedades que não são relevantes para a chave de cache. Além disso, pode causar problemas de desempenho, se a chave for muito longa. Portanto, é recomendado definir um objeto para a propriedade cache
que contém uma lista de nomes de parâmetros essenciais sob a propriedade keys
. Para usar campos do meta no cache via propriedade keys
use o prefixo #
.
Restringe a lista de params
& propriedades meta
para a geração de chaves
{ |
Performance tipEsta solução é muito rápida, por isso recomendamos usá-la em produção.
Limitando tamanho da chave cache
Às vezes, a chave pode ser muito longa, o que pode causar problemas de desempenho. Para evitar isso, limite o tamanho dos parâmetros concatenados na chave com a opção de cache maxParamsLength
. Quando a chave é maior do que o valor limite configurado, o cache calcula um hash (SHA256) da chave completa e a adiciona ao fim da chave.
O mínimo de
maxParamsLength
é44
(Tamanho do hash SHA 256 em Base64).Para desativar este recurso, defina como
0
ounull
.
Gerar uma chave completa a partir de todos os parâmetros sem limite
cacher.getCacheKey("posts.find", { id: 2, title: "New post", content: "It can be very very looooooooooooooooooong content. So this key will also be too long" }); |
Gerar uma chave de comprimento limitado
const broker = new ServiceBroker({ |
Cache condicional
O cache condicional permite ignorar a resposta em cache e executar uma ação para obter dados “frescos”. Para ignorar o cache defina ctx.meta.$cache
para false
antes de chamar uma ação.
Exemplo desativando o cache para a ação greeter.hello
broker.call("greeter.hello", { name: "Moleculer" }, { meta: { $cache: false }})) |
Como alternativa, uma função personalizada pode ser implementada para ignorar o cache. A função personalizada aceita como argumento uma instância do context (ctx
), portanto, ela tem acesso a quaisquer parâmetros ou meta dados. Isso permite passar o sinalizador bypass dentro da requisição.
Exemplo de uma função de cache condicional personalizada
// greeter.service.js |
TTL
A configuração padrão de TTL pode ser substituída na definição de ação.
const broker = new ServiceBroker({ |
Gerador de chaves personalizado
Para sobrescrever o gerador de chaves de cache interno, defina sua própria função como keygen
nas opções do cache.
const broker = new ServiceBroker({ |
Cache manual
O módulo de cache pode ser usado manualmente. Basta chamar os métodos get
, set
, del
do broker.cacher
.
// Save to cache |
Além disso, a API completa do cliente ioredis está disponível em broker.cacher.client
quando estiver usando o cache Redis integrado:
// create an ioredis pipeline |
Limpar cache
Ao criar um novo registro em seu serviço, você deve limpar as entradas em cache antigas.
Exemplo de como limpar o cache dentro das ações
{ |
Limpar cache entre várias instâncias de serviço
A melhor prática para limpar entradas de cache entre várias instâncias de serviço é usar eventos do tipo broadcast. Note que isso é somente necessário para cachers não centralizados como Memory
ou MemoryLRU
.
Exemplo
module.exports = { |
Limpar cache entre diferentes serviços
Dependências entre serviços é uma situação comum. Ex.: O serviço de posts
armazena em cache informações do serviço de users
(quando houver campos populados).
Exemplo de entrada de cache no serviço posts
{ |
O campo author
é recebido do serviço users
. Então se o serviço users
limpar as entradas de cache, o serviço posts
também terá que limpar as próprias entradas de cache. Portanto, você também deve se subscrever ao evento cache.clear.users
no serviço posts
.
Para facilitar, crie um mixin CacheCleaner
e defina no esquema de serviços dependentes.
cache.cleaner.mixin.js
module.exports = function(serviceNames) { |
posts.service.js
const CacheCleaner = require("./cache.cleaner.mixin"); |
Com esta solução se o serviço users
emitir um evento cache.clean.users
, o serviço posts
também limpará suas próprias entradas de cache.
Bloqueio de cache
Moleculer também suporta o recurso de bloqueio de cache. Para informações detalhadas verifique esta PR.
Ativar bloqueio
const broker = new ServiceBroker({ |
Ativar com o TTL
const broker = new ServiceBroker({ |
Desativar Bloqueio
const broker = new ServiceBroker({ |
Exemplo de cache Redis com a biblioteca redlock
const broker = new ServiceBroker({ |
Caches integrados
Cache de memória
MemoryCacher
é um módulo de cache de memória integrado. Ele armazena entradas na memória.
Habilitar cache de memória
const broker = new ServiceBroker({ |
Ou
const broker = new ServiceBroker({ |
Habilitar com opções
const broker = new ServiceBroker({ |
Opções
Nome | Tipo | Padrão | Descrição |
---|---|---|---|
ttl |
Number |
null |
Tempo de Vida em segundos. |
clone |
Boolean ou Function |
false |
Clonar os dados em cache quando retornarem. |
keygen |
Function |
null |
Função de gerador de chaves de cache personalizada. |
maxParamsLength |
Number |
null |
Comprimento máximo de parâmetros nas chaves geradas. |
lock |
Boolean ou Object |
null |
Ativar recurso de bloqueio. |
Clonagem
O cache usa o método lodash _.cloneDeep
para clonagem. Para mudá-lo, defina uma Função
para a opção clone
em vez de um Boolean
.
Função de clone personalizada com parse de JSON & stringify
const broker = new ServiceBroker({ |
Cache de memória LRU
Cache de memória LRU
é um módulo cache LRU integrado. Ele exclui os itens menos usados recentemente.
Habilitar cache LRU
const broker = new ServiceBroker({ |
Com opções
let broker = new ServiceBroker({ |
Opções
Nome | Tipo | Valor padrão | Descrição |
---|---|---|---|
ttl |
Number |
null |
Tempo de Vida em segundos. |
max |
Number |
null |
Máximo de itens no cache. |
clone |
Boolean ou Function |
false |
Clonar os dados em cache quando retornarem. |
keygen |
Function |
null |
Função de gerador de chaves de cache personalizada. |
maxParamsLength |
Number |
null |
Comprimento máximo de parâmetros nas chaves geradas. |
lock |
Boolean ou Object |
null |
Ativar recurso de bloqueio. |
DependenciesPara poder usar este cache, instale o módulo
lru-cache
com o comandonpm install lru-cache --save
.
Cache Redis
RedisCacher
é um módulo de cache distribuído baseado em Redis. Ele usa a biblioteca ioredis
. Use-o, se você tem várias instâncias de serviços porque se uma instância armazena alguns dados no cache, outras instâncias o encontrarão.
Habilitar cache do Redis
const broker = new ServiceBroker({ |
Com string de conexão
const broker = new ServiceBroker({ |
Com opções
const broker = new ServiceBroker({ |
Com o serializador MessagePack Você pode definir um serializador para o Cache Redis. Por padrão, usa o serializador JSON.
const broker = new ServiceBroker({ |
Com o cliente Redis Cluster
const broker = new ServiceBroker({ |
Opções
Nome | Tipo | Valor padrão | Descrição |
---|---|---|---|
prefix |
String |
null |
Prefixo para chaves geradas. |
ttl |
Number |
null |
Tempo de Vida em segundos. Desativado: 0 ou null |
monitor |
Boolean |
false |
Ativar o recurso de monitoramento do cliente Redis. Se ativado, todas as operações do cliente serão registradas (no nível de debug) |
redis |
Object |
null |
Opções personalizadas de Redis. Serão transferidas ao construtor new Redis() . Leia mais. |
keygen |
Function |
null |
Função de gerador de chaves de cache personalizada. |
maxParamsLength |
Number |
null |
Comprimento máximo de parâmetros nas chaves geradas. |
serializer |
String |
"JSON" |
Nome de um serializador integrado. |
cluster |
Object |
null |
Configuração do cliente Redis Cluster. Mais informações |
lock |
Boolean ou Object |
null |
Ativar recurso de bloqueio. |
pingInterval |
Number |
null |
Emitir um comando Redis PING a cada pingInterval milissegundos. Pode ser usado para manter as conexões ativas apesar do timeout. |
DependenciesPara poder usar esse cacher, instale o módulo
ioredis
com o comandonpm install ioredis --save
.
Cache personalizado
Um módulo de cache personalizado pode ser criado. Recomendamos copiar o código fonte do MemoryCacher or RedisCacher e implementar os métodos get
, set
, del
e clean
.
Criar cache personalizado
const BaseCacher = require("moleculer").Cachers.Base; |
Usar cache personalizado
const { ServiceBroker } = require("moleculer"); |