четверг, 17 мая 2018 г.

Sistema de negociação de publicação


ATR Channel Breakout Trading System.
Você encontrará mais abaixo as regras e explicações para o sistema de negociação ATR Channel Breakout. É um sistema clássico de tendências, disponível no domínio público.
ATR Canal Breakout Trading System no Sabedoria Estado da tendência seguinte.
Usando vários sistemas clássicos de tendências, como o Sistema de Negociação de Arom Channel Breakout, publicamos o Relatório de Sabedoria do Estado da Tendência mensalmente. O relatório foi construído para refletir e rastrear o desempenho genérico das tendências seguidas como uma estratégia de negociação.
O índice composto é composto por uma combinação de sistemas simulados em múltiplos prazos e uma carteira de futuros, selecionados na faixa de mais de 300 mercados de futuros em mais de 30 bolsas, que a Wisdom Trading pode oferecer aos clientes. O portfólio é global, diversificado e equilibrado nos principais setores.
Publicamos atualizações ao relatório todos os meses.
Subscrever é a melhor maneira de acompanhar e acompanhar o desempenho da tendência seguindo regularmente.
O sistema ATR Channel Breakout explicado.
O Sistema de Negociação de Arom Channel Breakout é uma variação no Sistema de Bollinger Breakout que usa Average True Range em vez de desvio padrão como medida da volatilidade que define a largura dos canais ou bandas.
Uma variação do sistema ATR Channel Breakout foi popularizada como o sistema PGO pelo comerciante Mark Johnson no Chuck LeBeau & # 8217; s System Trader & # 8217; s Club e em outros lugares. Esta versão, o Sistema de Negociação de Arom Channel Breakout, é mais flexível e permite o teste de diferentes limites de entrada e saída.
O sistema ATR Channel Breakout é uma forma de sistema breakout que compra no próximo aberto quando o preço fecha acima do topo do Canal ATR, e sai quando o preço se fecha novamente dentro do canal. As entradas curtas são o espelho oposto com a venda acontecendo quando o preço fecha abaixo do fundo do canal ATR.
O sistema de negociação ATR Channel Breakout se baseia em uma quebra da banda de volatilidade onde a volatilidade é medida usando o intervalo médio verdadeiro (ATR). O centro do Canal ATR é definido por uma Média Móvel Exponencial dos preços de fechamento usando um número de dias definido pelo parâmetro Close Average Days. A parte superior e inferior do canal ATR são definidas usando um múltiplo fixo de ATR a partir da média móvel especificada pelo parâmetro Entry Threshold.
O sistema de comércio ATR Channel Breakout entra no aberto após um dia que fecha no topo do canal ATR ou abaixo da parte inferior do canal ATR. O sistema sai após um fechamento abaixo do Canal de Saída que é definido usando um múltiplo fixo de ATR a partir da média móvel especificada pelo parâmetro Sair do Limiar.
Este sistema de comércio ATR Channel Breakout é semelhante ao Bollinger Breakout Trading System, exceto que usa Average True Range em vez do desvio padrão como medida da volatilidade que define a largura do canal.
Por exemplo, um Limite de Entrada de 3 e um Limite de Saída de 1 fariam com que o sistema entrasse no mercado quando o preço fechou mais de 3 ATR acima da média móvel e para sair quando o preço subseqüentemente caiu abaixo de 1 ATR acima da média móvel. NOTA: O limite de saída pode ser um número negativo que fará com que o sistema saia somente depois que o preço venha algum valor através da média móvel.
O sistema de negociação ATR Channel Breakout inclui quatro parâmetros que afetam as entradas:
O número de dias na Média móvel exponencial para o alcance real médio.
O número de dias na Média de Movimento Exponencial de fechamentos diários que forma o centro do canal ATR.
A largura do canal em ATR. Isso define tanto a parte superior como a inferior do canal. O sistema compra ou vende para iniciar uma nova posição quando o preço de fechamento cruza o preço definido por esse limite.
Se for definido como zero, o sistema irá sair quando o preço fechar abaixo da média móvel. Se estiver configurado para algum número maior, o sistema irá sair quando o preço se fechar abaixo do limite especificado. Um limite de saída negativo significa que o canal de saída está abaixo da média móvel para uma posição longa.
Sua versão personalizada desse sistema.
Podemos fornecer uma versão personalizada deste sistema para atender aos seus objetivos de negociação. Seleção / diversificação de portfólio, prazo, capital inicial & # 8230; Nós podemos ajustar e testar qualquer parâmetro para suas necessidades.
Entre em contato conosco para discutir e / ou solicitar um relatório de simulação personalizado completo.
Sistemas alternativos.
Além dos sistemas de negociação pública, oferecemos aos nossos clientes vários sistemas de negociação proprietários, com estratégias que vão desde a tendência a longo prazo até a reversão média de curto prazo. Nós também fornecemos serviços de execução completa para uma solução de negociação de estratégia totalmente automatizada.
Por favor, clique na imagem abaixo para ver nosso desempenho nos sistemas de negociação.
Divulgação de risco exigida pela CFTC para resultados hipotéticos.
Os resultados de desempenho hipotéticos têm muitas limitações inerentes, algumas das quais estão descritas abaixo. Nenhuma representação está sendo feita que qualquer conta será ou provavelmente conseguirá lucros ou perdas semelhantes às exibidas. na verdade, há freqüentemente diferenças acentuadas entre resultados de desempenho hipotéticos e os resultados reais posteriormente alcançados por qualquer programa comercial específico.
Uma das limitações dos resultados de desempenho hipotéticos é que eles geralmente são preparados com o benefício de retrospectiva. Além disso, a negociação hipotética não envolve risco financeiro, e nenhum registro de negociação hipotético pode explicar completamente o impacto do risco financeiro na negociação real. Por exemplo, a capacidade de suportar perdas ou de aderir a um determinado programa de negociação, apesar das perdas comerciais, são pontos importantes que também podem prejudicar os resultados comerciais reais. Existem inúmeros outros fatores relacionados aos mercados em geral ou à implementação de qualquer programa de negociação específico que não possa ser totalmente contabilizado na elaboração de resultados de desempenho hipotéticos e todos os quais podem prejudicar os resultados comerciais reais.
O Wisdom Trading é um corretor de introdução registado no NFA.
Oferecemos serviços globais de corretagem de commodities, consultoria de futuros gerenciados, serviços de negociação de acesso direto e serviços de execução de sistemas comerciais para indivíduos, empresas e profissionais da indústria.
Como um corretor de introdução independente, mantemos relações de compensação com vários comerciantes principais da Comissão de Futuros em todo o mundo. Vários relacionamentos de compensação nos permitem oferecer aos nossos clientes uma ampla gama de serviços e excepcionalmente ampla gama de mercados.
Nossos relacionamentos de compensação oferecem aos clientes acesso 24 horas ao mercado de futuros, commodities e câmbio em todo o mundo.
O comércio de futuros envolve um risco substancial de perda e não é adequado para todos os investidores. O desempenho passado não é indicativo de resultados futuros.

