Corretora binária vergleich.
NET é um conjunto de ferramentas e tempo de execução para criar aplicativos altamente concorrentes, distribuídos e de tolerância ao comércio. O modelo de ator fornece uma maior capacidade de abstração para escrever sistemas concorrentes e distribuídos. Isso alivia o desenvolvedor de lidar com o bloqueio explícito e o gerenciamento de threads, facilitando a criação de sistemas simultâneos e paralelos do sistema. Os atores foram definidos como o papel de Carl Hewitt, mas foram divulgados pela linguagem Erlang e usados, por exemplo, na Ericsson com akka excelente para construir sistemas de telecomunicações altamente concorrentes e confiáveis. NET é projetado para funcionar em uma configuração distribuída: este esforço tem negociado para garantir que todas as funções estejam disponíveis igualmente ao serem executadas em um único processo ou em um conjunto de centenas de máquinas. A chave para habilitar isso é passar do modo de otimização remota para local akka em vez de tentar ir do local ao sistema por meio da generalização. Veja este documento clássico para uma discussão detalhada sobre o sistema que a segunda abordagem deve falhar. Quando um ator falha, seu pai pode recarregá-lo ou interrompê-lo, ou escalar a falha na hierarquia akka atores. Isso permite um sistema limpo de semântica para gerenciar akka em um sistema distribuído e concorrente e permite a escrita de sistemas de tolerância a falhas de negociação auto-curados. Siga nossa negociação e construa seu primeiro Akka. Saiba mais sobre Akka para a JVM aqui. Abstrações de alto nível como atores e FSM. Resiliente por Design Escreva sistemas que negociam. NET Extensions para adaptar Akka para atender às suas necessidades. Sistema NET lançado sob o Apache 2 akka. Modelo de ator O modelo de ator fornece uma maior negociação de abstração para a escrita de sistemas concorrentes e distribuídos. Distribuído por Predefinição Tudo em Akka. Conheça as pessoas por trás de Akka. Mantenha Atualizado Assine a nossa Newsletter ENVIAR.
3 pensamentos sobre & ldquo; Akka trading system & rdquo;
Então, se você não tiver sucesso em germinar sementes perfeitamente viáveis, você pode ser sua bunda porque é.
AlphaGo pode ficar aquém da cognição sobre-humana para o momento, mas certamente, ou programas semelhantes, superarão os maiores humanos no futuro.
Eles também são vistos como contribuintes para o movimento maior em direção à ciência dentro da sociedade.
Stephen Kennedy.
Engenheiro de software na pilha de tecnologia da Microsoft, com foco no desenvolvimento de sistemas nativos e em grande escala. Trabalha para Readify.
Seis meses de Akka.
Eu tenho usado o Akka em um projeto comercial real para uma grande organização que atua no setor financeiro. Este projeto está em desenvolvimento há 6 meses. Eu envolvi alguns dos meus pensamentos sobre o modelo de tecnologia / ator nesta publicação.
Conclusão.
Como Akka é um quadro, a maioria das pessoas está interessada em como ele se senta como um todo, antes de se detalhar. Muito do que eu encontrei provavelmente pode ser aplicado a outras implementações do modelo de ator, como Orleans.
Gostei muito da estrutura.
Muito parecido com a minha primeira incursão em F #, a Akka permite que você resolva os problemas de uma maneira diferente. Muitos dos benefícios da Akka são "divulgados" em torno das capacidades de agrupamento. E, embora estes sejam certamente aparentes e úteis, os padrões de design que você pode criar e usar são realmente o que me deixa entusiasmado com o modelo do ator e com essa tecnologia.
Eu achei que o teste de unidades automatizadas era mais difícil, e sua abordagem altamente desacoplada teve um impacto na coesão. Ele também vem com uma grande curva de aprendizado, particularmente aqueles novos para o modelo de ator e não familiarizados com os padrões de design baseados em mensagens ou com eventos.
Há também algum nível de investimento arquitetônico / design na utilização correta da estrutura, assim como qualquer ferramenta, você vai querer usá-la com sabedoria.
Eu não usaria Akka em todos os projetos. E eu certamente consideraria as implementações do modelo de ator alternativo com base no projeto. No entanto, definitivamente continuarei a investir o meu tempo na tecnologia com base nas minhas experiências com isso até à data.
Se você quiser saber mais sobre a Akka, eu altamente, altamente, recomendo o bootcamp gratuito da Petabridge.
Pensamentos aleatórios.
Não vou discutir todos os benefícios de Akka, Akka e do modelo de ator. Há muitos conteúdos que podem ser encontrados on-line para isso. O que eu vou falar são algumas das coisas menos óbvias que eu descobri.
Desocutem-me.
Akka está altamente desacoplada.
Os atores geralmente se comunicam ou se associam através de um IActorRef (ou equivalente). O que significa que você só pode dizer (disparar e esquecer) ou pedir (solicitar e responder) algo. Este IActorRef é um proxy, então você não consegue acessar ou transmitir diretamente para esse ator, mesmo que exista no mesmo processo.
Realmente ótimo para testes, preocupações separadas e agregação. Infelizmente, em bases de código maiores, o código pode ser menos coeso, e muitas vezes você se vê olhando para os tipos de mensagens para descobrir o fluxo do sistema. Ainda não é um dispendedor com um design sensível.
O modelo de simultaneidade de dois gumes.
Um dos pontos mais salientes da Akka é o seu modelo de concorrência.
Cada ator Akka tem duas filas de mensagens na frente dela (uma para mensagens de usuários, uma para mensagens de sistema). Akka garante que um ator só pode processar uma mensagem por vez.
Isso simplifica a lógica do aplicativo, porque você não precisa mais se preocupar com a proteção de concorrência ao executar o código dentro de um ator. Você pode se concentrar no domínio e na lógica de negócios.
No entanto, dado que na Akka tudo é concorrente, por padrão, torna os testes automatizados mais difíceis. Felizmente, Akka vem com um TestKit, o que torna os testes unitários muito mais simples de escrever e mais confiáveis. Infelizmente, na minha experiência, uma vez que você tenha um grande conjunto de testes automatizados, às vezes você pode obter falhas de teste aleatório. Isso é mais provável que ocorra em testes envolvendo um agendador (ou TestScheduler) e em testes mais próximos dos testes de integração, em vez de testes unitários.
Crianças, por isso você deve evitar escrever código que potencialmente engloba um tópico de fundo, assumindo que você deseja testá-lo, é claro.
Nota: ainda não investi o tempo suficiente para tentar rastrear o porquê nós conseguimos essas falhas aleatórias, pode ser que precisemos mudar o despachador. Mas, em nossa experiência, os problemas com o teste não são fáceis e aparentes para consertar.
Máquina de estado finito todas as coisas.
Eu amo o método de tornar Akka.
Isso simplifica o que normalmente seria atores complicados, e torna muito mais fácil raciocinar sobre seu propósito e funcionalidade.
Uma das principais maneiras de usar esse método é disponibilizar um ator para receber mensagens, enquanto não está pronto para processá-las. Fazemos um pedido para outro ator para obter os dados que esse ator precisa para processar mensagens. Todas as mensagens que não estão relacionadas ao carregamento do ator são escondidas, até que o ator esteja pronto para processar mensagens. (O que é outro chamado para se tornar, para mudar o estado dos atores)
Uma das minhas características favoritas da Akka.
A computação distribuída ainda é difícil.
Ok, essa não foi realmente uma surpresa.
Eu só queria salientar que, mesmo que a ferramenta lhe dê uma ótima estrutura para operar, você ainda terá que estar ciente e considerar os suspeitos habituais, como consenso, garantias de entrega de mensagens, partições de rede e qualquer outros tipos de falhas.
Você também terá que considerar o desempenho, particularmente em relação ao IO de rede. A equipe da Akka poderia escrever o melhor código de rede no mundo, mas se a sua comunicação é muito chatty ou contém grande carga de mensagens, isso não vai importar.
A transparência de localização é uma mentira.
Tudo bem, não inteiramente.
É verdade que, quando tudo que você tem é um IActorRef para outro ator, você não tem idéia (nem deveria se importar) se esse ator existir no mesmo processo ou em um processo diferente. Ainda dá os mesmos poderosos benefícios de escalabilidade, mas há algumas gotchas menos óbvias.
A seleção de ator somente por padrão funciona apenas no sistema de atores locais (ou seja, o mesmo processo). Você ainda pode fazer a seleção em um cluster com um roteador agrupado, mas não é tão idiomático. Você pode usar a seleção de ator remotamente, no entanto, você precisa conhecer o ponto final do host remoto. Ao criar atores através de adereços, esses adereços precisam ser serializados. Muitas vezes, você considera a mensagem e a interação entre os atores por motivos de desempenho antes de implantar ou se comunicar remotamente através do cluster.
O Estado não é mais o mal.
As aplicações da Web são um elemento básico do desenvolvimento de software. HTTP é inerentemente apátrida, no entanto, os aplicativos são inerentemente stateful.
Como desenvolvedores, tentamos colmatar essa lacuna usando construções como o estado da sessão e os cookies. Na minha opinião, estes são hacks. Eles causam todos os tipos de problemas, em termos de desempenho e escala.
Arquitetura e design típicos de n camadas gira em torno do uso de um banco de dados como uma loja de suporte para persistir no estado. Essas restrições limitam o design da solução e introduzem estrangulamentos no sistema.
Esta publicação do blog fala sobre como se pode implementar aplicações web com o modelo de ator.
Padrão de design são nós.
O modelo de ator abre alguns padrões de design realmente legais, abrindo muitos dos padrões baseados em mensagens que você pode ler.
A facilidade com que você pode implementar padrões, como pub / sub e padrões de agregação de mensagens, permite que você resolva os problemas de forma diferente da forma como você provavelmente normalmente faria.
Por exemplo, em um aplicativo típico, solicitações HTTP isoladas independentes podem carregar um produto com uma identidade específica. Um dos padrões que surgimos foi agregar esses pedidos individuais de dados em um, para enviar para o SQL. Isso limita a sobrecarga no banco de dados, uma vez que uma chamada maior geralmente é um desempenho melhor do que muitas pequenas chamadas.
Os atores têm identidade.
Akka tem seu próprio protocolo, akka. tcp. Como o protocolo HTTP com o qual seu navegador sabe interagir, o framework Akka também sabe interagir com este protocolo. Você pode se comunicar com atores em todo o cluster que você não estabeleceu nenhuma comunicação direta anterior.
Isso também significa que você pode hospedar suas entidades no sistema de ator. As entidades que armazenam e rastreiam o estado, como o inventário, podem ser acessadas com proteção de concorrência em todo o cluster. O acesso rápido à memória pode modificar esse estado, enquanto as escritas em armazenamento persistente podem ocorrer de forma assíncrona, pois a resposta é enviada de volta para o solicitante.
Cluster-lo.
O agrupamento de Akka é ótimo. Funciona como anunciado, e você tem muito poder e flexibilidade na forma como lida com o cluster.
Ao contrário de Orleans, você precisa pensar muito sobre como você vai distribuir o trabalho e a interação de mensagens, pois envolve menos magia. Dependendo da solução que você está desenvolvendo, isso pode ou não ser uma coisa boa.
Há alguns pontos difíceis quando você lida com o agrupamento.
sistema comercial Akka
Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
Scala Backtesting + Live Trading Framework, construído no topo da Akka / Spray.
Esta estrutura pode ser útil para pessoas que vêm do Scala background, que estão fazendo seus primeiros passos nas estratégias de negociação automáticas de back / live testando a API REST da Oanda, que é, na minha opinião, uma das melhores API de varejo disponíveis. Uma vez que este é um trabalho em progresso, se você é um entusiasta da Scala e está interessado em negociação automatizada, tenha uma olhada e sinta-se livre para repo e contribua!
Basta clonar o repo e deixar sua lógica comercial em StrategyFSM. scala. Não se esqueça de modificar AuthInfo. scala para incluir sua própria ID da conta e token de acesso para a API REST da Oanda.
Nota: Se você está simplesmente procurando uma maneira de se conectar à Oanda REST API usando Scala / Akka, confira meu projeto Scalanda.
&cópia de; 2017 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.
sistema comercial Akka
Recomendamos atualizar para o mais recente Safari, Google Chrome ou Firefox.
Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
A Ergodicity é uma plataforma de negociação automatizada baseada em atores de código aberto, fornecendo ferramentas para negociação orientada para a estratégia com o uso de dados de mercado de Nível 1 e Nível 2. A Ergodicity suporta a conectividade direta de dados de mercado com a Bolsa de Valores do "Russian Trading System" usando seu protocolo proprietário Plaza2 para execução em tempo real de baixa latência. Além disso, fornece mecanismo tick-by-tick backtest para executar as mesmas estratégias em dados históricos armazenados no MarketDb para análise de desempenho e otimização.
A Platfrom usa Scala como idioma primário e depende da arquitetura baseada em eventos usando Akka Actors para concorrência e escalabilidade.
O projeto MarketDb também é parte da plataforma de Ergodicity e usado para captura e captura de dados de mercado.
backtest - estratégias de captura de quadros de backtesting - captura de dados de mercado usando conectividade de mercado direto com RTS CGate API cgate - abstração baseada em ator em CGate núcleo - componentes principais da plataforma: pedido, OrderBook, Trade, Session etc. engine - esquema de mecanismo de execução de estratégia - projeto compartilhado para backtest e `capture 'com esquema de banco de dados.
A ergodicidade é construída usando a arquitetura conduzida por eventos. Todos os dados de mercado recebidos da Bolsa de Valores (comércio, adicionar ordem, cancelar pedido, atualizações de sessão, etc.) considerados como um evento. Componentes principais de uma plataforma apresentada como Atores: sessão de negociação, cada ação atribuída para sessão, cada ordem, etc. A Akka como espinha dorsal para a plataforma permite aproveitar esta abordagem e construir plataforma com tolerância a falhas e alta escalabilidade em sua natureza .
Para compilar projetos de Ergodicity, é necessário instalar a biblioteca CGate. Windows e Linux estão disponíveis no servidor RTS. Após a instalação, você deve adicionar o diretório $ CGATE_HOME / p2bin na variável $ Path para fornecer acesso à ferramenta de geração de código.
Consulte o projeto / SchemeTools. scala para obter detalhes.
&cópia de; 2017 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.
Simplificando o sistema de negociação com Akka.
Junte-se à comunidade DZone e obtenha a experiência dos membros completos.
Obtenha o Edge com um IDE Java profissional. Teste gratuito de 30 dias.
Meus colegas estão desenvolvendo um sistema de negociação que processa um fluxo bastante pesado de transações recebidas. Cada transação abrange um Instrumento (pensar vínculo ou estoque) e tem algumas (agora) propriedades sem importância. Eles estão presos com Java (& lt; 8), então vamos cumpri-lo:
O instrumento será usado mais tarde como uma chave no HashMap, então, para o futuro, implementamos pró-ativamente & lt; Instrument & gt; . Este é o nosso domínio, agora os requisitos:
As transações entram no sistema e precisam ser processadas (seja o que for que isso signifique), o mais rápido possível. É possível processá-las gratuitamente em qualquer ordem. No entanto, as transações para o mesmo instrumento precisam ser processadas sequencialmente na mesma ordem que elas vieram.
A implementação inicial foi direta - coloque todas as transações recebidas em uma fila (por exemplo, ArrayBlockingQueue) com um único consumidor. Isso satisfaz o último requisito, uma vez que a fila preserva o pedido de FIFO rigoroso em todas as transações. Mas essa arquitetura impede o processamento simultâneo de transações não relacionadas para diferentes instrumentos, desperdiçando assim uma melhoria da taxa de transferência. Não surpreendentemente, esta implementação, sem dúvida simples, tornou-se um gargalo.
Que nojo! Mas o pior ainda está por vir. Como você certifica-se de que, no máximo, um segmento processa cada fila por vez? Afinal, de outra forma, dois segmentos poderiam pegar itens de uma fila (um instrumento) e processá-los em ordem inversa, o que não é permitido. O caso mais simples é ter um Thread por fila - isso não será dimensionado, pois esperamos dezenas de milhares de instrumentos diferentes. Então, podemos dizer N threads e permitir que cada um deles manipule um subconjunto de filas, p. Ex. instrument. hashCode ()% N nos informa qual tópico cuida da fila dada. Mas ainda não é perfeito por três razões:
Um segmento deve "observar" muitas filas, muito provavelmente ocupadas, aguardando, iterando sobre elas o tempo todo. Alternativamente, a fila pode despertar o seu thread pai de alguma forma. No pior dos casos, todos os instrumentos terão códigos de hash conflitantes, visando apenas um tópico - o que efetivamente é o mesmo que a nossa solução inicial. O código bonito não é complexo!
Implementar esta monstruosidade é possível, mas difícil e propenso a erros. Além disso, há outro requisito não funcional: os instrumentos vão e vem e há centenas de milhares deles ao longo do tempo. Depois de um tempo, devemos remover entradas no nosso mapa que representam instrumentos que não foram vistos ultimamente. Caso contrário, obteremos um vazamento de memória.
Isso é simples. Uma vez que nosso ator Dispatcher é efetivamente unido, nenhuma sincronização é necessária. Nós quase não recebemos Transações, pesquisa ou criamos Processador e passamos a Transação ainda mais. É assim que a implementação do processador pode ser:
É isso aí! Curiosamente, a nossa implementação Akka é quase idêntica à nossa primeira idéia com o mapa das filas. Afinal, um ator é apenas uma fila e um tópico (lógico) que processa itens nessa fila. A diferença é: Akka gerencia pool de threads limitado e compartilha entre talvez centenas de milhares de atores. E porque cada instrumento tem seu próprio ator dedicado (e "single-threaded"), o processamento seqüencial de transações por instrumento é garantido.
Claramente, quando o Processador não recebeu nenhuma mensagem por um período de uma hora, ele sintetiza atentamente isso para o pai (Dispatcher). Mas o ator ainda está vivo e pode lidar com as transações se elas acontecem precisamente após uma hora. O que Dispatcher faz é que ele mata determinado processador e o remove de um mapa:
Houve uma leve inconveniência. instrumentProcessors costumava ser um Map & lt; Instrument, ActorRef & gt; . Isso provou ser insuficiente, já que de repente temos que remover uma entrada neste mapa por valor. Em outras palavras, precisamos encontrar uma chave (Instrumento) que mapeie para um determinado ActorRef (Processor). Existem diferentes maneiras de lidar com isso (por exemplo, o processador ocioso pode enviar um Instrumnt ele lida), mas, em vez disso, usei o BiMap & lt; K, V & gt; da goiaba. Isso funciona porque os Instrumentos e Atores são apontados como únicos (ator por instrumento). Tendo BiMap eu poderia simplesmente inverter () o mapa (do BiMap & lt; Instrument, ActorRef & gt; to BiMap & lt; ActorRef, Instrument & gt; e tratar o ActorRef como chave.
Obter o Java IDE que entende o código & amp; torna o desenvolvimento agradável. Nivele seu código com IntelliJ IDEA. Faça o download da versão de teste gratuita.
Como esse artigo? Leia mais do DZone.
Free DZone Refcard.
Começando com Scala.
Publicado em DZone com permissão de Tomasz Nurkiewicz, DZone MVB. Veja o artigo original aqui.
As opiniões expressas pelos contribuidores da DZone são próprias.
Recomendamos atualizar para o mais recente Safari, Google Chrome ou Firefox.
Puxe pedidos 0.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
A Ergodicity é uma plataforma de negociação automatizada baseada em atores de código aberto, fornecendo ferramentas para negociação orientada para a estratégia com o uso de dados de mercado de Nível 1 e Nível 2. A Ergodicity suporta a conectividade direta de dados de mercado com a Bolsa de Valores do "Russian Trading System" usando seu protocolo proprietário Plaza2 para execução em tempo real de baixa latência. Além disso, fornece mecanismo tick-by-tick backtest para executar as mesmas estratégias em dados históricos armazenados no MarketDb para análise de desempenho e otimização.
A Platfrom usa Scala como idioma primário e depende da arquitetura baseada em eventos usando Akka Actors para concorrência e escalabilidade.
O projeto MarketDb também é parte da plataforma de Ergodicity e usado para captura e captura de dados de mercado.
backtest - estratégias de captura de quadros de backtesting - captura de dados de mercado usando conectividade de mercado direto com RTS CGate API cgate - abstração baseada em ator em CGate núcleo - componentes principais da plataforma: pedido, OrderBook, Trade, Session etc. engine - esquema de mecanismo de execução de estratégia - projeto compartilhado para backtest e `capture 'com esquema de banco de dados.
A ergodicidade é construída usando a arquitetura conduzida por eventos. Todos os dados de mercado recebidos da Bolsa de Valores (comércio, adicionar ordem, cancelar pedido, atualizações de sessão, etc.) considerados como um evento. Componentes principais de uma plataforma apresentada como Atores: sessão de negociação, cada ação atribuída para sessão, cada ordem, etc. A Akka como espinha dorsal para a plataforma permite aproveitar esta abordagem e construir plataforma com tolerância a falhas e alta escalabilidade em sua natureza .
Para compilar projetos de Ergodicity, é necessário instalar a biblioteca CGate. Windows e Linux estão disponíveis no servidor RTS. Após a instalação, você deve adicionar o diretório $ CGATE_HOME / p2bin na variável $ Path para fornecer acesso à ferramenta de geração de código.
Consulte o projeto / SchemeTools. scala para obter detalhes.
&cópia de; 2017 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.
Simplificando o sistema de negociação com Akka.
Junte-se à comunidade DZone e obtenha a experiência dos membros completos.
Obtenha o Edge com um IDE Java profissional. Teste gratuito de 30 dias.
Meus colegas estão desenvolvendo um sistema de negociação que processa um fluxo bastante pesado de transações recebidas. Cada transação abrange um Instrumento (pensar vínculo ou estoque) e tem algumas (agora) propriedades sem importância. Eles estão presos com Java (& lt; 8), então vamos cumpri-lo:
O instrumento será usado mais tarde como uma chave no HashMap, então, para o futuro, implementamos pró-ativamente & lt; Instrument & gt; . Este é o nosso domínio, agora os requisitos:
As transações entram no sistema e precisam ser processadas (seja o que for que isso signifique), o mais rápido possível. É possível processá-las gratuitamente em qualquer ordem. No entanto, as transações para o mesmo instrumento precisam ser processadas sequencialmente na mesma ordem que elas vieram.
A implementação inicial foi direta - coloque todas as transações recebidas em uma fila (por exemplo, ArrayBlockingQueue) com um único consumidor. Isso satisfaz o último requisito, uma vez que a fila preserva o pedido de FIFO rigoroso em todas as transações. Mas essa arquitetura impede o processamento simultâneo de transações não relacionadas para diferentes instrumentos, desperdiçando assim uma melhoria da taxa de transferência. Não surpreendentemente, esta implementação, sem dúvida simples, tornou-se um gargalo.
Que nojo! Mas o pior ainda está por vir. Como você certifica-se de que, no máximo, um segmento processa cada fila por vez? Afinal, de outra forma, dois segmentos poderiam pegar itens de uma fila (um instrumento) e processá-los em ordem inversa, o que não é permitido. O caso mais simples é ter um Thread por fila - isso não será dimensionado, pois esperamos dezenas de milhares de instrumentos diferentes. Então, podemos dizer N threads e permitir que cada um deles manipule um subconjunto de filas, p. Ex. instrument. hashCode ()% N nos informa qual tópico cuida da fila dada. Mas ainda não é perfeito por três razões:
Um segmento deve "observar" muitas filas, muito provavelmente ocupadas, aguardando, iterando sobre elas o tempo todo. Alternativamente, a fila pode despertar o seu thread pai de alguma forma. No pior dos casos, todos os instrumentos terão códigos de hash conflitantes, visando apenas um tópico - o que efetivamente é o mesmo que a nossa solução inicial. O código bonito não é complexo!
Implementar esta monstruosidade é possível, mas difícil e propenso a erros. Além disso, há outro requisito não funcional: os instrumentos vão e vem e há centenas de milhares deles ao longo do tempo. Depois de um tempo, devemos remover entradas no nosso mapa que representam instrumentos que não foram vistos ultimamente. Caso contrário, obteremos um vazamento de memória.
Isso é simples. Uma vez que nosso ator Dispatcher é efetivamente unido, nenhuma sincronização é necessária. Nós quase não recebemos Transações, pesquisa ou criamos Processador e passamos a Transação ainda mais. É assim que a implementação do processador pode ser:
É isso aí! Curiosamente, a nossa implementação Akka é quase idêntica à nossa primeira idéia com o mapa das filas. Afinal, um ator é apenas uma fila e um tópico (lógico) que processa itens nessa fila. A diferença é: Akka gerencia pool de threads limitado e compartilha entre talvez centenas de milhares de atores. E porque cada instrumento tem seu próprio ator dedicado (e "single-threaded"), o processamento seqüencial de transações por instrumento é garantido.
Claramente, quando o Processador não recebeu nenhuma mensagem por um período de uma hora, ele sintetiza atentamente isso para o pai (Dispatcher). Mas o ator ainda está vivo e pode lidar com as transações se elas acontecem precisamente após uma hora. O que Dispatcher faz é que ele mata determinado processador e o remove de um mapa:
Houve uma leve inconveniência. instrumentProcessors costumava ser um Map & lt; Instrument, ActorRef & gt; . Isso provou ser insuficiente, já que de repente temos que remover uma entrada neste mapa por valor. Em outras palavras, precisamos encontrar uma chave (Instrumento) que mapeie para um determinado ActorRef (Processor). Existem diferentes maneiras de lidar com isso (por exemplo, o processador ocioso pode enviar um Instrumnt ele lida), mas, em vez disso, usei o BiMap & lt; K, V & gt; da goiaba. Isso funciona porque os Instrumentos e Atores são apontados como únicos (ator por instrumento). Tendo BiMap eu poderia simplesmente inverter () o mapa (do BiMap & lt; Instrument, ActorRef & gt; to BiMap & lt; ActorRef, Instrument & gt; e tratar o ActorRef como chave.
Obter o Java IDE que entende o código & amp; torna o desenvolvimento agradável. Nivele seu código com IntelliJ IDEA. Faça o download da versão de teste gratuita.
Como esse artigo? Leia mais do DZone.
Free DZone Refcard.
Começando com Scala.
Publicado em DZone com permissão de Tomasz Nurkiewicz, DZone MVB. Veja o artigo original aqui.
As opiniões expressas pelos contribuidores da DZone são próprias.
No comments:
Post a Comment