É verdade que, para o Observer Pattern funcionar, provavelmente existe algum mecanismo de polling por baixo?

5

A pergunta curta é: é verdade que, para o Observer Pattern funcionar, provavelmente há algum mecanismo de pesquisa por baixo? (atualização: em uma situação de rede)

Foi incrível que, se no meu Macbook Pro, eu salvasse um arquivo Hello World.txt na pasta do Dropbox, então eu realmente o veria aparecendo no meu outro Macbook dentro de 1 segundo ou 2.

É ainda mais surpreendente que, no outro Macbook, faça uma pesquisa em Hello como correspondência de nome e que Hello World.txt tenha aparecido como um resultado de pesquisa, e agora vou ao meu Macbook Pro e renomeie o arquivo como Hello World HiHi.txt , após 1 segundo ou 2, então o novo nome realmente apareceu no resultado da pesquisa do outro Macbook. Ou seja, os resultados da pesquisa provavelmente observam em qualquer alteração de pasta, e a pasta observa no estado do Dropbox as alterações remotamente no site do Dropbox.

Portanto, estou supondo que o aplicativo Dropbox provavelmente tem uma conexão TCP / IP bidirecional para que, o servidor Dropbox possa iniciar uma mensagem no aplicativo de fundo do Dropbox do Macbook, dizendo "Ei, o conteúdo da pasta foi alterado no servidor "e, em seguida, o aplicativo de fundo do Dropbox no meu Macbook fará a renomeação e meu objeto de pasta (o modelo ou o objeto de dados) notificará o objeto de pasta de pesquisa," Ei, meu conteúdo foi alterado "e a pasta de pesquisa objeto, em seguida, notificará o objeto de exibição de pasta, dizendo: "Ei, o resultado da pesquisa foi alterado (e assim você provavelmente deseja atualizar a exibição na tela)".

Então, eu acho que talvez seja mais ou menos assim que funcionou? Mas a questão é, se não havia conexão bidirecional TCP / IP, então é verdade que o aplicativo de fundo do Dropbox terá que pesquisar o servidor Dropbox a cada 1 ou 2 segundos para perguntar "alguma coisa mudou?" E isso será muito ocupado para o servidor Dropbox.

No entanto, não é verdade que mesmo que haja uma configuração de comunicação bidirecional, algumas abaixo das camadas TCP / IP (as 7 camadas OSI), existe algum tipo de pesquisa?

Por exemplo, o servidor Dropbox, no nível muito baixo, não pode enviar um elétron para meu roteador, notificando o meu Macbook, porque se houver um firewall, então, de alguma forma, do meu lado, deve haver algum tipo de pesquisa em nível baixo, ou então o servidor Dropbox não pode passar pelo meu firewall.

Ou, se visto desta maneira: se eu estiver usando WiFi no meu Macbook, provavelmente não há mecanismo de servidor Dropbox empurrando algo para o meu roteador sem fio, e então usar onda eletromagnética para empurrar para o meu Macbook, para me avisar? Ou seja, meu Macbook precisa perguntar constantemente ao roteador sem fio "alguma coisa nova para mim?" Porque se o Macbook não perguntar - se o Macbook travou ou se o firmware do Macbook caiu e não está perguntando, não há realmente nenhum "empurrão de dados" do roteador sem fio para o Macbook. O Macbook realmente precisa "perguntar constantemente".

Não é semelhante ao caso que, se o JavaScript em um navegador não tivesse uma conexão bidirecional (antes do HTML5), de alguma forma ainda poderíamos ter o servidor web "notifique o código JavaScript do navegador", mas haverá alguns tipo de pesquisa embaixo escrito em JavaScript, para simular uma conexão bidirecional?

Update: Eu não quero dizer polling necessário para o servidor, mas eu apenas quero dizer algum tipo de mecanismo tem que constantemente olhar para ver se há algo novo , contra se é Observer Pattern dentro do código em um aplicativo, a CPU simplesmente "salta" para o código para executar o código do observador e, portanto, o observador realmente não precisa fazer nada. Mas para o padrão Observer em uma rede, o que quero dizer é, digamos, se você tem seu notebook usando Wi-Fi e desliga seu Wifi, então o Observer Pattern não funcionará. Agora você liga o Wifi, mas o firmware Wifi ou hardware realmente tem que constantemente "perceber" se algo novo chegou, porque o sinal Wifi não tem como "forçar o computador", não como o processador Intel pode simplesmente "pular" "para um pedaço de código. Portanto, se o firmware ou o hardware precisa constantemente "perceber" se há algo novo, é o que quero dizer com pesquisa - o Observer não pode estar totalmente à espera; algum mecanismo precisa verificar constantemente algo.

    
por 太極者無極而生 21.12.2015 / 18:55
fonte

4 respostas

4

