MemoryCache parando de funcionar

38 views
Skip to first unread message

Felipe Oriani

unread,
Apr 13, 2018, 8:18:38 AM4/13/18
to dotnetar...@googlegroups.com
Olá pessoal, estou passando por um problema com MemoryCache, se alguém puder me ajudar, eu agradeço.

Nós temos uma aplicação (uma web api 2.0 - .net framework) que utiliza um esquema de autenticação proprietário. Uma vez que um usuário se autentica, geramos um token que fica armazenado em uma lista associado a qual usuário aquele token pertence. Esta lista fica disponível na instância padrão do MemoryCache (MemoryCache.Default). Outras informações ficam armazenadas junto a este token, como username, data de login, data do ultimo acesso a api, etc.

A chave do cache que guarda esta lista está marcada para expirar em 12 horas, e eventualmente removemos os usuários inativos por mais de 3 horas desta lista.

O problema acontece que eventualmente o MemoryCache para (morre) de derruba todas as chaves presentes na instância padrão do cache, fazendo com que a API perda os usuários autenticados (e outras informações em cache também). Inicialmente imaginei que pudesse ser o tamanho do cache, e defini um tamanho de 20MB pelo web.config do projeto da api, porém o problema continua.

<system.runtime.caching>
  <memoryCache>
    <namedCaches>
      <add name="Default" cacheMemoryLimitMegabytes="20" />
    </namedCaches>
  </memoryCache>
</system.runtime.caching> 

Não sei se defini a configuração de forma correta, mas o cache eventualmente é zerado, derrubando todos os usuários. Quando temos cerca de 100 usuários conectados (que é a média desta aplicação) nosso cache não atinge 3MB de tamanho.

Alguém teria alguma sugestão do que eu poderia verificar para tentar corrigir o problema? Eu não consigo nem simula-lo corretamente em meu ambiente. (aquela história de dev de que na minha máquina funciona haha).

Obrigado pessoal.


--
______________________________________
Felipe B Oriani

Evandro Oliveira

unread,
Apr 13, 2018, 8:27:47 AM4/13/18
to dotnetar...@googlegroups.com
Felipe, bom dia!

Já passei por isto, no meu caso estava relacionado ao IIS, que de maneira arbitraria estava gerando um "Recycle" e acabando com os dados do MemoryCache. No caso, nós configuramos no IIS que o recycle ocorra somente as duas horas da manhã. 
Faça um teste, publique sua aplicação, deixe que armazene o memorycache e força um recycle, o problema deve ocorrer.

Atenciosamente,

Evandro Martins.

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetarchitects@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitects+unsubscribe@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitects+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Fernando Bassani

unread,
Apr 13, 2018, 8:28:42 AM4/13/18
to dotnetar...@googlegroups.com
É uma boa dar uma olhada nas configurações do IIS e ver se ele não está reciclando o application pool.

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitec...@googlegroups.com.

Felipe Oriani

unread,
Apr 13, 2018, 9:07:37 AM4/13/18
to dotnetar...@googlegroups.com
Olá Fernando e Evandro,

Realmente fiz a reciclagem no IIS em nosso ambiente de desenvolvimento e tudo caiu. Desativei o intervalo de reciclagem (Regular Time Interval) setando para zero, e defini um tempo específico para às 2h da manhã. O print abaixo, mostra como deixei o application pool.

Não tenho certeza se fiz da forma correta. Poderiam me confirmar , por favor?

Obrigado pessoal.







2018-04-13 9:28 GMT-03:00 Fernando Bassani <fernand...@gmail.com>:
É uma boa dar uma olhada nas configurações do IIS e ver se ele não está reciclando o application pool.

On Fri, Apr 13, 2018 at 9:18 AM Felipe Oriani <felipe...@gmail.com> wrote:
Olá pessoal, estou passando por um problema com MemoryCache, se alguém puder me ajudar, eu agradeço.

Nós temos uma aplicação (uma web api 2.0 - .net framework) que utiliza um esquema de autenticação proprietário. Uma vez que um usuário se autentica, geramos um token que fica armazenado em uma lista associado a qual usuário aquele token pertence. Esta lista fica disponível na instância padrão do MemoryCache (MemoryCache.Default). Outras informações ficam armazenadas junto a este token, como username, data de login, data do ultimo acesso a api, etc.

A chave do cache que guarda esta lista está marcada para expirar em 12 horas, e eventualmente removemos os usuários inativos por mais de 3 horas desta lista.