Sistema de comércio de tartarugas.
O sistema de comércio de tartarugas (regras e explicações abaixo) é uma tendência clássica que segue o sistema. Usando vários sistemas clássicos de tendências, publicamos o Relatório de Sabedoria do Estado da Tendência mensalmente. O relatório foi construído para refletir e rastrear o desempenho genérico das tendências seguidas como uma estratégia de negociação.
O índice composto é composto por uma combinação de sistemas (semelhante ao sistema Turtle), simulados em múltiplos prazos e um portfólio de futuros, selecionados na faixa de mais de 300 mercados de futuros ao longo de mais de 30 centrais que a Wisdom Trading pode oferecer aos clientes. O portfólio é global, diversificado e equilibrado nos principais setores.
Publicamos atualizações ao relatório todos os meses.
O sistema de comércio de tartarugas explicado.
O Turtle Trading System negocia com breakouts semelhantes a um sistema Donchian Dual Channel. Existem duas figuras de fuga, uma fuga mais longa para a entrada e uma fuga mais curta para a saída. O sistema também usa opcionalmente uma entrada de dupla duração onde a entrada mais curta é usada se o último comércio fosse uma troca perdedora.
O sistema Turtle usa uma parada baseada na faixa média verdadeira (ATR).
Observe que o conceito Turtle de N foi substituído pelo termo mais comum e equivalente Average True Range (ATR).
Este parâmetro diz ao Trading Blox se os negócios na direção curta devem ou não ser realizados.
Quando este parâmetro é definido como Falso (desmarcado e desativado), a Trading Blox olha para trás o último desdobramento de entrada para esse instrumento e determina se teria sido um vencedor, na verdade, ou teoricamente. Se o último comércio fosse, ou teria sido um vencedor, o próximo comércio é ignorado, independentemente da direção (longa ou curta).
A última ruptura é considerada a última ruptura nesse mercado, independentemente de essa fuga particular ter sido realmente tomada, ou foi ignorada por causa desta regra. (Trading Blox olha para trás apenas em & # 8220; intervalos regulares & # 8221; e não Entradas Failsafe Breakouts.)
A direcção do último processo, longo ou curto, é irrelevante para a operação desta regra, assim como a direção do comércio atualmente em consideração. Assim, uma perda de longo período ou uma perda de curto prazo, seja hipotética ou real, permitiria que o novo desdobramento subsequente fosse tomado como uma entrada válida, independentemente da direção (longa ou curta):
Alguns comerciantes acreditam que duas grandes vitórias consecutivas são improváveis, ou que um comércio rentável é mais provável que siga um comércio perdedor. O Trading Blox permite que você teste essa idéia definindo este parâmetro como False.
Um comércio é inserido quando o preço atinge o alto ou o mínimo dos X-dias anteriores, conforme ajustado pelo Deslocamento de entrada. Por exemplo, Entry Breakout = 20 significa que uma posição longa é tomada se o preço atingir a alta de 20 dias; Uma posição curta é tomada se o preço atinge o mínimo de 20 dias.
Entrada Failsafe Breakout (dias)
Este parâmetro funciona em conjunto com Trade if Last é Winner, e é usado somente se Trade if Last for Winner = False (como mostrado na captura de tela parcial acima).
Por exemplo, considere o seguinte conjunto de parâmetros e valores:
Com essas configurações, se uma entrada de breakout de 20 dias foi marcada recentemente, mas foi ignorada porque o comércio anterior era um vencedor (na verdade, ou teoricamente), então, se o preço sair acima ou abaixo do máximo de 55 dias, alto ou baixo , uma entrada é iniciada para essa posição, independentemente do resultado do comércio anterior.
Entrada Failsafe Breakout evita que você perca tendências muito fortes devido à ação do Trade if Last é a regra do vencedor.
Se definido como zero, este parâmetro não tem efeito. Se o Deslocamento de Entrada em ATR estiver definido para 1.0, uma posição longa não será introduzida até que o preço atinja o preço de breakout normal, mais 1,0 ATR. Da mesma forma, uma posição curta ganhou & # 8217; t ser inserido até que o preço atinja o preço de breakout normal, menos 1,0 ATR. Pode ser especificado um valor positivo ou negativo para este parâmetro. Um valor positivo efetivamente atrasa a entrada até o ponto especificado após o limite de fuga escolhido; um valor negativo entraria antes do limite de fuga escolhido.
Este parâmetro define o preço no qual as adições a uma posição existente são feitas. As Tartarugas entraram em posições únicas da Unidade nas descobertas e adicionadas a essas posições a intervalos de 1/2 ATR após a iniciação comercial. (Adicionando-se a posições existentes é freqüentemente referido como "piramidação" # 8201;)
Após a entrada inicial, o Trading Blox continuará adicionando uma Unidade (ou Unidades, no caso de um movimento de grande preço em um único dia), em cada intervalo definido pela Unidade Add in ATR, à medida que o preço avança favoravelmente até o número máximo permitido de unidades, conforme especificado pelas várias regras de unidades máximas (explicado abaixo).
Durante os testes históricos de simulação, o preço de entrada teórico é ajustado para cima ou para baixo por Percentagem de Slippage e / ou Slippage Mínimo, para obter o preço de preenchimento simulado. Então, cada intervalo é baseado no preço de preenchimento simulado da ordem anterior. Então, se uma ordem de fuga inicial escorregasse em 1/2 ATR, a nova ordem seria movida para contabilizar o deslizamento 1/2 ATR, além do intervalo de agregação de unidade normal especificado por Unit Add in ATR.
A exceção a esta regra é quando várias unidades são adicionadas em um único dia durante uma troca em andamento. Por exemplo, com a Unidade Add in ATR = 0.5, a ordem de fuga inicial é colocada e incorre em deslizamento de 1/2 ATR. Vários dias depois, mais duas unidades são adicionadas no mesmo dia. Nesse caso, o preço do pedido de 2ª e 3ª Unidades é ajustado em 1/2 ATR (para 1 ATR completo após o breakout), com base no deslizamento incorrido pela 1ª Unidade. Normalmente, no caso de várias Unidades terem sido adicionadas (cada uma em um dia separado), o preço do pedido de cada Unidade é ajustado pelo deslizamento cumulativo (em N) de todas as Unidades que o precederam no comércio em andamento.
Este parâmetro define a distância do preço de entrada para a parada inicial, em termos de ATR. Uma vez que a ATR é uma medida da volatilidade diária e o sistema Turtle Trading System é baseado em ATR, isso significa que o Sistema Turtle iguala o tamanho da posição em vários mercados com base na volatilidade.
De acordo com as regras originais da tartaruga, as posições longas foram interrompidas se o preço caiu 2 ATR do preço de entrada. Por outro lado, as posições curtas foram interrompidas se o preço aumentasse 2 ATR do preço de entrada.
Ao contrário da parada baseada em Exit Breakout, que se move para cima ou para baixo com o X-day high ou low, a parada definida por Stop in ATR é uma & # 8220; hard & # 8221; pare que seja corrigido acima ou abaixo do preço de entrada na entrada. Uma vez definido, não varia ao longo do curso, a menos que as unidades sejam adicionadas, caso em que as unidades anteriores são aumentadas pelo valor especificado pela Unidade de Adicionar (ATR).
As negociações são liquidadas quando o preço atinge a parada definida pelo Stop in ATR, o Entry Breakout para a direção oposta ou o Exit Breakout (veja acima), o que for mais próximo do preço no momento.
Neste sistema, o intervalo de entrada inicial para o dia da entrada comercial é baseado no preço da ordem. Isso é para facilidade de colocar o stop uma vez que o pedido é preenchido. Observe que a parada é ajustada com base no preço de preenchimento real para o dia seguinte.
Os negócios em andamento são encerrados quando o preço atinge o alto ou o mínimo dos X-dias anteriores, conforme ajustado pelo Deslocamento de saída. Este conceito é idêntico ao Entry Breakout, mas a lógica é revertida: os negócios longos são encerrados quando o preço explora abaixo do X-day low, e os negócios curtos são encerrados quando o preço explora acima do mínimo do X-day.
O Exit Breakout move-se para cima (ou para baixo) com preço. Ele protege contra excursões de preços adversas, e também serve como uma parada final que atua para bloquear um lucro quando a tendência inverte.
As negociações são liquidadas quando o preço atinge a parada definida pelo Stop in ATR, o Entry Breakout para a direção oposta ou o Exit Breakout (veja acima), o que for mais próximo do preço no momento.
Se definido como zero, este parâmetro não tem efeito. Se Exit Offset em ATR estiver configurado para 1.0, uma posição longa não será encerrada até que o preço atinja o preço de breakout normal, menos 1.0 ATR. Da mesma forma, uma posição curta ganhou-se sair até que o preço atinja o preço de breakout normal, mais 1,0 ATR. Pode ser especificado um valor positivo ou negativo para este parâmetro. Um valor positivo efetivamente atrasa a saída até o ponto especificado após o limite de fuga escolhido; um valor negativo saía antes do limite de fuga escolhido.
Este parâmetro define o número máximo de Unidades que podem ser mantidas ao mesmo tempo, em qualquer mercado de futuros único ou em estoque único. Por exemplo, Max Instrument Units = 4 significa que não mais de 4 unidades de café podem ser mantidas ao mesmo tempo; Isso inclui a Unidade inicial, mais 3 Unidades adicionadas.
Sua versão personalizada desse sistema.
Podemos fornecer uma versão personalizada deste sistema para atender aos seus objetivos de negociação. Seleção / diversificação de portfólio, prazo, capital inicial & # 8230; Nós podemos ajustar e testar qualquer parâmetro para suas necessidades.
Entre em contato conosco para discutir e / ou solicitar um relatório de simulação personalizado completo.
Sistemas alternativos.
Além dos sistemas de negociação pública, oferecemos aos nossos clientes vários sistemas de negociação proprietários, com estratégias que vão desde a tendência a longo prazo até a reversão média de curto prazo. Nós também fornecemos serviços de execução completa para uma solução de negociação de estratégia totalmente automatizada.
Por favor, clique na imagem abaixo para ver nosso desempenho nos sistemas de negociação.
Divulgação de risco exigida pela CFTC para resultados hipotéticos.
Os resultados de desempenho hipotéticos têm muitas limitações inerentes, algumas das quais estão descritas abaixo. Nenhuma representação está sendo feita que qualquer conta será ou provavelmente conseguirá lucros ou perdas semelhantes às exibidas. na verdade, há freqüentemente diferenças acentuadas entre resultados de desempenho hipotéticos e os resultados reais posteriormente alcançados por qualquer programa comercial específico.
Uma das limitações dos resultados de desempenho hipotéticos é que eles geralmente são preparados com o benefício de retrospectiva. Além disso, a negociação hipotética não envolve risco financeiro, e nenhum registro de negociação hipotético pode explicar completamente o impacto do risco financeiro na negociação real. Por exemplo, a capacidade de suportar perdas ou de aderir a um determinado programa de negociação, apesar das perdas comerciais, são pontos importantes que também podem prejudicar os resultados comerciais reais. Existem inúmeros outros fatores relacionados aos mercados em geral ou à implementação de qualquer programa de negociação específico que não possa ser totalmente contabilizado na elaboração de resultados de desempenho hipotéticos e todos os quais podem prejudicar os resultados comerciais reais.
O Wisdom Trading é um corretor de introdução registado no NFA.
Oferecemos serviços globais de corretagem de commodities, consultoria de futuros gerenciados, serviços de negociação de acesso direto e serviços de execução de sistemas comerciais para indivíduos, empresas e profissionais da indústria.
Como um corretor de introdução independente, mantemos relações de compensação com vários comerciantes principais da Comissão de Futuros em todo o mundo. Vários relacionamentos de compensação nos permitem oferecer aos nossos clientes uma ampla gama de serviços e excepcionalmente ampla gama de mercados.
Nossos relacionamentos de compensação oferecem aos clientes acesso 24 horas ao mercado de futuros, commodities e câmbio em todo o mundo.
O comércio de futuros envolve um risco substancial de perda e não é adequado para todos os investidores. O desempenho passado não é indicativo de resultados futuros.

Sistema de publicação de comércio
(Por Jonathan Simon)
É fácil distanciar-se de uma grande coleção de padrões ou de uma linguagem padrão. Os padrões são a abstração de uma idéia em uma forma reutilizável. Muitas vezes, a natureza muito genérica dos padrões que os torna tão úteis também os torna difíceis de entender. Às vezes, a melhor coisa para ajudar a entender os padrões é um exemplo do mundo real. Não é um cenário artificial do que poderia acontecer; mas o que realmente acontece e o que acontecerá.
Este capítulo aplica padrões para resolver problemas usando um processo de descoberta. O sistema que discutiremos é um sistema de negociação de títulos com o qual trabalhei durante dois anos desde o projeto inicial até a produção. Exploraremos cenários e problemas que foram encontrados e como resolvê-los com padrões. Isso envolve o processo de decisão de escolher um padrão, bem como como combinar e ajustar padrões para atender às necessidades do sistema. E tudo isso é feito levando em consideração as forças encontradas em sistemas reais, incluindo requisitos de negócios, decisões de clientes, requisitos arquitetônicos e técnicos, bem como integração de sistemas legados. A intenção desta abordagem é proporcionar uma compreensão mais clara dos próprios padrões através da aplicação prática.
Construindo um sistema.
Um grande banco de investimento de Wall Street pretende construir um sistema de preços de títulos em um esforço para agilizar o fluxo de trabalho de sua mesa de negociação de títulos. Atualmente, os comerciantes de títulos têm que enviar preços para um grande número de títulos para vários locais de negociação diferentes, cada um com sua própria interface de usuário. O objetivo do sistema é minimizar as minúcias de avaliar todos os seus títulos combinados com funcionalidades analíticas avançadas específicas do mercado de títulos em uma única interface de usuário encapsulada. Isso significa integração e comunicação com vários componentes em vários protocolos de comunicação. O fluxo de alto nível do sistema parece ser o seguinte:
Fluxo de alto nível.
Primeiro, os dados do mercado entram no sistema. Os dados de mercado são dados relativos ao preço e outras propriedades do vínculo que representam o que as pessoas estão dispostas a comprar e vender o vínculo no mercado livre. Os dados do mercado são imediatamente enviados para o mecanismo de análise que altera os dados. A análise refere-se a funções matemáticas para aplicações financeiras que alteram os preços e outros atributos dos títulos. Estas são funções genéricas que usam variáveis ​​de entrada para adaptar os resultados da função a uma ligação particular. O aplicativo cliente que será executado em cada área de trabalho do comerciante configurará o mecanismo de análise por base de comerciante, controlando as especificidades da análise para cada vínculo, o comerciante está classificando os preços. Uma vez que a análise é aplicada aos dados do mercado, os dados modificados são enviados para vários locais de negociação em que os comerciantes de outras empresas podem comprar ou vender os títulos.
Arquitetura com padrões.
Com esta visão geral do fluxo de trabalho do sistema, podemos abordar alguns dos problemas arquitetônicos que encontramos durante o processo de design. Vamos dar uma olhada no que sabemos até agora. Os comerciantes precisam de uma aplicação muito receptiva nas estações de trabalho Windows NT e Solaris. Portanto, decidimos implementar o aplicativo cliente como um cliente de Java grosso devido à independência de sua plataforma e sua capacidade de responder rapidamente aos dados de entrada e ao mercado do usuário. Do lado do servidor, estamos herdando componentes C ++ legados que o nosso sistema utilizará. Os componentes de dados do mercado se comunicam com a infra-estrutura de mensagens TIBCO Information Bus (TIB).
Estamos herdando os seguintes componentes:
Market Data Price Feed Server: publica dados de mercado recebidos para o TIB. Mecanismo de análise: executa análises de dados de mercado recebidos e transmite os dados de mercado modificados para o TIB. Servidor de Contribuição: Executa toda a comunicação com os locais de negociação. Os locais de negociação são componentes de terceiros não controlados pelo banco.
Subsistema de dados do mercado legado.
Subsistema de contribuição legado.
Precisamos decidir como os subsistemas separados (Java thick client, data de mercado e contribuição) se comunicarão. Poderíamos que o cliente grosso se comunicasse diretamente com os servidores legados, mas isso exigiria muita lógica de negócios no cliente. Em vez disso, construiremos um par de gateways Java para se comunicar com os servidores herdados - O Gateway de preços para dados de mercado, um Contribution Gateway para enviar preços para os locais de negociação. Isso alcançará um bom encapsulamento da lógica de negócios relacionada a essas áreas. Os componentes atuais do sistema são mostrados abaixo. As conexões marcadas como ". - indicam que ainda não temos certeza de como alguns dos componentes se comunicarão.
O sistema e seus componentes.
A primeira questão de comunicação é como integrar o Java thick client e os dois componentes do servidor Java para trocar dados. Olhe nos quatro estilos de integração sugeridos neste livro: Transferência de arquivos, banco de dados compartilhado, Invocação de procedimento remoto e mensagens. Nós podemos descartar o banco de dados compartilhado imediatamente porque queríamos criar uma camada de abstração entre o cliente eo banco de dados e não queremos ter o código de acesso ao banco de dados no cliente. A transferência de arquivos pode ser descartada de forma similar, uma vez que é necessária uma latência mínima para garantir que os preços atuais sejam enviados para os locais de negociação. Isso nos deixa uma escolha entre Invocação de Procedimento Remoto ou Mensagens.
A plataforma Java fornece suporte incorporado para Invocação de Procedimentos Remotos e Mensagens. A integração com o estilo RPC pode ser alcançada usando o Remote Method Invocation (RMI), CORBA ou Enterprise Java Beans (EJB). O Java Messaging Service (JMS) é a API comum para integração com o estilo de mensagens. Portanto, ambos os estilos de integração são fáceis de implementar em Java.
Então, o que funcionará melhor para este projeto, Invocação de Procedimento Remoto ou Mensagens? Há apenas uma instância do Pricing Gateway e uma instância do Contribution Gateway no sistema, mas geralmente muitos Clientes Grossos se conectam simultaneamente a esses serviços (um para cada comerciante de títulos que esteja logado em um horário específico). Além disso, o banco gostaria que este fosse um sistema genérico de preços que possa ser utilizado em outras aplicações. Portanto, além de um número desconhecido de Think Clients, pode haver um número desconhecido de outras aplicações usando os dados de preços que saem dos Gateways.
Um Thick Client (ou outro aplicativo usando os dados de preços) pode bastante facilmente usar o RPC para fazer chamadas nos Gateways para obter dados de preços e invocar o processamento. No entanto, os dados de preços serão constantemente publicados, e certos clientes só estão interessados ​​em determinados dados, de modo que obter dados relevantes aos clientes adequados em tempo hábil pode ser difícil. Os clientes poderiam pesquisar os Gateways, mas isso criará muitas despesas gerais. Seria melhor para os Gateways disponibilizar os dados aos clientes assim que estejam disponíveis. Isso, no entanto, exigirá que cada Gateway fique atento a quais clientes estão atualmente ativos e que querem quais dados específicos; então, quando um novo pedaço de dados ficar disponível (o que acontecerá várias vezes por segundo), o Gateway terá que fazer um RPC para cada cliente interessado para transmitir os dados ao cliente. Idealmente, todos os clientes devem ser notificados simultaneamente, então cada RPC precisa ser feito em seu próprio segmento simultâneo. Isso pode funcionar, mas está ficando muito complicado muito rápido.
O Messaging simplifica muito esse problema. Com o Messaging, podemos definir canais separados para os diferentes tipos de dados de preços. Então, quando um Gateway obtém uma nova peça de dados, ele adicionará uma mensagem contendo esses dados ao Canal de Publicação-Inscrição para esse tipo de dados. Enquanto isso, todos os clientes interessados ​​em um determinado tipo de dados escutarão no canal para esse tipo. Desta forma, os Gateways podem facilmente enviar novos dados para quem está interessado, sem precisar saber quantos aplicativos de ouvintes existem ou o que são.
Os clientes ainda precisam ser capazes de invocar comportamentos nos Gateways também. Uma vez que existem apenas dois Gateways, e o cliente provavelmente pode bloquear enquanto o método é invocado de forma síncrona, essas invocações de cliente para Gateway podem ser facilmente implementadas usando o RPC. No entanto, uma vez que já estamos usando mensagens para a comunicação do Gateway para o cliente, as mensagens provavelmente são uma maneira tão boa de implementar a comunicação do cliente para o gateway também.
Portanto, toda comunicação entre os Gateways e os clientes será realizada através de mensagens. Como todos os componentes estão escritos em Java, o JMS apresenta uma escolha fácil para o sistema de mensagens. Isso efetivamente está criando um barramento de mensagens ou uma arquitetura que tornará possível que sistemas futuros se integrem com o sistema atual com poucas ou nenhuma alteração na infra-estrutura de mensagens. Desta forma, a funcionalidade de negócios da aplicação pode ser facilmente usada por outra aplicação que o banco desenvolve.
Componentes Java que Comunicam com o JMS.
O JMS é simplesmente uma especificação e precisamos decidir sobre um sistema de mensagens compatível com JMS. Nós decidimos usar o IBM MQSeries JMS porque o banco é uma "loja do Google", usando servidores de aplicativos da WebSphere e muitos outros produtos da IBM. Como resultado, usaremos o MQSeries já que já possuímos uma infraestrutura de suporte e uma licença de site do produto.
A próxima pergunta é como conectar o sistema de mensagens MQSeries com o servidor autônomo de C ++ Contribution e os servidores do Market Data e Analytics Engine baseados em TIBCO. Precisamos de um modo para os consumidores do MQSeries terem acesso às mensagens TIB. Mas como? Talvez possamos usar o padrão do Message Translator para traduzir mensagens TIB para mensagens MQSeries. Embora o cliente C ++ para MQSeries serve como um Message Translator, o uso dele sacrificaria a independência do servidor JMS. E embora a TIBCO tenha uma API Java, o arquiteto e o gerente do cliente rejeitaram. Como resultado, a abordagem do Message Translator deve ser abandonada.
A ponte do servidor TIB para o servidor MQSeries requer comunicação entre C ++ e Java. Podemos usar o CORBA, mas, então, sobre a mensagem? Um olhar mais atento sobre o padrão do Message Translator mostra que ele está relacionado ao Adaptador de Canal em seu uso de protocolos de comunicação. O coração de um Adaptador de Canal é conectar sistemas que não sejam de mensagens para sistemas de mensagens. Um par de adaptadores de canal que conecta dois sistemas de mensagens é uma ponte de mensagens.
A finalidade de um Messaging Bridge é transferir mensagens de um sistema de mensagens para outro. Isso é exatamente o que estamos fazendo com a complexidade adicionada da comunicação intra-linguagem Java para C ++. Podemos implementar a ponte de mensagens em linguagem cruzada usando uma combinação de Channel Adapter s e CORBA. Construiremos dois servidores de Adaptadores de Canal leves, um em gerenciamento de comunicação C ++ com o TIB e outro em Java gerenciando comunicação com o JMS. Esses dois canais de adaptador, que são os próprios pontos de mensagem, se comunicarão entre si através do CORBA. Como a nossa escolha para o MQSeries, usaremos CORBA em vez de JNI, uma vez que é um padrão da empresa. A ponte de mensagens implementa a tradução de mensagens efetivamente simulada entre sistemas de mensagens aparentemente incompatíveis e diferentes idiomas.
Message Translator usando Adaptadores de canais.
O próximo diagrama mostra o design do sistema atual, incluindo os Gateways e outros componentes. Este é um bom exemplo de aplicação de padrões. Combinamos dois Channel Adapter s com um protocolo não-mensagens para implementar o padrão Message Translator, usando efetivamente um padrão para implementar outro padrão. Além disso, mudamos o contexto do adaptador do canal para vincular dois sistemas de mensagens com um protocolo de conversão de idioma cruzado que não seja de mensagens em vez de conectar um sistema de mensagens a um sistema que não seja de mensagens.
O sistema atual com os Adaptadores de Canal.
Canais Estruturadores.
Uma chave para trabalhar com padrões não é apenas saber quando usar qual padrão, mas também como usá-lo de forma mais eficaz. Cada implementação de padrão deve ter em conta especificidades da plataforma tecnológica, bem como outros critérios de design. Esta seção aplica o mesmo processo de descoberta para encontrar o uso mais eficiente do canal Publish-Subscribe no contexto do servidor de dados de mercado que se comunica com o mecanismo analítico.
Os dados do mercado em tempo real originam-se com o feed de dados do mercado, um servidor C ++ que transmite dados de mercado no TIB. O feed de dados do mercado usa um canal de publicação-inscrição separado para cada vínculo para o qual é o preço de publicação. Isso pode parecer um pouco extremo, uma vez que cada nova ligação precisa do seu próprio novo canal. Mas isso não é tão grave, pois você realmente não precisa criar canais no TIBCO. Em vez disso, os canais são referenciados por um conjunto hierárquico de nomes de tópicos chamados de assuntos. O servidor TIBCO filtra um único fluxo de mensagens por assunto, enviando cada assunto exclusivo para um único canal virtual. O resultado é um canal de mensagem muito leve.
Poderíamos criar um sistema que publica em alguns canais e os assinantes poderiam ouvir apenas os preços que lhes interessam. Isso exigiria que os assinantes usassem um Filtro de Mensagens ou um Consumidor Seletivo para filtrar todo o fluxo de dados para preços de títulos interessantes, decidindo se cada mensagem deve ser processado conforme recebido. Dado que os dados de mercado são publicados em canais dedicados, os assinantes podem se inscrever para atualizações sobre uma série de títulos. Isso efetivamente permite que os assinantes "filtrar" seletivamente se inscrevendo em canais e apenas recebendo atualizações de interesse ao invés de decidir depois que a mensagem é recebida. É importante notar que o uso de múltiplos canais para evitar a filtragem é um uso não padrão de canais de mensagens. No contexto da tecnologia TIBCO, no entanto, estamos realmente decidindo se implementamos ou possuímos filtros ou utilizamos a filtragem de canais incorporada no TIBCO - em vez de usar tantos canais.
O próximo componente que precisamos projetar é o mecanismo de análise, outro servidor C ++ / TIB que modificará os dados do mercado e o retransmitirá para o TIB. Embora esteja fora do alcance do nosso desenvolvimento Java / JMS, estamos trabalhando em estreita colaboração com a equipe C ++ para projetá-lo, já que somos o principal "cliente" do motor de análise. O problema em questão é encontrar a estrutura do canal que retransmita os dados de mercado recentemente modificados.
Uma vez que já possuímos um canal de mensagens dedicado por vínculo herdado do preço de preço do mercado, seria lógico modificar os dados do mercado e retransmitir os dados de mercado modificados no canal de mensagens dedicado. Mas isso não funcionará uma vez que os analíticos que modificam os preços dos títulos são específicos do comerciante. Se nós retransmitimos os dados modificados no canal de mensagens de ligação, destruiremos a integridade dos dados, substituindo dados genéricos de mercado por dados específicos do comerciante. Por outro lado, podemos ter um tipo de mensagem diferente para os dados de mercado específicos do comerciante que publicamos no mesmo canal, permitindo que os assinantes decidam qual mensagem eles estão interessados ​​para evitar destruir a integridade dos dados. Mas então os clientes terão que implementar seus próprios filtros para separar mensagens para outros comerciantes. Além disso, haverá um aumento substancial nas mensagens recebidas pelos assinantes, colocando um encargo desnecessário sobre eles.
Existem duas opções:
Um canal por comerciante: cada comerciante tem um canal designado para os dados de mercado modificados. Desta forma, os dados de mercado originais permanecem intactos e cada aplicação de comerciante pode ouvir seus comerciantes específicos Message Channel para as atualizações de preços modificadas. Um Canal por comerciante por Obrigatório: Crie um Canal de Mensagens por comerciante por ação unicamente para os dados de mercado modificados dessa ligação. Por exemplo, os dados de mercado para a ligação ABC seriam publicados no canal "Bond ABC", enquanto os dados de mercado modificados para o comerciante A seriam publicados no Message Channel "Trader A, Bond ABC", dados de mercado modificados para o comerciante B em "Trader B , Bond ABC, "e assim por diante.
Um canal por comerciante.
Um canal por ligação por comerciante.
Existem vantagens e desvantagens para cada abordagem. A abordagem por vínculo, por exemplo, usa muito mais Message Channel. No pior caso, o número de Canal de Mensagens será o número total de títulos multiplicado pelo número de comerciantes. Podemos colocar limites superiores sobre o número de canais que serão criados, já que sabemos que existem apenas cerca de 20 comerciantes e nunca mais do que um par cento de títulos. Isso coloca o limite superior abaixo do alcance de 10.000, o que não é tão estranho em comparação com o canal de mensagens de quase 100.000 que o preço do preço de mercado está usando. Além disso, uma vez que estamos usando o TIB eo canal de mensagens são bastante baratos, o número de canais de mensagens não é um problema grave. Por outro lado, o número total de canais de mensagens pode ser um problema na perspectiva da gestão. Toda vez que um vínculo é adicionado, um canal para cada comerciante deve ser mantido. Isso pode ser severo em um sistema muito dinâmico. Nosso sistema, no entanto, é essencialmente estático. Ele também possui uma infra-estrutura para gerenciar automaticamente o canal de mensagens s. Isso combinado com a arquitetura herdada de um componente legado usando uma abordagem similar minimiza a desvantagem. Isso não quer dizer que devemos fazer um número desnecessariamente excessivo de Message Channel s. Em vez disso, podemos implementar uma abordagem arquitetônica que usa um grande número de canais de mensagens quando há um motivo.
E há um motivo neste caso que se resume à localização da lógica. Se implementarmos a abordagem por comerciante, o Analytics Engine precisa de lógica para agrupar canais de entrada e saída. Isso ocorre porque os canais de entrada do Google Analytics Engine são por ligação e o Canal de Mensagens de saída seria por comerciante, exigindo que o Engine Analytics encaminhe toda a entrada de análise de múltiplas ligações para um comerciante particular para um canal de mensagens de saída específico do comerciante. Isso efetivamente transforma o mecanismo de análise em um roteador baseado em conteúdo para implementar lógica de roteamento personalizada para nossa aplicação.
Seguindo a estrutura do Bus de mensagens, o Analytics Engine é um servidor genérico que pode ser usado por vários outros sistemas no. Portanto, não queremos nublá-lo com funcionalidades específicas do sistema. Por outro lado, a abordagem por vínculo funciona uma vez que a idéia de um comerciante possuir o resultado analítico dos preços dos títulos é uma prática aceita pela empresa. A abordagem por vínculo mantém intacta a separação do canal de mensagens do fluxo de dados do mercado, enquanto adiciona mais alguns canais de mensagens. Antes de chegar ao cliente, queremos que um roteador baseado em conteúdo combine esses vários canais em um número gerenciável de canais. Não queremos que o aplicativo cliente em execução na área de trabalho do comerciante esteja ouvindo milhares ou dezenas de milhares de canais de mensagens. Agora, a questão se torna onde colocar o Roteador baseado em conteúdo. Poderíamos simplesmente ter o Adaptador de Canal C ++ / TIB encaminhar todas as mensagens para o Gateway de Preços em um único Canal de Mensagens. Isso é ruim por dois motivos; estariamos dividindo a lógica de negócios entre C ++ e Java, e perderíamos o benefício do Canal de Mensagens separado no lado TIB, permitindo-nos evitar a filtragem mais tarde no fluxo de dados. Olhando para os nossos componentes Java, podemos colocá-lo no Pricing Gateway ou criar um componente intermediário entre o Pricing Gateway e o cliente.
Em teoria, se persistisse na separação baseada em vínculo do Message Channel s até o cliente, o Pricing Gateway retransmitiria informações de preços com a mesma estrutura de canal que o Passo de Preços e o Engine Analytics. Isso significa uma duplicação de todos os canais dedicados TIB dedicados no JMS. Mesmo que criemos um componente intermediário entre o Gateway de preços e o cliente, o Gateway de preços ainda precisará duplicar todos os canais no JMS. Por outro lado, implementar a lógica diretamente no Pricing Gateway nos permite evitar a duplicação do grande número de canais no JMS, permitindo-nos criar um número muito menor de canais na ordem de um por trader. O Pricing Gateway registra-se através do Adaptador de Canal C ++ / TIB como consumidor para cada ligação de todos os comerciantes do sistema. Em seguida, o Gateway de preços encaminhará cada cliente específico apenas as mensagens relacionadas a esse comerciante específico. Desta forma, usamos apenas um pequeno número de canais de mensagens no final do JMS, ao mesmo tempo que maximizamos o benefício da separação no final TIB.
O fluxo de dados de mercado completo para o cliente.
A discussão de layout do Canal de Mensagens é um bom exemplo de como os padrões de integração são importantes. O objetivo aqui foi descobrir como usar efetivamente o canal de mensagens s. Dizendo que você usa um padrão não é suficiente. Você precisa descobrir como implementá-lo e incorporar no seu sistema para resolver os problemas em questão. Além disso, este exemplo mostra as forças de negócios em ação. Se pudéssemos implementar lógica de negócios em qualquer um dos nossos componentes, poderíamos ter ido com a abordagem por comerciante e implementado uma abordagem global mais simples com muitos canais menos.
Selecionando um canal de mensagens?
Agora que conhecemos a mecânica da comunicação entre os componentes Java / JMS e os componentes C ++ / TIBCO, e vimos alguma estruturação do Canal de Mensagens, precisamos decidir qual tipo de Canal de Mensagens JMS os componentes Java devem usar para se comunicar. Antes que possamos escolher entre os diferentes canais de mensagens disponíveis no JMS, vejamos o fluxo de mensagens de alto nível do sistema. Temos dois gateways (Preços e Contribuição) que se comunicam com o cliente. Os fluxos de dados do mercado para o cliente do Pricing Gateway, que o envia para o Contribution Gateway. O aplicativo cliente envia mensagem para o gateway de preços para alterar a análise que está sendo aplicada a cada ligação. O Contribution Gateway também envia mensagens para o aplicativo Cliente, transmitindo o status das atualizações de preços para os diferentes locais de negociação.
O fluxo de mensagens do sistema.
A especificação JMS descreve dois tipos de Canal de Mensagens, Canal Ponto a Ponto (Fila JMS) e Canal de Publicação-Inscrição (Tópico JMS). Lembre-se de que o caso de usar o publish-subscribe é permitir que todos os consumidores interessados ​​recebam uma mensagem enquanto o caso para usar ponto a ponto é garantir que apenas um consumidor elegível receba uma mensagem específica.
Muitos sistemas simplesmente transmitiam mensagens para todos os aplicativos do cliente, deixando cada aplicativo cliente individual decidir se deve ou não processar uma mensagem específica. Isso não funcionará para o nosso aplicativo, uma vez que há uma grande quantidade de mensagens de dados de mercado enviadas para cada aplicativo de cliente. Se transmitimos atualizações de dados de mercado para o comerciante desinteressado, estaremos desperdiçando desnecessariamente os ciclos do processador do cliente, decidindo se deve ou não processar uma atualização de dados de mercado.
O canal ponto-a-ponto inicialmente parece ser uma boa escolha, pois os clientes estão enviando mensagens para servidores exclusivos e vice-versa. Mas era um requisito de negócios que os comerciantes pudessem estar logados em várias máquinas ao mesmo tempo. Se tivermos um comerciante logado em duas estações de trabalho simultaneamente e uma atualização de preço ponto a ponto for enviada, apenas uma das duas aplicações clientes receberá a mensagem. Isso ocorre porque apenas um consumidor em um canal ponto-a-ponto pode receber uma mensagem específica. Observe que apenas o primeiro de cada grupo de aplicativos cliente de um comerciante recebe a mensagem.
Mensagens ponto-a-ponto para atualizações de preços.
Podemos resolver isso usando o padrão da Lista de Destinatários, que publica mensagens para uma lista de destinatários pretendidos, garantindo que apenas clientes na lista de destinatários receberão mensagens. Usando esse padrão, o sistema poderia criar listas de destinatários com todas as instâncias de aplicativos do cliente relacionadas a cada comerciante. Enviar uma mensagem relacionada a um comerciante específico, por sua vez, enviaria a mensagem para cada aplicativo na lista de destinatários. Isso garante que todas as instâncias de aplicativos do cliente relacionadas a um comerciante específico receberiam a mensagem. A desvantagem dessa abordagem é que requer um pouco de lógica de implementação para gerenciar os destinatários e enviar mensagens.
Lista de destinatários para atualizações de preços.
Embora ponto-a-ponto possa ser feito para o trabalho, vamos ver se há uma maneira melhor. Usando Publish-Subscribe Channel s, o sistema pode transmitir mensagens em canais específicos do comerciante em vez de canais específicos de aplicativos do cliente. This way, all client applications processing messages for a single trader would receive and process the message.
Publish-Subscribe Messaging for Price Updates.
The downside of using Publish-Subscribe Channel s is that unique message processing is not guaranteed with the server components. It would be possible for multiple instances of a server component to be instantiated and each instance process the same message, possibly sending out invalid prices.
Recalling the system message flow, only a single communication direction is satisfactory with each Message Channel . Server-to-client communication with publish-subscribe is satisfactory while client-to-server communication is not and client-server communication with point-to-point is satisfactory while server-client is not. Since there is no need to use the same Message Channel in both directions, we can use each Message Channel only one direction. Client-to-server communication will be implemented with point-to-point while server-to-client communication will be implemented with publish-subscribe. Using this combination of Message Channel s, the system benefits from direct communication with the server components using point-to-point messaging and the multicast nature of publish-subscribe without either of the drawbacks.
Message flow with Channel Types.
Problem Solving With Patterns.
Patterns are tools and collections of patterns are toolboxes. They help solve problems. Some think that patterns are only useful during design. Following the toolbox analogy, this is like saying that tools are only useful when you build a house, not when you fix it. The fact is that patterns are a useful tool throughout a project when applied well. In the following sections we will use the same pattern exploration process we used in the previous section to solve problems in our now working system.
Flashing Market Data Updates.
Traders want table cells to flash when new market data is received for a bond, clearly indicating changes. The Java client receives messages with new data which triggers a client data cache update and eventually flashing in the table. The problem is that updates come quite frequently. The GUI thread stack is becoming overloaded and eventually freezing the client since it can’t respond to user interaction. We will assume that the flashing is optimized and concentrate on the data flow of messages through the updating process. An examination of performance data shows the client application is receiving several updates a second; some updates occurred less than a millisecond apart. Two patterns that seem like they could help slow down the message flow are Aggregator and Message Filter.
A first thought is to implement a Message Filter to control the speed of the message flow by throwing out updates received a small amount of time after the reference message. As an example, lets say that we are going to ignore messages within 5 milliseconds of each other. The Message Filter could cache the time of the last acceptable message and throw out anything received within the next 5 milliseconds. While other applications may not be able to withstand data loss to such an extent, this is perfectly acceptable in our system due to the frequency of price updates.
Time based Message Filter.
The problem with this approach is that not all data fields are updated at the same time. Each bond has approximately 50 data fields displayed to the user including price. We realize that not every field is updated in every message. If the system ignores consecutive messages, it may very well be throwing out important data.
The other pattern of interest is the Aggregator . The Aggregator is used to manage the reconciliation of multiple, related messages into a single message, potentially reducing the message flow. The Aggregator could keep a copy of the bond data from the first aggregated message, then update only new or changed fields successive messages. Eventually the aggregated bond data will be passed in a message to the client. For now, lets assume that the Aggregator will send a message every 5 milliseconds like the Message Filter . Later, we'll explore another alternative.
Aggregator with partial successive updates.
The Aggregator , like any other pattern, is not a silver bullet; it has its pluses and minuses that need to be explored. One potential minus is that implementing an Aggregator would reduce the message traffic by a great amount in our case only if many messages are coming in within a relatively short time regarding the same bond. On the other hand, we would accomplish nothing if the Java client only receives updates for one field across all of the traders bonds. For example, if we receive 1000 messages in a specified timeframe with 4 bonds of interest, we would reduce the message flow from 1000 to 4 messages over that timeframe. Alternatively, if we receive 1000 messages in the same timeframe with 750 bonds of interest, we will have reduced the message flow from 1000 to 750 messages; relatively little gain for the amount of effort. A quick analysis of the message updates proves that the Java client receives many messages updating fields of the same bond, and therefore related messages. So, Aggregator is in fact a good decision.
What's left is to determine how the Aggregator will know when to send a message it has been aggregating. The pattern describes a few algorithms for the Aggregator to know when to send the message. These include algorithms to cause the aggregator to send out its contents after a certain amount of time has elapsed, after all required fields in a data set have been completed, and others. The problem with all of these approaches is that the aggregator is controlling the message flow, not the client. And the client is the major bottleneck in this case, not the message flow.
This is because the Aggregator is assuming the consumers of its purged messages (the client application in this case) are Event-Driven Consumer s, or consumers that rely on events from an external source. We need to turn the client into a Polling Consumer , or a consumer that continuously checks for messages, so the client application can control the message flow. We can do this by creating a background thread that continuously cycles through the set of bonds and updates and flashes any changes that have occurred since the last iteration. This way, the client controls when messages are received and as a result, guarantees that it will never become overloaded with messages during high update periods. We can easily implement this by sending a Command Message to the Aggregator initiating an update. The Aggregator will respond with a Document Message containing the set of updated fields that the client will process.
The choice of Aggregator over Message Filter is clearly a decision based solely on the business requirements of our system. Each could help us solve our performance problems, but using the Message Filter would solve the problem at cost of the system data integrity.
Major Production Crash.
With the performance of the flashing fixed, we are now in production. One day the entire system goes down. MQSeries crashes, bringing several components down with it. We struggle with the problem for a while and finally trace it back to the MQSeries dead letter queue (an implementation of the Dead Letter Channel ). The queue grows so large that it brings down the entire server. After exploring the messages in the dead letter queue we find they are all expired market data messages. This is caused by “slow consumers, ” or consumers that do not process messages fast enough. While messages are waiting to be processed, they time out (see the Message Expiration pattern) and are sent to the Dead Letter Channel . The excessive number of expired market data messages in the dead letter queue is a clear indication that the message flow is too great – messages expire before the target application can consume them. We need to fix the message flow and we turn to patterns for help slowing down the message flow.
A reasonable first step is to explore solving this problem with the Aggregator as we recently used this pattern to solve the similar flashing market data control rate problem. The system design relies on the client application to immediately forward market data update messages to the trading venues. This means the system cannot wait to collect messages and aggregate them. So the Aggregator must be abandoned.
There are two other patterns that deal with the problem of consuming messages concurrently: Competing Consumers and Message Dispatcher . Starting with Competing Consumers , the benefit of this pattern is the parallel processing of incoming messages. This is accomplished using several consumers on the same channel. Only one consumer processes each incoming message leaving the others to process successive messages. Competing Consumers , however, will not work for us since we are using Publish-Subscribe Channel s in server-to-client communication. Competing Consumers on a Publish-Subscribe Channel channel means that all consumers process the same incoming message. This results in more work without any gain and completely misses the goal of the pattern. This approach also has to be abandoned.
On the other hand, the Message Dispatcher describes an approach whereby you add several consumers to a вЂ˜pool’. Each consumer can run its own execution thread. One main Message Consumer listens to the Channel and delegates the message on to an unoccupied Message Consumer in the pool and immediately returns to listening on the Message Channel . This achieves the parallel processing benefit of Competing Consumers , but works on Publish-Subscribe Channel s.
The Message Dispatcher in context.
Implementing this in our system is simple. We create a single JMSListener called the Dispatcher, which contains a collection of other JMSListener s called Performers. When the onMessage method of the Dispatcher is called, it in turn picks a Performer out of the collection to actually process the message. The result of which is a Message Listener (the Dispatcher) that always returns immediately. This guarantees a steady flow of message processing regardless of the message flow rate. Additionally, this works equally well on a Publish-Subscribe Channel s as it does on a Point-to-Point Channel s. With this infrastructure, messages can be received by the client application at almost any rate. If the client application is still slow to process the message after receiving them, the client application can deal with the delayed processing and potentially outdated market data rather than the messages expiring in the JMS Message Channel .
The crash discussed in this section and the fix using the Message Dispatcher is an excellent example of the limits of applying patterns. We encountered a performance problem based on a design flaw not allowing the client to process messages in parallel. This greatly improved the problem, but did not completely fix it. This is because the real problem was the client becoming a bottleneck. This couldn’t be fixed with a thousand patterns. We later addressed this problem by refactoring the message flow architecture to route messages directly from the Pricing Gateway to the Contribution Gateway. So patterns can help design and maintain a system, but don’t necessarily make up for poor upfront design.
Throughout this chapter, we have applied patterns to several different aspects of a bond trading system including solving initial upfront design problems and fixing a nearly job threatening production crash with patterns. We also saw these patterns as they already exist in third party product, legacy components, and our JMS and TIBCO messaging systems. Most importantly, these are real problems with the same types of architectural, technical and business problems we experience as we design and maintain our own systems. Hopefully reading about applying patterns to this system helps give you a better understanding of the patterns as well as how to apply them to your own systems.
Gregor Hohpe and Bobby Woolf.
From Enterprise Integration to Enterprise Transformation:
My new book describes how architects can play a critical role in IT transformation by applying their technical, communication, and organizational skills with 37 episodes from large-scale enterprise IT.

Publish/Subscribe.
This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This page may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.
Aliases.
You have an integration architecture consisting of several applications. A communication infrastructure connects these applications in a bus, broker, or point-to-point topology. Some applications send multiple message types. Other applications are interested in different combinations of these types.
For example, consider a financial system where several applications maintain customer information. A Customer Relationship Management (CRM) application holds the master customer information. However, a typical situation for integration scenarios exists—customer information also resides in other systems that perform their own customer information management functions. A customer-facing application generates update messages for changes to customer information, such as changes to customer addresses. The messages must reach the CRM application as well as the other applications that manage customer information. However, this message type is meaningless to the integrated applications that do not manage customer information.
How can an application in an integration architecture only send messages to the applications that are interested in receiving the messages without knowing the identities of the receivers?
Integrating applications so that they receive only the messages they are interested in involves balancing the following forces:
The applications in an integration architecture consume different message types. For example, applications that manage customer information are interested in customer information updates. Trading applications are interested in buy and sell transactions. Applications that participate in two-phase commit transactions are interested in commit messages. An application in an integration architecture may send several message types. For example, the application may send customer information messages and operational messages about its status. (Status is also referred to as health in this context). Likewise, an application in an integration architecture is usually interested only in a subset of the messages that are sent by the other applications. For example, a portfolio manager is interested only in the financial transactions that affect the stocks that it manages. The extent to which applications let you add information to their messages varies widely. Fixed binary messages usually provide no flexibility or limited flexibility in this area. In contrast, it is usually easy to extend SOAP messages through envelope elements. Most integration architectures integrate proprietary applications. These applications often make strong assumptions about the messages that they use to communicate with other applications in the environment. Even with a flexible message format, it may be difficult to insert or to process message elements that the application does not know about.
Extend the communication infrastructure by creating topics or by dynamically inspecting message content. Enable listening applications to subscribe to specific messages. Create a mechanism that sends messages to all interested subscribers. The three variations of the Publish/Subscribe pattern you can use to create a mechanism that sends messages to all interested subscribers are List-Based Publish/Subscribe , Broadcast-Based Publish/Subscribe , and Content-Based Publish/Subscribe .
List-Based Publish/Subscribe.
A List-Based Publish/Subscribe pattern advises you to identify a subject and to maintain a list of subscribers for that subject. When events occur, you have the subject notify each subscriber on the subscription list. A classic way to implement this design is described in the Observer [Gamma95] pattern. When you use this pattern, you identify two classes: subjects and observers. Assuming you use a push model update, you add three methods to the subject: Attach() , Detach() , and Notify().You add one method to the observer — Update() .
To use an observer, all interested observers register with the subject by using the Attach() method. As changes occur to the subject, the subject then calls each registered observer by using the Notify() method. For a detailed explanation of the Observer pattern, see Design Patterns: Elements of Reusable Object-Oriented Software [Gamma95].
An observer works fine if you have created instances of objects that reify all your observers and subjects. An observer is especially well suited to situations where you have one-to-many relationships between your subjects and your observers. However, in the context of integration, you often have many observers that are linked to many subjects, which complicates the basic Observer pattern. One way to implement this many-to-many relationship is to create many subjects and to have each subject contain a list of observers.
If you use this object structure to implement Publish/Subscribe , you must write these relationships to persistent storage between process executions. To do so within a relational database, you must add an associative table to resolve the many-to-many dependencies between subject and observer. After you write this information to persistent storage in a set of tables, you can directly query the database for the list of subscribers for a topic.
Maintaining lists of published topics (subjects) and subscribers (observers) and then notifying each one individually as events occur is the essence of List-Based Publish/Subscribe implementations. A very different means of achieving the same result is a Broadcast-Based Publish/Subscribe implementation.
Broadcast-Based Publish/Subscribe.
When you use a Broadcast-Based Publish/Subscribe approach [Tannebaum01, Oki93], an event publisher creates a message and broadcasts it to the local area network (LAN). A service on each listening node inspects the subject line. If the listening node matches the subject line to a subject that it subscribes to, the listening node processes the message. If the subject does not match, the listening node ignores the message.
Subject lines are hierarchical and may contain multiple fields that are separated by periods. Listening nodes that are interested in a particular subject can subscribe to these fields by using wildcards, if required.
Although this Broadcast-Based Publish/Subscribe implementation is an effective method for decoupling producers from consumers, it is sometimes useful to identify particular topic subscribers. To identify topic subscribers, a coordinating process sends a message that asks listening nodes to reply if they subscribe to a particular topic. Responses are then returned by each listening node to the provider to identify the subscribers.
Because all messages are sent to all listening nodes, and because each node is responsible for filtering unwanted messages, some authors refer to this as a publish/subscribe channel with reactive filtering [Hohpe04].
Content-Based Publish/Subscribe.
Both Broadcast-Based Publish/Subscribe implementations and List-Based Publish/Subscribe implementations can be broadly categorized as topic-based because they both use predefined subjects as many-to-many channels. Publish/Subscribe implementations have recently evolved to include a new form — Content-Based Publish/Subscribe . The difference between topic-based and content-based approaches is as follows:
In a topic-based system, processes exchange information through a set of predefined subjects (topics) which represent many-to-many distinct (and fixed) logical channels. Content-based systems are more flexible as subscriptions are related to specific information content and, therefore, each combination of information items can actually be seen as a single dynamic logical channel. This exponential enlargement of potential logical channels has changed the way to implement a pub/sub system. [Baldoni03]
The practical implication of this approach is that messages are intelligently routed to their final destination based on the content of the message. This approach overcomes the limitation of a broadcast-based system, where distribution is coupled to a multicast tree that is based on Transmission Control Protocol (TCP). It also gives the integration architect a great deal of flexibility when deciding on content-based routing logic.
Applying Publish/Subscribe.
Figure 1 shows an integration solution that consists of four applications. The sender (also called a publisher ) uses a topic-based approach to publish messages to topic A and to topic B. Three receivers (also called subscribers ) subscribe to these topics; one receiver subscribes to topic A, one receiver subscribes to topic B, and one receiver subscribes to both topic A and to topic B. The arrows show messages flowing from the publisher to each subscriber according to these subscriptions.
Figure 1. Subscription to topics controls the message types that reach each subscriber.
Implementing Publish/Subscribe usually affects the messages, the integrated applications, and the communication infrastructure.
First, you must identify the topics or the content of interest to the receiving applications. This translates into partitioning the set of message types into different subsets. For example, consider the types of messages that are sent by a trading system. Some trading applications track buy transactions, some track sell transactions, and other applications track both types of transaction. Separating the message by creating a buy topic and a sell topic partitions the trading system messages into subsets aimed at these applications.
Next, you must add information to the messages that indicates the topic or that identifies specific content information. Sometimes you can store the topic-related information in an unused message field. Alternatively, you may be able to add a new field for the topic. For example, you may be able to insert a new element in a SOAP header. If you can neither use an existing field nor add a new one, you must find other ways to encode the topic into the message, or you must use a content-based approach instead.
You must then extend the communication infrastructure so that it delivers messages according to each subscriber's subscription. The approach that you use depends on the topology of the integration solution. For example, consider the three common topologies. For bus integration, you can implement the subscription mechanism in the bus interface. For broker integration, you can implement the mechanism through subscription lists to the broker. For point-to-point integration, you can implement the mechanism through subscription lists in the publisher.
Finally, you must modify the integrated applications. The publisher must add the topic-related information to each message that it publishes. For example, if the topic is encoded as a header element, the publisher must insert the topic-related information into the appropriate element. Likewise, the subscriber must specify the topics of interest.
Subscriptions can be either fixed or dynamic. With fixed subscriptions, the integration architect sets the topics that an application subscribes to. Applications have no control over their subscriptions. Usually, the subscriptions are specified when each application is added to the integration solution. Figure 2 shows a fixed subscription to Topic A.
Figure 2. Publish/Subscribe with fixed subscription.
In contrast, dynamic subscriptions enable applications to control their own subscriptions through a set of control messages. Applications can remove existing subscriptions by sending messages to the communication infrastructure that remove the application from the subscription list. Applications can add new subscriptions by sending messages to the communication infrastructure that add the application to a subscription list. Most communication infrastructures that have Publish/Subscribe capabilities provide this feature. However, supporting dynamic subscriptions is not a requirement.
Figure 3. Publish/Subscribe with dynamic subscriptions.
Figure 3 shows how dynamic subscriptions function. The top part of Figure 3 shows the initial subscription to topic A. The application then sends a message that removes it from the subscription list for topic A. The application then sends two messages that subscribe the application to topic B and topic C. The bottom part of Figure 3 shows the final subscription after these control messages are sent.
Related Decisions.
After you decide to use Publish/Subscribe , you must make the following decisions:
Initial subscription . You must decide how subscribers communicate their subscriptions to the communication infrastructure when they are first added to the solution. Wildcard subscriptions . You must decide if your publish/subscribe mechanism needs to support wildcard subscriptions. Wildcard subscriptions enable subscribers to subscribe to multiple topics through one subscription. Static or dynamic subscriptions . You must decide if the applications in your integration solution need to change their subscriptions dynamically. Topic discovery . You must decide how subscribers discover the available topics if the solution supports dynamic subscriptions.
Responsibilities and Collaborations.
Table 1 summarizes the responsibilities and collaborations of the parties involved in Publish/Subscribe .
Table 1: Responsibilities and Collaborations Among Publish/Subscribe Components.
–Inspects the topic-related information or the content information that is included in each published message.
–Transports the message to the subscribed applications.
–The subscriber subscribes to topics and receives messages.
–Publishes the message to the communication infrastructure.
–Consumes messages published to the subscribed topics.
Microsoft BizTalk Server 2004 uses the Publish/Subscribe pattern internally to receive, to route, and to send messages. BizTalk Server receives messages through input ports and stores them in the MessageBox database. Orchestration ports and send ports consume messages from this database based on their subscriptions. Figure 4 illustrates this arrangement.
Figure 4. Publish/Subscribe in BizTalk Server 2004.
Resulting Context.
Using Publish/Subscribe has the following benefits and liabilities. Evaluate this information to help you decide whether you should implement Publish/Subscribe :
Lowered coupling. The publisher is not aware of the number of subscribers, of the identities of the subscribers, or of the message types that the subscribers are subscribed to. Improved security. The communication infrastructure transports the published messages only to the applications that are subscribed to the corresponding topic. Specific applications can exchange messages directly, excluding other applications from the message exchange. Improved testability . Topics usually reduce the number of messages that are required for testing.
Responsabilidades.
Increased complexity. Publish/Subscribe requires you to address the following: You have to design a message classification scheme for topic implementation. You have to implement the subscription mechanism. You have to modify the publisher and the subscribers. Increased maintenance effort. Managing topics requires maintenance work. Organizations that maintain many topics usually have formal procedures for their use. Decreased performance. Subscription management adds overhead. This overhead increases the latency of message exchange, and this latency decreases performance.
Testing Considerations.
The topics of a Publish/Subscribe implementation facilitate the testing of an integration solution. Subscriptions provide isolation by segmenting the message space. By subscribing only to the topics or to the content of interest, testers and testing tools have fewer messages to sift through. Likewise, by subscribing to other topics or content, testers can catch messages that are published to the wrong topic.
Security Considerations.
An integration solution that uses Publish/Subscribe can restrict the participants of a message exchange, thus enabling applications to have private message exchanges. Depending on the topology, the messages may still be physically transported to all the applications in the integration architecture. For example, all the messages are transported to all the applications if your integration solution uses the Message Bus using Broadcast-Based Publish/Subscribe pattern. However, the interface between the communication infrastructure and the application enforces filtering according to each application's subscriptions.
Operational Considerations.
Many integration solutions that use Publish/Subscribe have topics or content that is dedicated to messages about the applications' health. This separation facilitates your ability to monitor various operational parameters and to control the applications in the integration solution.
Related Patterns.
For more information about Publish/Subscribe , see other similar patterns:
Message Bus and Message Broker describe two common integration topologies. Observer [Gamma95] provides a mechanism for decoupling dependencies between applications. Publisher-Subscriber [Buschmann96] facilitates state synchronization between cooperating components. Publish-Subscribe Channel [Hohpe04] provides a way to broadcast events to all the receivers (subscribers) that subscribe to a specific topic.
Agradecimentos.
[Baldoni03] Baldoni, R.; M. Contenti, and A. Virgillito. " The Evolution of Publish/Subscribe Communication Systems." Future Directions of Distributed Computing. Springer Verlag LNCS Vol. 2584, 2003.
[Buschmann96] Buschmann, Frank; Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal. Pattern-Oriented Software Architecture, Volume 1: A System of Patterns. John Wiley & amp; Sons Ltd, 1996.
[Gamma95] Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software . Addison-Wesley, 1995.
[Hohpe04] Hohpe, Gregor, and Bobby Woolf. Enterprise Integration Patterns: Designing, Building and Deploying Messaging Solutions . Addison-Wesley, 2004.
[Oki93] Oki, B.; M. Pfluegel, A. Siegel, and D. Skeen. "The Information Bus - An Architecture for Extensive Distributed Systems." Proceedings of the 1993 ACM Symposium on Operating Systems Principles , December 1993.
[Tannebaum01] Tannebaum, Andrew. Modern Operating Systems. 2ª ed. Prentice-Hall, 2001.
This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This page may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.

Publish trading system


E-books são oferecidos como e-Pubs ou PDFs. Para baixá-los e lê-los, os usuários devem instalar o Adobe Digital Editions (ADE) em seu PC. E-books tem proteção DRM sobre eles, o que significa que apenas a pessoa que compra e baixa o e-book pode acessá-lo. E-books não são reembolsáveis ​​e não reembolsáveis. Para saber mais sobre nossos e-books, consulte nossas FAQ. '>
Wiley FINRA Series 57 Exam Review 2017: The Securities Trader Examination.
E-books são oferecidos como e-Pubs ou PDFs. Para baixá-los e lê-los, os usuários devem instalar o Adobe Digital Editions (ADE) em seu PC. E-books tem proteção DRM sobre eles, o que significa que apenas a pessoa que compra e baixa o e-book pode acessá-lo. E-books não são reembolsáveis ​​e não reembolsáveis. Para saber mais sobre nossos e-books, consulte nossas FAQ. '>
Wiley FINRA Series 99 Exam Review 2017: o exame profissional de operações.
E-books são oferecidos como e-Pubs ou PDFs. Para baixá-los e lê-los, os usuários devem instalar o Adobe Digital Editions (ADE) em seu PC. E-books tem proteção DRM sobre eles, o que significa que apenas a pessoa que compra e baixa o e-book pode acessá-lo. E-books não são reembolsáveis ​​e não reembolsáveis. Para saber mais sobre nossos e-books, consulte nossas FAQ. '>

Комментариев нет:

Отправить комментарий