Como o modelo de kit de ferramentas CCR & DSS em comparação com outros escalabilidade e simultaneidade se aproxima?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Estou interessado em comparação entre várias abordagens para escalabilidade e concorrência, incluindo CCR & DSS modelo de quadro. Eu estaria especialmente interessado com a comparação com concurency estilo Hadoop e Erlang

Foi útil?

Solução

Eu olhei CCR, DSS e Erlang, embora destes, tenho enviado somente CCR em código de produção significativa. Eu nunca olhei para Hadoop.

simultaneidade de Erlang deriva da sua implementação do modelo de Ator. Cada 'processo' tem uma caixa de correio e recupera mensagens a partir dele, um de cada vez. Um processo sem mensagens para lidar com blocos sem fio. Por outro lado, processos com trabalho a fazer estão programadas através cpu disponível com nenhuma das máquinas subjacente exposta. Além disso, os processos de comunicar via mensagem de passagem com qualquer clonagem / imutabilidade garantindo que P1 e P2 não logicamente compartilhar as mensagens que passam entre eles.

O meu sentimento é que é a natureza não-bloqueio de mensagem de envio e recepção que dá Erlang sua reputação de escalabilidade em um único (possivelmente multi-core) da máquina. Essencialmente, processos com trabalho a fazer são programados de forma eficiente através dos recursos disponíveis e processos quiescentes consumir nada além de memória. Ao processar uma mensagem ao mesmo tempo, cada estabilidade mensagem garantindo, o desenvolvedor não tem mais que se preocupar com coisas como 'raça-condições'.

CCR é um conjunto de baixo nível passagem de mensagens primitivos assíncronos. Uma das mais simples é Receba que faz um receber a la Erlang. Mas existem primitivas mais sofisticados, tais como Junte-(receber uma mensagem de todos alguns canais) e Choice (receber uma mensagem a partir de qualquer de alguns canais), que podem ser aninhadas e compostas em formas interessantes. Essas primitivas também são não-bloqueio. Receptores gerar tarefas (para lidar com as mensagens) em filas de tarefas 1..N, que são servidos por um pequeno número de threads.

Meu palpite é que, ignorando (importante!) Diferenças de plataforma, as rotinas básicas tarefa de agendamento de cada um são basicamente na mesma bola-parque. No entanto, Erlang é uma linguagem e uma plataforma com um modelo fixo (Ator) cozido. O CCR é nenhuma dessas coisas, é apenas uma biblioteca e você pode usar / abusar dela mais livremente.

DSS é um modelo de programação, que se baseia na CCR. Tem serviços (Erlang = processos), obriga mensagem assíncrona de passagem (com clonagem completo por padrão) como a única forma de comunicação inter-serviços, ea única lidar com o mundo exterior tem de um serviço é a sua URI (Erlang = PID) . Como Erlang, não há essencialmente nenhuma diferença entre invocando um serviço local e remoto um, embora (de) serialização ocorre neste último caso.

DSS também tem um modelo RESTful, o que significa que os serviços normalmente expor um conjunto fixo e comum de operações, e que o estado do serviço deve ser considerado um recurso manipulado por estas operações. Compare isso com Erlang, onde as mensagens arbitrárias podem ser enviados para um processo. serviços DSS podem usar o conjunto completo de primitivas CCR em falar com outros serviços, que pode ser muito útil para coisas como distribuída operações de dispersão-se reúnem.

Em última análise, DSS é apenas um quadro com bibliotecas de suporte, e não uma língua ou VM, então não há muito mais 'cerimônia' envolvido em escrever sequer um único serviço DSS em vez de escrever um processo de Erlang.

Em termos de concorrência, todos fornecem os primitivos necessários para escrever código que é seguro e eficiente em vários threads de execução, sem se preocupar com os fios de execução. Eu acho que é onde a maioria dos desenvolvedores querem estar título.

Em termos de escalabilidade, que é uma mais difícil a responder como isso é tanto sobre o projeto do sistema, pois é as ferramentas utilizadas. Você escalabilidade média em um único nó, ou seja, como você adicionar núcleos, ou como você adicionar nós? CCR tem nada a dizer sobre o último. Ambos apoio DSS e Erlang bastante eficientes formatos binários para a transmissão fio. DSS herda sua visão orientada para o recurso do mundo diretamente de http, o que deve dizer algo sobre a sua potencial escalabilidade, mas ele faz isso em algumas restrições no programamodelo ming.

Um par de pontos técnicos. Um serviço DSS único consome mais memória (~ 2K) do que um único processo erlang (300-400 bytes). Além disso, cada serviço DSS obtém sua própria fila de tarefas e não há um limite superior (~ 10000) sobre o número de-tarefa filas que podem ser eficientemente processadas pelo CCR. Eu não tenho os números em qualquer desses limites superiores para Erlang, mas suspeito que pode ser maior do que isso.

Dito tudo isso, se você estiver na plataforma .NET que você estaria fazendo um favor a si, tendo um olhar sério na CCR. Eu achei que fosse muito poderosa, especialmente para programas orientados a eventos reativos.

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