O problema acontece que eventualmente o MemoryCache para (morre) de derruba todas as chaves presentes na instância padrão do cache, fazendo com que a API perda os usuários autenticados (e outras informações em cache também). Inicialmente imaginei que pudesse ser o tamanho do cache, e defini um tamanho de 20MB pelo web.config do projeto da api, porém o problema continua.

<system.runtime.caching>
  <memoryCache>
    <namedCaches>
      <add name="Default" cacheMemoryLimitMegabytes="20" />
    </namedCaches>
  </memoryCache>
</system.runtime.caching> 

Não sei se defini a configuração de forma correta, mas o cache eventualmente é zerado, derrubando todos os usuários. Quando temos cerca de 100 usuários conectados (que é a média desta aplicação) nosso cache não atinge 3MB de tamanho.

Alguém teria alguma sugestão do que eu poderia verificar para tentar corrigir o problema? Eu não consigo nem simula-lo corretamente em meu ambiente. (aquela história de dev de que na minha máquina funciona haha).

Obrigado pessoal.


--
______________________________________
Felipe B Oriani

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetarchitects@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitects+unsubscribe@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitects+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetarchitects@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitects+unsubscribe@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitects+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

Fernando Bassani

unread,
Apr 13, 2018, 9:23:14 AM4/13/18
to dotnetar...@googlegroups.com
Parece que é isso.

Só vale lembrar que esse pode não ser o problema. Quando a reciclagem acontece você perde o que está em memória. Naturalmente você vai perder o cache quando forçar a reciclagem. Então não descarte problemas de codificação. Mas deixa rolar e verifica amanhã.


Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitec...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitec...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
______________________________________
Felipe B Oriani

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitec...@googlegroups.com.

Mário Meyrelles

unread,
Apr 13, 2018, 9:25:35 AM4/13/18
to dotnetar...@googlegroups.com
Eu consideraria usar algo que sirva pra cache, como Redis. Sei que é um custo maior de mudança de código e sustentação da solução, mas neste caso, provavelmente o investimento se pague com o tempo.

Para postar envie uma mensagem para dotnetarchitects@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitects+unsubscribe@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitects+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetarchitects@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitects+unsubscribe@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitects+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
______________________________________
Felipe B Oriani

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetarchitects@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitects+unsubscribe@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitects+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetarchitects@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitects+unsubscribe@googlegroups.com

Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
---
Você recebeu essa mensagem porque está inscrito no grupo ".Net Architects" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para dotnetarchitects+unsubscribe@googlegroups.com.

Renato Cantarino

unread,
Apr 13, 2018, 9:41:23 AM4/13/18
to dotnetar...@googlegroups.com
Isto é um problema com o IIS.
O redis, como o Mario mencionou, é a melhor saida!

Atenciosamente,
Renato Cantarino

Celular:  (61) 98511-7882

Felipe Oriani

unread,
Apr 13, 2018, 9:57:56 AM4/13/18
to dotnetar...@googlegroups.com
Obrigado pessoal.

Minha implementação para o cache é abstrata e fiz preparado para MemoryCache e Redis. Funciona com o Redis sim, mas testei muito pouco.  Muitos cenários aqui, onde precisaria compartilhar o cache entre outras frentes do projeto, o Redis atenderia melhor. Mas por hora, o MemoryCache tem atendido bem.

Cantarino e Mário, sabem me dizer se o Redis é pago? Eu olhei no website, mas não encontrei nada a respeito de licenças e valores. Apenas isso: https://redislabs.com/faqs/what-am-i-allowed-to-do-with-the-free-version/ - pelo visto precisaremos compra-lo!

Obrigado.




Renato Cantarino

unread,
Apr 13, 2018, 10:01:10 AM4/13/18
to dotnetar...@googlegroups.com
Tem 2 maneiras:

1 - em um servidor na sua rede, eu aconselho ser em um server separado.
2 - Ou no azure...

Mário Meyrelles

unread,
Apr 13, 2018, 10:13:33 AM4/13/18
to dotnetar...@googlegroups.com
É, tem a versão paga que te dá suporte e tal. E tem a versão free, que dá pra começar usando e que pro teu caso parece ser uma boa.

Quando você precisar chegar no nível de ter que pagar, os preços tão aqui. Não achei nada abusivo:



Felipe Oriani

unread,
Apr 13, 2018, 1:48:04 PM4/13/18
to dotnetar...@googlegroups.com
Obrigado pessoal,

Vamos avaliar aqui a viabilidade do Redis. 

Att,

Reply all
Reply to author
Forward
0 new messages