Como posso implementar melhor o 'cache até novo aviso' com o memcache em várias camadas?

5

o termo "cliente" usado aqui não está se referindo ao navegador do cliente, mas ao servidor cliente

Antes do fluxo de trabalho do cache

1. client make a HTTP request -->
2. server process -->
3. store parsed results into memcache for next use (cache indefinitely) -->
4. return results to client -->
5. client get the result, store into client's local memcache with TTL

Após o fluxo de trabalho do cache

1. another client make a HTTP request -->
2. memcache found return memcache results to client -->
3. client get the result, store into client's local memcache with TTL

TTL = hora de viver

É possível saber quando os dados foram atualizados,
e para expirar o (s) memorando (s) relevante (s) em conformidade.

No entanto, as armadilhas no cache do site cliente TTL

  1. Qualquer atualização de dados antes do TTL não é captada pelo memcache do cliente.
  2. De maneira inversa, onde não há atualização, o memcache do cliente ainda expira após o TTL
  3. Primeira solicitação (ou solicitações simultâneas) após o cache O TTL será acelerado, já que precisa repetir o "Antes do fluxo de trabalho do cache"

No caso em que o cliente exige várias solicitações HTTP em uma única página da Web,
pode ser muito ruim no desempenho.

A solução ideal deve ser cliente para cache indefinidamente até aviso prévio .

Aqui estão as três propostas sobre aviso adicional

Proposta 1: Use o cabeçalho HTTP (implementação atual)

1. client sent HTTP request last modified time header
2. server check if last data modified time=last cache time return status 304
3. client based on header to decide further processing

GOOD?
----
- save some parsing for client
- lesser data transfer

BAD?
----
- fire a HTTP request is still slow
- server end still need to process lots of requests

Proposta 2: Emita consistentemente uma solicitação HTTP para verificar todos os horários modificados pela última vez

1. client fire a HTTP request
2. server to return last modified time for all data group
3. client compare local last cache time with the result
4. if data group last cache time < server last modified time 
   then request again for that data group only

GOOD?
----
- only fetch what is no up-to-date
- less requests for server

BAD?
----
- every web page require a HTTP request

Proposta 3: Informe ao cliente quando novos dados estiverem disponíveis (Push)

 1. when server end notice there is a change on a data group
 2. notify clients on the changes
 3. help clients to fetch again data
 4. then reset client local memcache after data is parsed

GOOD?
----
- let the cache act/behave like a true cache

BAD?
----
- encourage race condition

Minha preferência está na proposta 3,
e algo como Gearman poderia ser ideal para você Onde há uma mudança, o servidor Gearman envia a tarefa para vários clientes (trabalhadores).

Estou louco?
(Eu sei que meu primeira pergunta é um pouco louco)

    
por ajreal 09.09.2011 / 16:54
fonte

2 respostas

1

A proposta 3 é certamente a mais eficiente, mas também é a mais demorada de implementar. O Memcache não inclui esse recurso, então você teria que encontrar outro framework ou rodar o seu próprio framework (usando o Gearman neste caso). Não é super difícil, mas não é trivial e adiciona uma parte significativa ao seu sistema que pode falhar. Eu me certificaria de fazer toda a pesquisa apropriada antes de me comprometer com qualquer decisão. Você pode achar que a proposta 1/2 não será um grande gargalo afinal de contas e você pode economizar vários dias.

    
por 10.09.2011 / 02:41
fonte
-3

Você conhece sua preferência, por isso é mais provável que seja a correta para sua situação. Eu sugiro que você vá em frente.

O HTTP foi projetado para ser sem estado. O HTTP também possui um padrão bem definido de armazenamento em cache. link

Obviamente, o HTTP também é projetado para separar implementações de cliente e servidor. Se você puder controlar ambos, poderá criar seu próprio protocolo leve que permitiria seu método preferido com a tecnologia push.

A única pergunta que pude encontrar foi "Estou louco?" E a resposta é não, todas são sugestões válidas para diferentes cenários, dependendo de vários fatores, como carga, sensibilidade de tempo dos dados, e muitos dos quais eu não tenho conhecimento.

    
por 09.09.2011 / 20:09
fonte