O que é uma maneira RESTful de monitoramento de um recurso REST para alterações?

StackOverflow https://stackoverflow.com/questions/405950

  •  03-07-2019
  •  | 
  •  

Pergunta

Se houver um recurso REST que eu quero para monitorar alterações ou modificações de outros clientes, o que é a melhor maneira (e mais RESTful) de fazê-lo?

Uma idéia que eu tive para fazê-lo é através de recursos específicos que irão manter a conexão aberta em vez de retornar imediatamente se o recurso não existe (ainda). Por exemplo, dado o recurso:

/game/17/playerToMove

a "GET" neste recurso pode me dizer que é a vez do meu adversário se mover. Ao invés de continuamente polling este recurso para saber quando é a minha vez de se mover, eu poderia anotar o número do movimento (digamos 5) e tentar recuperar o movimento seguinte:

/game/17/move/5

Em um modelo de descanso "normal", parece um pedido GET para essa URL retornaria um erro 404 (não encontrado). No entanto, se em vez disso, o servidor manteve o aberto conexão até que o meu adversário jogou seu movimento, ou seja:.

PUT /game/17/move/5

, em seguida, o servidor poderia retornar o conteúdo que meu PUT adversário para esse recurso. Isto tanto fornecer-me com a necessidade de dados I, bem como um tipo de notificação para quando o meu adversário mudou-se sem a necessidade de votação.

É este tipo de esquema de RESTful? Ou faz isso viola algum tipo de princípio resto?

Foi útil?

Solução

As suas propostas sons solução como longo polling , o que poderia funcionar muito bem.

Você gostaria de pedir /game/17/move/5 eo servidor não irá enviar quaisquer dados, até movimento 5 foi concluída. Se a conexão cair, ou você recebe um desconto de tempo, você simplesmente reconectar até obter uma resposta válida.

A vantagem desta é que é muito rápido - assim que o servidor tem novos dados, o cliente vai buscá-la. Também é resistente a quedas de conexão, e funciona se o cliente está desligado por um tempo (você pode solicitar /game/17/move/5 uma hora depois de ter sido movido e obter os dados instantaneamente, em seguida, passar para move/6/ e assim por diante)

O problema com longa sondagem é cada laços "poll" um segmento do servidor, que quebra rapidamente servidores como o Apache (como ele é executado fora de trabalhador-threads, por isso não podemos aceitar outros pedidos). Você precisa de um servidor web especializada para atender as solicitações longo de votação .. O Python módulo twisted (um " um motor de rede orientada a eventos ") é ótimo para isso, mas é mais trabalho do que a checagem regular ..

Em resposta ao seu comentário sobre Jetty / Tomcat, eu não tenho nenhuma experiência com Java, mas parece que ambos utilizam um sistema semelhante pool-de-worker-threads para Apache, por isso vai ter o mesmo problema. Eu fiz encontrar este post que parece endereço exatamente este problema (para Tomcat)

Outras dicas

este artigo propondo um novo cabeçalho HTTP: "Quando-Modified-After", que faz essencialmente a mesma coisa -. o servidor aguarda e mantém a conexão aberta até que o recurso seja modificado

Eu prefiro uma abordagem baseada na versão em vez de uma abordagem baseada em timestamp, já que é menos propenso a condições de corrida e lhe dá um pouco mais de informação sobre o que é que você está recuperando. Quaisquer pensamentos para essa abordagem?

Eu sugiro a 404, se o seu cliente pretende é um navegador web, como manter o aberto conexão pode bloquear ativamente solicitações do navegador do cliente para o mesmo domínio. Cabe ao cliente quantas vezes a votação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top