Pergunta

Eu notei dois métodos para "passar a mensagem". Um que eu vi o uso de Erlang e o outro é do python sem pilha. Pelo que entendi aqui está a diferença

Estilo Erlang - As mensagens são enviadas e filmadas na caixa de correio do processo de recebimento. A partir daí, eles são removidos em uma base FIFO. Depois que o primeiro processo envia a mensagem, ele é gratuito para continuar.

Estilo Python - Processe uma fila para enviar para o processo B. B está atualmente executando alguma outra ação; portanto, a está congelado até que B esteja pronto para receber. Depois que B abre um canal de leitura, A envia os dados, os dois continuam.

Agora vejo os profissionais do método Erlang, sendo você não ter nenhum processo bloqueado. Se B nunca conseguir receber, A ainda pode continuar. No entanto, notei em alguns programas que escrevi, que é possível que as caixas de mensagens de Erlang cheguem a centenas (ou milhares) de mensagens, uma vez que a entrada de mensagens é maior que a saída.

Agora, não escrevi um grande programa em qualquer estrutura/idioma, por isso estou me perguntando que suas experiências estão com isso e, se for algo com o qual devo me preocupar.

Sim, eu sei que isso é abstrato, mas também estou procurando respostas bastante abstratas.

Foi útil?

Solução

Minha experiência na programação de Erlang é que, quando você espera uma alta taxa de mensagens (ou seja, um produtor mais rápido que o consumidor), adiciona seu próprio controle de fluxo. Um cenário simples

  • O consumidor irá: enviar mensagem, aguarde o ACK e repita.
  • O produtor irá: aguarde a mensagem, envie ACK quando a mensagem recebida e processada e repita.

Pode -se também invertê -lo, o produtor espera que o consumidor venha e pegue as próximas mensagens disponíveis.

Essas abordagens e outro controle de fluxo podem ser ocultas por trás das funções, a primeira já está disponível em gen_server:call/2,3 contra a gen_server Processo de comportamento OTP.

Eu vejo mensagens assíncronas como em Erlang como a melhor abordagem, pois quando as latências são altas, você pode evitar uma sincronização ao fazer mensagens entre os computadores. Pode -se então compor maneiras inteligentes de implementar o controle de fluxo. Digamos, exigindo um ACK do consumidor para cada N Mensagens que o produtor o enviou ou envie um "Mensagem de Ping Me quando você recebeu essa mensagem" de vez em quando, para contar o tempo de ping.

Outras dicas

Em termos gerais, são filas ilimitadas vs filas limitadas. Um canal sem pilha pode ser considerado um caso especial de uma fila com tamanho 0.

As filas limitadas tendem a um impasse. Dois threads/processos tentando enviar uma mensagem um para o outro, ambos com uma fila completa.

Filas ilimitadas têm falha mais sutil. Uma caixa de correio grande não atende aos requisitos de latência, como você mencionou. Vá longe o suficiente e acabará transbordando; Não é uma memória infinita, por isso é realmente apenas uma fila limitada com um limite enorme que aborta o processo quando cheio.

Qual é melhor? É difícil dizer. Não há respostas fáceis aqui.

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