Saturday 15 July 2017

Padrões De Design Do Sistema De Negociação


Design Patterns Design padrões são soluções para problemas de design de software que você encontrar uma e outra vez no mundo real desenvolvimento de aplicações. Padrões são sobre projetos reutilizáveis ​​e interações de objetos. Os padrões de 23 Gang of Four (GoF) geralmente são considerados o fundamento para todos os outros padrões. Eles são categorizados em três grupos: Criacional, Estrutural e Comportamental (para uma lista completa veja abaixo). Para dar-lhe uma vantagem, o código-fonte C para cada padrão é fornecido em 2 formas: estrutural e real-world. O código estrutural usa nomes de tipos conforme definido na definição de padrão e diagramas UML. O código do mundo real fornece situações de programação do mundo real onde você pode usar esses padrões. Uma terceira forma, otimizada. Demonstra padrões de design que exploram plenamente os recursos incorporados 4.5, como genéricos, atributos, delegados, reflexão e muito mais. Estes e muito mais estão disponíveis em nosso Design Pattern Framework 4.5. Você pode ver a página Singleton para um exemplo otimizado 4.5. Cria uma instância de várias famílias de classes Separa a construção de objeto de sua representação Cria uma instância de várias classes derivadas Uma instância totalmente inicializada a ser copiada ou clonada Uma classe da qual apenas uma única instância pode existir Interfaces de correspondência de diferentes classes Separa uma interface de objetos de Sua implementação Uma estrutura em árvore de objetos simples e compostos Adicione responsabilidades a objetos dinamicamente Uma única classe que representa um subsistema inteiro Uma instância de grão fino usada para compartilhamento eficiente Um objeto que representa outro objeto Uma maneira de passar uma solicitação entre uma cadeia de objetos Encapsular um Solicitação de comando como um objeto Uma maneira de incluir elementos de linguagem em um programa Acesso sequencial aos elementos de uma coleção Define uma comunicação simplificada entre classes Capturar e restaurar um estado interno de objetos Um modo de notificar a alteração de um número de classes Alterar um comportamento de objetos quando seu estado Changes Encapsula um algoritmo dentro de uma classe Adia as etapas exatas de um algoritmo para uma subclasse Define uma nova operação para uma classe sem alterar Design Pattern Framework 4.5 Gang de Quatro Padrões Head Primeiro Padrões Enterprise Padrões Multi-Tier Padrões Repositório Padrão Unidade de Trabalho Padrão Padrão de registro ativo CQRS PatternModel Ver modelo de controlador Ver modelo de modelo de apresentador ViewModelSpark TM Plataforma RAD Art Shop Aplicação MVC Mais. - Instant Access - Instant Download Design Padrão Estrutura 4.5 Gang de Quatro Padrões Cabeça Primeiros Padrões Padrões Empresariais Padrões Multi-Tier Padrão de Repositório Padrão de Unidade de Trabalho Padrão de Registro Ativo Padrão de CQRS Padrão de Modelos Modelador de Modelos de Visualização Visualizador de Modelo ViewModelSpark TM RAD Platform Art A seção anterior deste tutorial analisou os elementos que compõem um sistema de negociação e discutiu as vantagens e desvantagens de usar esse sistema em um ambiente de negociação ao vivo. Nesta seção, desenvolvemos esse conhecimento examinando quais mercados são especialmente adequados para o sistema de negociação. Em seguida, teremos um olhar mais aprofundado sobre os diferentes gêneros de sistemas de negociação. Negociação em mercados diferentes Mercados de ações O mercado de ações é provavelmente o mercado mais comum para o comércio, especialmente entre os noviços. Nesta arena, grandes jogadores como Warren Buffett e Merrill Lynch dominam, e valor tradicional e estratégias de investimento de crescimento são de longe o mais comum. No entanto, muitas instituições investiram significativamente na concepção, desenvolvimento e implementação de sistemas de negociação. Investidores individuais estão se juntando a esta tendência, embora lentamente. Aqui estão alguns fatores-chave para se manter em mente ao usar sistemas de negociação em mercados de ações: 13 A grande quantidade de ações disponíveis permite que os comerciantes testem sistemas em muitos tipos diferentes de ações - desde estoques extremamente voláteis de balcão (OTC) até Blue chips não voláteis. A eficácia dos sistemas de negociação pode ser limitada pela baixa liquidez de algumas ações, especialmente OTC e questões rosa folha. Comissões podem comer em lucros gerados por negócios bem sucedidos, e pode aumentar as perdas. OTC e ações de folha rosa muitas vezes incorrem taxas de comissão adicionais. Os principais sistemas de negociação utilizados são aqueles que buscam valor - isto é, sistemas que usam parâmetros diferentes para determinar se uma segurança é subvalorizada em comparação com seu desempenho passado, seus pares ou o mercado em geral. Mercados de câmbio O mercado de câmbio, ou forex. É o mercado maior e mais líquido do mundo. Os governos mundiais, bancos e outras grandes instituições comercializam trilhões de dólares no mercado cambial todos os dias. A maioria dos comerciantes institucionais no forex dependem de sistemas de negociação. O mesmo vale para os indivíduos no forex, mas alguns comércio com base em relatórios econômicos ou payouts. Here interesse são alguns fatores-chave a ter em mente ao usar sistemas de negociação no mercado forex: A liquidez neste mercado - devido ao enorme volume - Torna os sistemas de negociação mais precisos e eficazes. Não há comissões neste mercado, apenas spreads. Portanto, é muito mais fácil fazer muitas transações sem aumentar os custos. Em comparação com a quantidade de ações ou commodities disponíveis, o número de moedas para o comércio é limitado. Mas devido à disponibilidade de pares de moedas exóticas - ou seja, moedas de países menores - a gama em termos de volatilidade não é necessariamente limitada. Os principais sistemas de negociação utilizados no forex são aqueles que seguem as tendências (um ditado popular no mercado é a tendência é seu amigo), ou sistemas que compram ou vendem em fugas. Isso ocorre porque os indicadores econômicos geralmente causam grandes movimentos de preços ao mesmo tempo. Futuros Equity, forex e mercados de commodities oferecem todos os futuros de negociação. Este é um veículo popular para o sistema de negociação por causa da maior quantidade de alavancagem disponível eo aumento da liquidez e volatilidade. No entanto, esses fatores podem cortar as duas maneiras: eles podem amplificar seus ganhos ou amplificar suas perdas. Por esta razão, o uso de futuros é geralmente reservado para avançados comerciantes de sistemas individuais e institucionais. Isso ocorre porque os sistemas de negociação capazes de capitalizar o mercado de futuros exigem personalização muito maior, usam indicadores mais avançados e levam muito mais tempo para serem desenvolvidos. Assim, o que é melhor Seu até o investidor individual para decidir qual mercado é mais adequado para o sistema de negociação - cada um tem suas próprias vantagens e desvantagens. A maioria das pessoas está mais familiarizada com os mercados de ações, e essa familiaridade torna o desenvolvimento de um sistema de negociação mais fácil. No entanto, forex é comumente pensado para ser a plataforma superior para executar sistemas de negociação - especialmente entre os comerciantes mais experientes. Além disso, se um comerciante decide capitalizar sobre alavancagem aumentada e volatilidade, a alternativa de futuros está sempre aberta. Em última análise, a escolha está nas mãos do desenvolvedor do sistema. Tipos de sistemas de negociação Trend-Seguindo sistemas O método mais comum de negociação do sistema é a tendência de seguir o sistema. Em sua forma mais fundamental, este sistema simplesmente espera por um movimento significativo de preços, então compra ou vende nessa direção. Este tipo de bancos de sistema na esperança de que esses movimentos de preços irá manter a tendência. Moving Average Systems Freqüentemente utilizado na análise técnica. Uma média móvel é um indicador que simplesmente mostra o preço médio de uma ação ao longo de um período de tempo. A essência das tendências é derivada dessa medida. A forma mais comum de determinar entrada e saída é um crossover. A lógica por trás disso é simples: uma nova tendência é estabelecida quando o preço cai acima ou abaixo de sua média de preços históricos (tendência). Aqui está um gráfico que traça tanto o preço (linha azul) ea MA de 20 dias (linha vermelha) da IBM: Breakout Systems O conceito fundamental por trás deste tipo de sistema é semelhante ao de um sistema de média móvel. A idéia é que quando uma nova alta ou baixa é estabelecida, o movimento de preços é mais provável que continue na direção da fuga. Um indicador que pode ser usado na determinação de breakouts é uma simples Bollinger Band overlay. Bandas Bollinger mostram médias de preços altos e baixos, e breakouts ocorrem quando o preço encontra as bordas das bandas. Desvantagens dos Sistemas de Tendência: Necessário tomada de decisão empírica - Ao determinar as tendências, há sempre um elemento empírico a considerar: a duração da A tendência histórica. Por exemplo, a média móvel pode ser nos últimos 20 dias ou nos últimos cinco anos, de modo que o desenvolvedor deve determinar qual é o melhor para o sistema. Outros fatores a serem determinados são os altos e baixos médios em sistemas breakout. Lagging Nature - As médias móveis e os sistemas breakout sempre estarão atrasados. Em outras palavras, eles nunca podem atingir o exato topo ou fundo de uma tendência. Isso inevitavelmente resulta em uma perda de lucros potenciais, que às vezes pode ser significativa. Efeito Whipsaw - Entre as forças de mercado que são prejudiciais ao sucesso dos sistemas de tendências, esta é uma das mais comuns. O efeito whipsaw ocorre quando a média móvel gera um sinal falso - ou seja, quando a média cai apenas no intervalo, em seguida, repentinamente inverte a direção. Isto pode levar a perdas maciças, a menos que sejam utilizadas técnicas eficazes de parar-perdas e de gestão de riscos. Sideways Markets - Trend-sistemas de seguimento são, por natureza, capaz de ganhar dinheiro apenas em mercados que realmente tendem. No entanto, os mercados também se movem lateralmente. Permanecendo dentro de um certo intervalo por um período prolongado de tempo. A volatilidade extrema pode ocorrer - Ocasionalmente, os sistemas que seguem tendências podem experimentar alguma volatilidade extrema, mas o profissional deve ficar com seu sistema. A incapacidade de fazê-lo resultará em falha garantida. Sistemas de contra-tendência Basicamente, o objetivo com o sistema de contra-tendência é comprar no mais baixo baixo e vender no mais alto. A principal diferença entre este e o sistema de tendências é que o sistema de contra-tendência não é auto-corrigido. Em outras palavras, não há tempo definido para sair de posições, e isso resulta em um potencial de downside ilimitado. Tipos de sistemas de contra-tendência Muitos tipos diferentes de sistemas são considerados sistemas de contra-tendência. A idéia aqui é comprar quando momentum em uma direção começa a desaparecer. Isso é mais freqüentemente calculado usando osciladores. Por exemplo, um sinal pode ser gerado quando estocásticos ou outros indicadores de força relativa caem abaixo de certos pontos. Existem outros tipos de sistemas de trading de contra-tendência, mas todos eles compartilham o mesmo objetivo fundamental - comprar baixo e vender alto. Desvantagens de Sistemas de Acompanhamento de Contrapartida: Necessário Tomada de Decisões - Por exemplo, um dos fatores que o desenvolvedor do sistema deve decidir são os pontos em que os indicadores de força relativa se desvanecem. Extrema Volatilidade Pode Ocorrer - Estes sistemas também podem experimentar alguma volatilidade extrema, e uma incapacidade de ficar com o sistema, apesar desta volatilidade resultará em falha garantida. Desvantagem ilimitada - Como mencionado anteriormente, há um potencial de descida ilimitado porque o sistema não é auto-corrigido (não há tempo definido para sair das posições). Conclusão Os principais mercados para os quais os sistemas de negociação são adequados são os mercados de ações, forex e futuros. Cada um desses mercados tem suas vantagens e desvantagens. Os dois principais gêneros de sistemas de negociação são os sistemas de tendência e de contra-tendência. Apesar de suas diferenças, ambos os tipos de sistemas, em seus estágios de desenvolvimento, requerem tomada de decisão empírica por parte do desenvolvedor. Além disso, esses sistemas estão sujeitos a extrema volatilidade e isso pode exigir alguma resistência - é essencial que o comerciante do sistema ficar com o seu sistema durante estes tempos. Na próxima parcela, bem dar uma olhada em como projetar um sistema comercial e discutir alguns dos softwares que os comerciantes do sistema usam para tornar suas vidas mais fáceis. Trading Systems: Projetando seu sistema - parte 2Subscrever a notícia a usar-se para os insights e a análise os mais atrasados ​​Eu estou no processo de projetar uma aplicação de troca que use uma API dos mercados para colocar ordens no mercado. Esta não é uma aplicação de negociação algorítmica de alto desempenho complexo do tipo encontrado em bancos de investimento. Esta é apenas uma pequena aplicação pessoal que irá comércio talvez duas ou três vezes por dia, dependendo das condições de mercado / tendências A aplicação será composto (aproximadamente) dos seguintes módulos / pacotes: Estratégias - Os algoritmos de negociação real Analytics - As classes para analisar o Preços ao vivo ordens de ampères no mercado para produzir sinais de compra / venda Serviços - As classes usadas para manter uma conexão com o mercado, recuperar informações de mercado e colocar ordens de compra / venda. Até agora, tudo o que é necessário para a aplicação parece estar disponível na internet: Apache CXF para gerar as classes Java usadas para acessar os serviços web de mercados. Apache Maths para a realização da análise de preços Wikipedia para os padrões de design diferentes, como Fábrica, Assunto / Observador, Estado, etc Onde estou realmente preso no entanto é com os algoritmos. Ive decidiu usar o padrão de Estado para particionar, em agrupamentos lógicos, as várias peças de lógica que devem ser realizadas quando certas condições de mercado são atendidas. O problema é que eu estou começando a ver que é muito provável que cada classe de estado irá conter uma explosão de instruções if else: Eu não posso ajudar, mas sinto falta algo aqui e que deve existir alguma estrutura ou padrão de design Eu não sei sobre qual Permite que o desenvolvedor encapsule todas as entradas e saídas de um dado contexto de negócios em um número finito de ações de negócios de entrada / saída nas quais regras de negócios podem ser construídas. I. e. Em vez de ter que hardcode algoritmos Im esperando que ele deve ser possível fazer o aplicativo em um processador de regras de algum tipo. Infelizmente eu não sei por onde começar. Espero que eu tenha explicado o meu dilema com clareza suficiente, se você gostaria de me esclarecer qualquer coisa, por favor me avise. Obrigado perguntou Oct 8 09 às 22: 48Messaging Patterns 187 Padrões de Integração na Prática 187 Estudo de Caso: Bond Trading System (por Jonathan Simon) É fácil distanciar-se de uma grande coleção de padrões ou uma linguagem padrão. Padrões são a abstração de uma idéia em uma forma reutilizável. Muitas vezes, a natureza muito genérica de 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 padrões é um exemplo do mundo real. Não é um cenário artificial do que poderia acontecer, mas o que realmente acontece eo que vai acontecer. Este capítulo aplica padrões para resolver problemas usando um processo de descoberta. O sistema que vamos discutir é um sistema de comércio de títulos que eu trabalhei com dois anos a partir do projeto inicial através da 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 a forma de combinar e ajustar padrões para atender às necessidades do sistema. E isso tudo é feito levando em conta as forças encontradas em sistemas reais, incluindo requisitos de negócios, decisões de clientes, requisitos arquitetônicos e técnicos, bem como a 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 planeja construir um sistema de precificação 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 de 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 preços de todas as suas obrigações combinadas com funcionalidade analítica avançada específica para o mercado de títulos em uma única interface de usuário encapsulada. Isto significa integração e comunicação com vários componentes através de vários protocolos de comunicação. O fluxo de alto nível do sistema se parece com isto: Primeiro, os dados de mercado entram no sistema. Dados de mercado são dados sobre o preço e outras propriedades do título representando o que as pessoas estão dispostas a comprar e vender o título para no mercado livre. Os dados de mercado são imediatamente enviados para o mecanismo de análise que altera os dados. Analytics refere-se a funções matemáticas para aplicações financeiras que alteram os preços e outros atributos de 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 específica. O aplicativo cliente que será executado em cada desktop do comerciante irá configurar o mecanismo de análise em uma base por comerciante, controlando as especificidades da análise para cada vínculo que o comerciante está precificando. Uma vez que as análises são aplicadas aos dados de mercado, os dados modificados são enviados para vários locais de negociação onde 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 operadores precisam de um aplicativo muito responsivo nas estações de trabalho Windows NT e Solaris. Portanto, decidimos implementar o aplicativo cliente como um cliente de espessura Java devido à sua independência de plataforma e sua capacidade de responder rapidamente aos dados de entrada e de dados do usuário. No lado do servidor, estamos herdando legado componentes C que nosso sistema utilizará. Os componentes de dados de mercado se comunicam com a infra-estrutura de mensagens do TIBCO Information Bus (TIB). Estamos herdando os seguintes componentes: Market Data Price Feed Server. Publica os dados do mercado de entrada para o TIB. Mecanismo de análise. Realiza análises em dados de mercado de entrada e transmite os dados de mercado modificados para o TIB. Servidor de Contribuição. Realiza toda a comunicação com locais de negociação. Os locais de negociação são componentes de terceiros não controlados pelo banco. Legacy Market Data Subsystem Legacy Contribuição Subsistema Precisamos decidir como os subsistemas separados (Java thick cliente, dados de mercado e contribuição) vão se comunicar. Poderíamos ter o cliente grosso se comunicar diretamente com os servidores legados, mas isso exigiria muita lógica de negócios no cliente. Em vez disso, construa bem um par de gateways Java para se comunicar com os servidores herdados O Gateway de Preços para dados de mercado, um Gateway de Contribuição para enviar os preços para locais de negociação. Isso vai conseguir encapsulamento agradável da lógica de negócios relacionados 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. Vejamos os quatro estilos de integração sugeridos neste livro: Transferência de Arquivos. Banco de Dados Compartilhado. Invocação de Procedimento Remoto. E Mensagens. Podemos descartar banco de dados compartilhado imediatamente porque queríamos criar uma camada de abstração entre o cliente e o banco de dados e não queremos ter código de acesso ao banco de dados no cliente. A Transferência de Arquivos também pode ser descartada, uma vez que é necessária latência mínima para garantir que os preços atuais são enviados para os locais de negociação. Isso nos deixa com uma escolha entre Remote Procedure Invocation ou Messaging. A plataforma Java oferece suporte interno para a Invocação de Procedimento Remoto e para a Mensagens. A integração de estilo RPC pode ser alcançada usando Remote Method Invocation (RMI), CORBA ou Enterprise Java Beans (EJB). O Java Messaging Service (JMS) é a API comum para a integração de estilo de mensagens. Assim, ambos os estilos de integração são fáceis de implementar em Java. Então, qual funcionará melhor para este projeto, Remote Procedure Invocation ou Messaging. Há apenas uma instância do gateway de preços e uma instância do gateway de contribuição no sistema, mas normalmente muitos clientes grossos se conectam simultaneamente a esses serviços (um para cada comerciante de títulos que acontece de estar conectado em um determinado momento). Além disso, o banco gostaria que este fosse um sistema de preços genérico que pode ser utilizado em outras aplicações. Assim, além de um número desconhecido de Think Clients, pode haver um número desconhecido de outros aplicativos usando os dados de preços que saem dos Gateways. Um Thick Client (ou outro aplicativo usando os dados de precificação) pode usar facilmente o RPC para fazer chamadas aos Gateways para obter dados de preços e invocar o processamento. No entanto, os dados de preços serão constantemente publicados, e alguns clientes só estão interessados ​​em determinados dados, de modo a obter os dados relevantes para os clientes adequados em tempo hábil poderia ser difícil. Os clientes poderiam pesquisar os Gateways, mas isso criará um monte de sobrecarga. Seria melhor para os Gateways disponibilizar os dados aos clientes assim que eles estiverem disponíveis. Isso, contudo, exigirá que cada Gateway fique atento a quais clientes estão atualmente ativos, e que querem que dados particulares então, quando um novo pedaço de dados estiver disponível (o que acontecerá várias vezes por segundo), o Gateway terá que fazer Um RPC para cada cliente interessado para passar os dados para o cliente. Idealmente, todos os clientes devem ser notificados simultaneamente, de modo que cada RPC precisa ser feito em seu próprio segmento concorrente. Isso pode funcionar, mas está ficando muito complicado muito rápido. Mensagens simplifica muito este problema. Com Mensagens. Podemos definir canais separados para os diferentes tipos de dados de precificação. Então, quando um Gateway recebe um novo pedaço de dados, ele irá adicionar uma mensagem contendo esses dados para o Publish-Subscribe Channel para esse tipo de dados. Enquanto isso, todos os clientes interessados ​​em um determinado tipo de dados vão ouvir no canal para esse tipo. Desta forma, os Gateways podem facilmente enviar novos dados para quem estiver interessado, sem precisar saber quantos aplicativos ouvintes existem ou quais são. Os clientes ainda precisam ser capazes de invocar o comportamento nos Gateways também. Como há 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 implementadas com bastante facilidade usando RPC. No entanto, uma vez que já estamos usando mensagens para a comunicação do Gateway-para-cliente, as mensagens são provavelmente uma maneira tão boa de implementar comunicação cliente-a-Gateway também. Portanto, toda a comunicação entre os Gateways e os clientes será realizada através de mensagens. Como todos os componentes são escritos em Java, o JMS apresenta uma escolha fácil para o sistema de mensagens. Isso é efetivamente criar um Message Bus ou uma arquitetura que tornará possível para sistemas futuros se integrarem com o sistema atual com pouca ou nenhuma mudança na infra-estrutura de mensagens. Desta forma, a funcionalidade de negócios do aplicativo pode ser facilmente usado por outras aplicações que o banco desenvolve. Componentes Java Comunicação com JMS O JMS é simplesmente uma especificação e precisamos decidir sobre um sistema de mensagens compatível com JMS. Decidimos usar o IBM MQSeries JMS porque o banco é uma loja da IBM, usando servidores de aplicativos WebSphere e muitos outros produtos da IBM. Como resultado, usaremos o MQSeries já que já temos uma infraestrutura de suporte instalada e uma licença de site do produto. A próxima pergunta é como conectar o sistema de mensagens MQSeries com o servidor C Contribution autônomo e os servidores TIBCO Market Data e Analytics Engine baseados. Precisamos de uma maneira para que os consumidores do MQSeries tenham acesso às mensagens TIB. Mas como Poderíamos usar o padrão Message Translator para traduzir mensagens TIB em mensagens MQSeries. Embora o cliente C para MQSeries serve como um Message Translator. Usá-lo sacrificaria a independência do servidor JMS. E embora o TIBCO tenha uma API Java, o arquiteto e gerente do cliente o rejeitaram. Como resultado, a abordagem Message Translator tem de ser abandonada. A ponte do servidor TIB para o servidor MQSeries requer comunicação entre C e Java. Poderíamos usar o CORBA, mas, em seguida, o que dizer sobre o envio de mensagens? Um olhar mais atento ao padrão 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 Canais é conectar sistemas sem mensagens a sistemas de mensagens. Um par de adaptadores de canal que conecta dois sistemas de mensagens é um Messaging Bridge. O propósito 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 Java-C intra-idioma. Podemos implementar o Cross Language Messaging Bridge usando uma combinação de Channel Adapter s e CORBA. Vamos construir dois servidores de adaptador de canal leves, um em C gerenciando a comunicação com o TIB e outro em Java gerenciando a comunicação com o JMS. Estes dois Channel Adapter. Que são Message Endpoint s próprios, comunicarão uns com os outros através de CORBA. Como a nossa escolha para MQSeries, vamos usar CORBA em vez de JNI, uma vez que é um padrão da empresa. A ponte de mensagens implementa a tradução de mensagens simulada entre sistemas de mensagens aparentemente incompatíveis e diferentes idiomas. Conversor de mensagens usando adaptadores de canal O diagrama seguinte mostra o projeto atual do sistema, incluindo os gateways e outros componentes. Este é um bom exemplo de aplicação de padrão. Combinamos dois Adaptadores de Canal com um protocolo sem mensagens para implementar o padrão Message Translator, usando efetivamente um padrão para implementar outro padrão. Além disso, alteramos o contexto do adaptador de canal para vincular dois sistemas de mensagens com um protocolo de tradução de linguagem cruzada sem mensagens, ao invés de conectar um sistema de mensagens a um sistema sem mensagens. O sistema atual com os adaptadores de canal Estruturação de canais Uma chave para trabalhar com padrões não é apenas saber quando usar o padrão, mas também como usá-lo mais eficazmente. Cada implementação de padrão deve levar em conta aspectos específicos da plataforma de tecnologia, bem como outros critérios de design. Esta seção aplica o mesmo processo de descoberta para encontrar o uso mais eficiente do Canal de Publicação-Inscrição no contexto do servidor de dados de mercado que se comunica com o mecanismo de análise. Dados de mercado em tempo real se originam com o feed de dados de mercado, um servidor C que difunde dados de mercado no TIB. O feed de dados de mercado usa um Canal de Publicação-Inscrição separado para cada vínculo para o qual está sendo publicado. Isso pode parecer um pouco extremo, pois cada novo vínculo 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 tópicos chamados assuntos. O servidor TIBCO filtra um único fluxo de mensagens por assunto, enviando cada assunto único para um único canal virtual. O resultado é um canal de mensagens muito leve. Poderíamos criar um sistema que publicasse em alguns canais e os assinantes pudessem ouvir apenas os preços em que estão interessados. 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 Devem ser processados ​​à medida que são recebidos. Dado que os dados de mercado são publicados em canais dedicados a obrigações, os assinantes podem registar actualizações numa série de obrigações. Isso efetivamente permite aos assinantes filtrar seletivamente assinando canais e apenas receber atualizações de interesse ao invés de decidir após a mensagem é recebida. É importante notar que o uso de vários 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 implementar ou possuir filtros ou utilizar a filtragem de canal construída em TIBCO - em vez de usar tantos canais. O próximo componente que precisamos projetar é o mecanismo de análise, outro servidor C / TIB que irá modificar os dados de mercado e retransmiti-lo para o TIB. Embora esteja fora do escopo do nosso desenvolvimento Java / JMS, estamos trabalhando em estreita colaboração com a equipe C para projetá-lo, uma vez que somos o cliente principal dos mecanismos de análise. O problema em questão é encontrar a estrutura de canal que mais eficientemente retransmita os dados de mercado recentemente modificados. Como já temos um canal de mensagens dedicado por ligação herdada do feed de preços de dados de mercado, seria lógico modificar os dados de mercado e retransmitir os dados de mercado modificados no canal de mensagens dedicado dedicado. Mas isso não vai funcionar uma vez que o analytics modificando os preços dos títulos são específicos do comerciante. Se nós rebroadcast os dados modificados no bond Message Channel. Vamos destruir a integridade dos dados, substituindo dados genéricos de mercado com dados específicos do comerciante. Por outro lado, poderíamos ter um tipo de mensagem diferente para dados de mercado específicos do comerciante que publicamos no mesmo canal, permitindo que os assinantes decidam qual mensagem eles estão interessados ​​em evitar destruir a integridade dos dados. Mas então os clientes terão que implementar seus próprios filtros para separar para fora mensagens para outros comerciantes. Além disso, haverá um aumento substancial nas mensagens recebidas pelos assinantes, colocando uma carga desnecessária sobre eles. Existem duas opções: Um Canal por Trader: Cada trader tem um canal designado para os dados de mercado modificados. Desta forma, os dados do mercado original permanece intacta e cada aplicação comerciante pode ouvir seus comerciantes específicos Message Channel para as atualizações de preços modificados. Um Canal por comerciante por Bônus: Crie um Canal de Mensagem por comerciante por ligação apenas para os dados de mercado modificados dessa ligação. Por exemplo, os dados de mercado para o ABC de obrigações 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 no Trader B, Bond ABC e em breve. Um canal por comerciante Um canal por ligação por comerciante Há vantagens e desvantagens para cada abordagem. A abordagem por ligação, por exemplo, usa muito mais Message Channel. No pior cenário, o número de Message Channel será o número de títulos total multiplicado pelo número de comerciantes. Podemos colocar limites superiores sobre o número de canais que serão criados, uma vez que sabemos que existem apenas cerca de 20 comerciantes e nunca preço mais de um par cem títulos. Isso coloca o limite superior abaixo da faixa de 10.000, o que não é tão estranho comparado ao quase 100.000 Canal de Mensagem que o feed de preços de mercado está usando. Além disso, como estamos usando o TIB eo Message Channel são bastante baratos, o número de Message Channel s não é um problema grave. Por outro lado, o grande número de Message Channel s poderia ser um problema de uma perspectiva de gestão. Cada vez que um vínculo é adicionado um canal para cada comerciante deve ser mantida. Isso poderia ser grave em um sistema muito dinâmico. Nosso sistema, entretanto, é essencialmente estático. Ele também tem uma infra-estrutura para gerenciar automaticamente o Canal de Mensagens. Isso combinado com a arquitetura herdada de um componente legado usando uma abordagem semelhante minimiza o lado negativo. Isto não quer dizer que devemos fazer um número desnecessariamente excessivo de Canal de Mensagens. Em vez disso, podemos implementar uma abordagem arquitetônica que usa um grande número de canais de mensagens quando há uma razão. E há uma razão, neste caso, que se resume ao local da lógica. Se implementarmos a abordagem por comerciante, o Google Analytics Engine precisará de lógica para agrupar canais de entrada e saída. Isso ocorre porque os canais de entrada do mecanismo do Google Analytics são por vínculo e o canal de mensagens de saída seria por comerciante, exigindo que o mecanismo do Google Analytics Engine encaminhe todos os dados analíticos de várias obrigações para um comerciante específico para um canal de mensagem de saída específico do operador. Isso efetivamente transforma o mecanismo de análise em um roteador baseado em conteúdo para implementar lógica de roteamento personalizado para nosso aplicativo. Seguindo a estrutura de barramento de mensagens, o Google Analytics Engine é um servidor genérico que pode ser usado por vários outros sistemas no. Por isso, não queremos cloud com a funcionalidade específica do sistema. Por outro lado, a abordagem por ligação funciona uma vez que a ideia de um comerciante possuir a saída analítica dos preços dos títulos é uma prática aceita pela empresa. A abordagem por ligação mantém intacta a separação do canal de mensagens do feed de dados do mercado, ao mesmo tempo que adiciona mais 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 seja executado na área de trabalho dos operadores para estar 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 duas razões que estariam 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, o que nos permite evitar a filtragem mais tarde no fluxo de dados. Olhando para os nossos componentes Java, poderíamos colocá-lo no Pricing Gateway ou criar um componente intermediário entre o Pricing Gateway e o cliente. Em teoria, se persistisse a separação baseada em obrigações do Message Channel s até o cliente, o Pricing Gateway retransmitiria informações de preços com a mesma estrutura de canais do Pricing Gateway e do Google Analytics Engine. Isso significa uma duplicação de todos os canais dedicados TIB dedicados em JMS. Mesmo se criarmos um componente intermediário entre o Pricing Gateway eo cliente, o Pricing Gateway ainda terá de duplicar todos os canais no JMS. Por outro lado, implementar lógica diretamente no Pricing Gateway nos permite evitar a duplicação do grande número de canais em JMS, permitindo criar um número muito menor de canais na ordem de um por trader. O Gateway de Preços registra-se através do Adaptador de Canal C / TIB como um consumidor para cada ligação de cada comerciante no sistema. Em seguida, o gateway de preços encaminhará cada cliente específico apenas as mensagens relacionadas a esse comerciante em particular. Dessa forma, usamos apenas um pequeno número de Canal de Mensagens no final do JMS, enquanto maximizamos o benefício da separação no final do TIB. O Fluxo de Dados de Mercado completo para o cliente A discussão de layout de Canal de Mensagem é um bom exemplo de como a integração de padrões é importante. O objetivo aqui era descobrir como usar efetivamente o Canal de Mensagens. Dizer que você usa um padrão não é suficiente. Você precisa descobrir como melhor implementá-lo e incorporar em seu sistema para resolver os problemas na mão. Além disso, este exemplo mostra 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 geral mais simples com muitos menos canais. Selecionando um Canal de Mensagem Agora que conhecemos a mecânica de comunicação entre os componentes Java / JMS e os componentes C / TIBCO, e vimos alguma estruturação de Canal de Mensagem, precisamos decidir qual tipo de Canal de Mensagens JMS os componentes Java devem Usar para se comunicar. Antes de podermos escolher entre os diferentes canais de mensagens disponíveis no JMS, vamos observar o fluxo de mensagens de alto nível do sistema. Temos dois gateways (Preços e Contribuição) comunicando com o cliente. Os fluxos de dados de mercado para o cliente a partir do gateway de preços que envia para o gateway de contribuição. O aplicativo cliente envia mensagem para o gateway de preços para alterar a análise que está sendo aplicada a cada vínculo. O gateway de contribuição 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 Mensagem, Canal Ponto a Ponto (Fila JMS) e Canal de Publicação-Inscrição (Tópico JMS). Lembre-se de que o argumento para usar o publish-subscribe é permitir que todos os consumidores interessados ​​recebam uma mensagem, enquanto o argumento 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 cliente, deixando cada aplicativo cliente individual para decidir por si mesmo ou não para processar uma determinada mensagem. Isso não funcionará para nossa aplicação, pois há um grande número de mensagens de dados de mercado sendo enviadas para cada aplicativo cliente. Se transmitimos atualizações de dados de mercado para comerciantes desinteressados, estaremos desperdiçando desnecessariamente ciclos de processador de cliente decidindo se deve ou não processar uma atualização de dados de mercado. Ponto-a-Ponto Canal s inicialmente soar como uma boa escolha, uma vez que os clientes estão enviando mensagens para servidores únicos e vice-versa. Mas era uma exigência do negócio que os comerciantes puderam ser registrados dentro a máquinas múltiplas ao mesmo tempo. Se temos um operador conectado em duas estações de trabalho simultaneamente e uma atualização de preço ponto a ponto é enviada, apenas um dos dois aplicativos cliente receberá a mensagem. Isso ocorre porque somente um consumidor em um Canal Ponto-a-Ponto pode receber uma mensagem específica. Observe que apenas o primeiro de cada grupo de aplicativos clientes de um comerciante recebe a mensagem. Mensagens ponto-a-ponto para atualizações de preços Podemos resolver isso usando o padrão Lista de destinatários, que publica mensagens em uma lista de destinatários pretendidos, garantindo que somente os 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 aplicativo cliente relacionadas a cada operador. Enviar uma mensagem relacionada a um comerciante em particular, por sua vez, enviar a mensagem para cada aplicativo na lista de destinatários. Isso garante que todas as instâncias do aplicativo cliente relacionadas a um comerciante específico receberão a mensagem. A desvantagem desta abordagem é que ele requer um pouco de lógica de implementação para gerenciar os destinatários e mensagens de despacho. Lista de destinatários para atualizações de preços Mesmo que ponto-a-ponto poderia ser feito para trabalhar, vamos ver se existe uma maneira melhor. Usando o canal Publish-Subscribe, o sistema poderia transmitir mensagens em canais específicos do comerciante, em vez de canais específicos do aplicativo cliente. Desta forma, todas as aplicações de cliente que processam mensagens para um operador único receberiam e processariam a mensagem. Publicar-Subscrever Mensagens para Actualizações de Preços A desvantagem de utilizar o Canal de Publicação-Subscrição é que o processamento de mensagens exclusivo não é garantido com os componentes do servidor. Seria possível que várias instâncias de um componente de servidor fossem instanciadas e cada processo de instância a mesma mensagem, possivelmente enviando preços inválidos. Lembrando o fluxo de mensagens do sistema, apenas uma única direção de comunicação é satisfatória com cada Canal de Mensagem. A comunicação de servidor para cliente com publicar-assinar é satisfatória enquanto comunicação de cliente para servidor não é e comunicação de cliente-servidor com ponto-a-ponto é satisfatória enquanto servidor-cliente não é. Como não há necessidade de usar o mesmo Canal de Mensagem em ambas as direções, podemos usar cada Canal de Mensagem apenas em uma direção. A comunicação de cliente para servidor será implementada com ponto-a-ponto, enquanto a comunicação de servidor para cliente será implementada com publish-subscribe. Usando esta combinação de Message Channel s, o sistema se beneficia da comunicação direta com os componentes do servidor usando mensagens ponto-a-ponto e a natureza multicast de publish-subscribe sem nenhum dos inconvenientes. 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 cant 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, well 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. Whats 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. Com essa infra-estrutura, as mensagens podem ser recebidas pelo aplicativo cliente em quase qualquer taxa. 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 couldnt 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 dont necessarily make up for poor upfront design. Summary 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. Want to track what happened since the book came out Follow My Ramblings . Want to read more in depth Check out My Articles . Want to see me live See where I am speaking next . Find the full description of this pattern in: Enterprise Integration Patterns Gregor Hohpe and Bobby Woolf ISBN 0321200683 650 pages Addison-Wesley Parts of this page are made available under the Creative Commons Attribution license. You can reuse the pattern icon, the pattern name, the problem and solution statements (in bold), and the sketch under this license. Other portions of the text, such as text chapters or the full pattern text, are protected by copyright. Messaging Patterns 187 Integration Patterns in Practice 187 Case Study: Bond Trading System

No comments:

Post a Comment