Na verdade, acho que você conseguiu isso de trás pra frente. No nível baixo da internet, não existe o polling. Tudo na internet realmente empurra.

Mensagens na Internet são feitas de pacotes, que são basicamente grupos de elétrons viajando pelos fios. Do ponto de vista do computador, os pacotes simplesmente aparecem como elétrons descendo um fio ou ondas eletromagnéticas sendo detectadas pelo rádio. Nada pede pacotes, eles recebem pacotes enviados pelo meio de comunicação.

Quando você visita um site, o que acontece é que você envia um monte de pacotes para o servidor, que responde enviando um monte de pacotes de volta. Pensamos nisso como pesquisa, porque você enviou os pacotes primeiro instanciando a solicitação. Mas no nível baixo da internet, o que aconteceu foi que você enviou mensagens para o servidor, e o servidor apenas enviou mensagens para você mais tarde.

For example, the Dropbox server, at the very low level, cannot push an electron to my router, notifying my Macbook, because what if there is a firewall, then somehow, on my side, there must be some kind of polling at low level, or else the Dropbox server cannot push through my firewall.

Não, o firewall aceita todos os elétrons em todos os pacotes que são enviados para ele. Simplesmente joga fora os pacotes que julga suspeitos. No caso de dropbox, porque o seu computador estava falando com dropbox, ele não considera o pacote suspeito e, portanto, encaminha os pacotes.

That is, my Macbook has to constantly ask the wireless router, "any thing new for me?"

Não, o seu Macbook nunca pergunta se há algo novo. Em vez disso, escuta um sinal sem fio do roteador. O roteador basicamente assume que o Macbook sempre quer as mensagens e as envia assim que elas chegam.

Isn't it similar to the case that, if JavaScript on a browser had no two-way connection (before HTML5), somehow we can still have the web server "notify the browser's JavaScript code", but there will be some kind of polling underneath written in JavaScript, to simulate a two-way connection?

Não, o JavaScript foi restrito devido a uma peculiaridade de como ele foi desenvolvido. A tecnologia de internet subjacente sempre apoiou totalmente a comunicação bidirecional.

    
por 21.12.2015 / 23:01
fonte
1

Na prática, isso geralmente é verdade, mas apenas porque o padrão Observer é frequentemente usado como uma abstração em cima de algum mecanismo de pesquisa existente. Não há nada que impeça você de usar os Observadores sobre os mecanismos que não são de pesquisa.

O exemplo típico de um sistema de evento / observador implementado no topo da sondagem são eventos de teclado / mouse. O sistema operacional lida com o hardware e informa a cada aplicativo quando ele vê que até mesmo o aplicativo estaria interessado.

Minha motivação típica para usar um sistema de evento / observador quando nenhuma pesquisa está acontecendo é dissociar diferentes partes de um programa que não deve saber muito sobre o outro. Por exemplo, se o seu programa se inscrever para novas postagens de troca de pilha, sua classe Assinante poderá disparar um evento NewPost que todas as suas classes de interface do usuário ouvirão. Dessa forma, o Assinante nunca precisa saber quais são as classes da interface do usuário ou quais eventos elas se importam. Esta página tem alguns exemplos mais detalhados .

O que é verdade no nível mais baixo é que deve haver algum hardware ou software ativo o tempo todo para gerar eventos. Isso pode ser tão baixo quanto um sinal de entrada causando interrupções de hardware, ou tão alto quanto um "loop de jogo" chamando os jogadores de AI a cada quadro para gerar vários eventos para as classes de interface do usuário. Eu não classificaria esses dois exemplos como "polling", embora eu suponha que você poderia, se você realmente quisesse.

    
por 21.12.2015 / 20:41
fonte
0

Claro, se ninguém notificá-lo automaticamente sobre uma alteração, você deverá solicitar explicitamente uma atualização, periodicamente ou sempre que realmente precisar.

Mas se você usa TCP, UDP ou qualquer outra coisa, pois o protocolo subjacente não é importante, o importante é saber se a comunicação é bidirecional ou estritamente unidirecional.

    
por 21.12.2015 / 19:16
fonte
0

O polling é uma construção de software e geralmente é ineficiente para operações de E / S de baixo nível.

Quando você renomeia um arquivo e a propagação vai para outro pc ligado, são muitas formas do padrão observador, desde o clique do mouse para iniciar a operação de renomeação, até o arquivo alterado na pasta observada no outro pc.

O Observer é uma variante do publish-subscribe e se aplica até mesmo na camada de rede ou de dados. Veja link para o TCP Analogia de endereçamento UDP.

O hardware é projetado para gerar interrupções quando as coisas acontecem. O software que aceita interrupções também é semelhante ao padrão Observer. Dentro do hardware, você pode pensar nele como "constantemente perguntando" ou sentindo se algo importante aconteceu, então o software não precisa.

    
por 22.12.2015 / 05:45
fonte