Monday 26 March 2018

주식 거래 시스템 설계 패턴


시스템을 설계하는 트레이딩 시스템 - 제 1 부. 이 튜토리얼의 이전 섹션에서는 트레이딩 시스템을 구성하는 요소를 살펴보고 실제 트레이딩 환경에서 그러한 시스템을 사용하는 데 따른 장단점에 대해 논의했습니다. 이 섹션에서는, 어떤 시장이 시스템 거래에 특히 적합한 지 검토함으로써 우리는 다양한 거래 시스템의 장르에 대해 심도있게 살펴볼 것입니다. 다른 시장에서의 거래. 동등한 시장 주식 시장은 아마도 가장 일반적으로 거래되는 시장 일 것입니다. 초보자들 사이 특히 워렌 버핏 (Warren Buffett)과 메릴린치 (Merrill Lynch)와 같은 거물급 기업이 우위를 차지하고 전통적 가치와 성장 투자 전략이 가장 보편적입니다 그러나 많은 기관들이 거래 시스템의 설계, 개발 및 구현에 많은 투자를했습니다 개인 투자자 이 추세에 천천히 참여하고 있습니다. 여기에 주식 시장에서 거래 시스템을 사용할 때 명심해야 할 핵심 요소가 있습니다 s의 다량의 주식은 거래자가 매우 다른 유형의 주식 (극도로 휘발성 장외 거래 장외 주식에서 비 휘발성 우량주까지)의 시스템을 테스트 할 수있게 해줍니다. 트레이딩 시스템의 효과는 낮은 유동성으로 인해 제한 될 수 있습니다 일부 주식, 특히 OTC 및 분홍색 시트 발행물은 성공적인 거래로 인해 이익을 얻을 수 있으며 손실을 증가시킬 수 있습니다. OTC 및 분홍색 시트 주식은 종종 추가 수수료 수수료를 발생시킵니다. 주요 거래 시스템은 가치를 추구하는 시스템입니다 다른 매개 변수를 사용하여 보안이 과거 실적, 동종 업체 또는 시장 전반에 비해 과소 평가되었는지 여부를 결정합니다. 외환 시장 외환 시장 또는 외환 시장은 세계에서 가장 크고 가장 유동적 인 시장입니다. 세계 정부 , 은행 및 기타 대형 기관은 매일 외환 시장에서 수조 달러를 거래합니다 forex에있는 기관 트레이더의 대다수는 트라 드에 의존합니다 ing 시스템 Forex 시장에서 거래 시스템을 사용할 때 염두에 두어야 할 몇 가지 핵심 요소는 외환 시장에서 개인을 대상으로하지만 경제적 보고서 또는이자 지불금을 기반으로하는 일부 거래에 해당합니다. 이 시장의 유동성은 거대한 볼륨 - 거래 시스템을보다 정확하고 효율적으로 만듭니다. 이 시장에는 커미션이없고 스프레드 만 있습니다. 따라서 주식이나 상품의 가격에 대한 비용을 늘리지 않고도 많은 거래를하는 것이 훨씬 쉽습니다. 거래 할 통화의 수는 제한되어 있습니다. 그러나 이국적인 통화 쌍, 즉 소국의 통화의 가용성 때문에 변동성의 범위는 반드시 제한되지는 않습니다. 외환에서 사용되는 주요 거래 시스템은 시장에서 인기있는 트렌드가 추세를 따르는 추세입니다 너의 친구, 또는 탈주에서 팔거나 판매하는 시스템 이것은 경제 지표가 종종 한 번에 큰 가격 변동을 야기하기 때문이다. 선물 주식, 외환 및 상품 시장은 모두 미래 선물 거래를 제공합니다 이것은 사용 가능한 레버리지가 더 많고 유동성과 변동성이 증가하기 때문에 시스템 트레이딩을위한 대중적인 수단입니다 그러나 이러한 요소는 고객의 이익을 증폭 시키거나 손실을 증폭시킬 수있는 두 가지 방법을 모두 줄일 수 있습니다. 선물의 사용은 일반적으로 고급 개인 및 기관 시스템 트레이더를 위해 예약됩니다. 이것은 선물 시장을 활용할 수있는 트레이딩 시스템이 훨씬 더 많은 커스터마이징을 필요로하기 때문에 더 발전된 지표를 사용하고 개발하는 데 더 오래 걸립니다. 어느 것이 최고입니까? 개별 투자자가 시스템 트레이딩에 가장 적합한 시장을 결정 - 각자의 장단점이 있습니다 대부분의 사람들은 주식 시장에 더 익숙합니다. 이 친숙 함으로 인해 거래 시스템을 쉽게 개발할 수 있습니다. 그러나 외환은 일반적으로 우수한 플랫폼으로 여겨집니다 특히 경험 많은 거래자들 사이에서 거래 시스템을 운영 할 수 있습니다. 또한 상인이 상한을 결정하면 증가 레버리지와 변동성에 italize, 선물 대안은 항상 열려 있습니다 궁극적으로, 선택은 시스템 개발자의 손에 달려 있습니다. 거래 시스템의 유형. 추종 시스템 시스템 트레이딩의 가장 일반적인 방법은 추세 시스템입니다. 가장 근본적인 형태로, 이 시스템은 단순히 중요한 가격 움직임을 기다린 다음 그 방향으로 구매하거나 판매합니다. 이러한 유형의 시스템은 이러한 가격 움직임이 추세를 유지할 것이라는 희망에 기반을두고 있습니다. 이동 평균 시스템 기술적 분석에서 자주 사용되는 이동 평균은 일정 기간 동안 주식의 평균 가격을 단순히 표시하는 지표 추세의 본질은이 측정에서 파생됩니다. 진입 및 퇴출을 결정하는 가장 일반적인 방법은 교차입니다. 이 논리는 단순한 새로운 추세가 가격 역사적인 가격 평균 추세를 밑돌거나 아래로 떨어 뜨린다. IBM의 파산 선과 20 일 MA 레드 선을 그려 낸 차트가있다. 이러한 유형의 시스템의 기본 개념은 이동 평균 시스템의 기본 개념과 유사합니다. 새로운 고가 또는 저가가 설정되면 가격 이동이 브레이크 아웃 방향에서 계속 될 가능성이 높습니다. 브레이크 아웃을 결정하는 것은 간단한 Bollinger Band 오버레이입니다 Bollinger Bands는 가격이 높고 낮은 가격의 평균을 보여 주며 가격이 밴드의 가장자리를 만났을 때 발생합니다 다음은 Microsoft의 가격 파란색 선과 Bollinger Bands 회색 선을 그려주는 차트입니다 Trend - 시스템에 따르십시오. 의사 결정이 필요합니다. - 추세를 결정할 때, 역사적인 추세의 지속 시간을 고려하는 경험적 요소가 있습니다. 예를 들어, 이동 평균은 지난 20 일 동안 또는 지난 5 년 동안이었을 수 있습니다. 따라서 개발자 어떤 시스템이 시스템에 가장 적합한 지 결정해야합니다. 결정해야 할 다른 요소는 브레이크 아웃 시스템의 평균 최고 및 최저입니다. 래깅 특성 - 이동 평균 및 브레이크 아웃 시스템 항상 뒤처 질 것입니다. 다시 말해, 추세의 정확한 상단이나 하단을 칠 수는 없습니다. 이는 필연적으로 잠재적 인 이익의 몰수를 가져 오며 때로는 중요 할 수 있습니다. 챕스 효과 - 성공에 해로운 시장 세력 중 트렌드 추종 시스템, 이것은 가장 일반적인 것 중 하나입니다. 이동 평균이 거짓 신호를 생성 할 때 - 즉 평균이 범위로 떨어지면 갑자기 방향을 바꿀 때 휘파람 효과가 발생합니다. 손실 및 리스크 관리 기술이 사용됩니다. 측면 시장 - 트렌드 추종 시스템은 본질적으로 실제로는 추세를 보이는 시장에서만 수익을 창출 할 수 있습니다. 그러나 시장 또한 오랜 기간 동안 특정 범위 내에서 머물게됩니다. 익스 트림 변동성이 발생할 수 있음 - 때로는 추세 추적 시스템이 극단적 인 변동성을 겪을 수 있지만 상인은 자신의 시스템을 고수해야합니다. 카운터 트렌드 시스템 기본적으로 카운터 트렌드 시스템의 목표는 가장 낮은 최저 가격으로 구매하고 가장 높은 가격으로 판매하는 것입니다. 이 추세 추종 시스템과의 주요 차이점은 카운터 트렌드 시스템이 자체 수정이 아니라는 것입니다. , 위치를 빠져 나가기위한 정해진 시간이 없기 때문에 무한한 아래쪽 잠재력이 생깁니다. 반대 방향 시스템의 유형 많은 다른 유형의 시스템이 반대 경향 시스템으로 간주됩니다. 한 방향의 운동량이 페이딩하기 시작하면 구입하는 것이 좋습니다. 발진기 예를 들어, stochastics 또는 기타 상대 강도 표시기가 특정 지점 아래로 떨어지면 신호가 생성 될 수 있습니다. 카운터 트레드 거래 시스템의 다른 유형이 있지만 모두가 동일한 기본 목표를 공유합니다. 즉 낮은 가격으로 구매하고 높은 가격을 매기는 것입니다. Systems. E Mpirical Decision-Making Required - 예를 들어, 시스템 개발자가 결정해야하는 요소 중 하나는 핵심 요소입니다 극심한 변동성이 발생할 수 있음 - 이러한 시스템은 극단적 인 변동성을 겪을 수 있으며 이러한 변동성에도 불구하고 시스템을 고수 할 수 없기 때문에 확실한 실패를 초래할 수 있습니다. 제한없는 단점 - 앞서 언급 한 바와 같이 무제한 시스템이 자체 조정이 아니기 때문에 다운 사이드 가능성이있다. 거기서 출구를 정할 때가 없다. 결론 거래 시스템이 적합한 주 시장은 주식, 외환 및 선물 시장이다. 이들 시장 각각은 장점과 단점이있다. 두 가지 주요 장르 거래 시스템의 추세 및 추세 시스템 차이점에도 불구하고 두 가지 유형의 시스템은 개발 단계에서 개발자의 경험적 의사 결정이 필요합니다. 또한이 시스템은 극도의 변동성에 노출 될 수 있으며 체력 - 시스템 트레이더가이 시간 동안 자신의 시스템을 고수하는 것이 필수적입니다. 다음에서 우리는 거래 시스템을 설계하고 시스템 트레이더가 자신의 삶을 편하게하기 위해 사용하는 소프트웨어에 대해 토의하는 방법에 대해 자세히 살펴볼 것입니다. 시스템 설계 - 제 2 부. 시스템을 설계하는 앞 섹션에서 거래 할 수있는 시장의 종류 및 거래 시스템의 두 가지 기본 장르를 살펴 본다. 추세 및 추세 시스템이 두 가지 전략은 모든 거래 시스템이 구축되는 기반을 형성하고 시장은 매체를 제공한다. 우리는 두 장르를 개별 구성 요소로 나누고, 경험적 의사 결정 과정을 검토하고, 소프트웨어가 시스템 트레이딩에 어떻게 혁명을 일으켰는지 살펴 봅니다. 기본 트레이딩 시스템 구성 요소 소개에서 언급했듯이, 시스템은 매개 변수를 사용하여 구성됩니다 - 주어진 지분에 대한 진입 점 및 종점을 생성하는 특정 규칙의 그룹 추세 추적 및 카운터 트러 최종 거래 시스템은 모든 거래 시스템 구축을 관리하는 4 가지 기본 원칙을 준수합니다. 이러한 원칙은 효과적인 시스템의 필수적인 특성이기도합니다. 시스템이 돈을 벌어야합니다. - 말하기는 쉽지만 어렵습니다. 수익률 극대화는 다음과 같아야합니다. 시스템은 위험을 제한 할 수 있어야합니다. 극단적 인 최고점과 최저치 사이에서 변동하는 시스템을 사용하는 것은 어렵습니다. 청산 능력을 저해 할뿐만 아니라 심리적 부담이 될 수 있습니다. 리스크를 제한함으로써, 예를 들어 불량 항목의 영향을 감소시킬 수 있습니다. 시스템의 매개 변수는 안정적이고 실현 가능해야합니다. - 거래 시스템은 우연이나 운에 의존 할 수 없습니다. 시스템 설계자는이 원칙을 수행 할 수 있습니다 매개 변수를 확장하고 성공 확률을 높이기 위해 너무 많이 최적화하지 않음으로써 안정성 유지 매개 변수의 실현 가능성, 시스템을 설계 할 때 미끄러짐을 고려하는 것이 매우 중요합니다. 시스템의 시간 프레임은 안정적이어야하며 실행 가능해야합니다. 시스템의 시간 프레임이 성공하려면 우연과 일치가 필요합니다 요인을 재생해서는 안됨 실행 가능성도이 경우 고려해야 함 시간대를 너무 가깝게 설정하면 소프트웨어 제한 또는 시장 측 제한으로 인해 거래 빈도가 불가능할 수 있습니다. 경제적 결정 의사 결정 시스템은 설계자가 시스템의 성능에 직접적인 영향을 미치는 경험적 결정을 내려야합니다. - 의사 결정을 할 필요가 없다면 모두가 부유 할 것입니다. 시스템 설계자가 결정해야하는 몇 가지 기본 요소와 몇 가지 지침이 있습니다. 주식은 1 분에서 1 년 또는 그 이상에 이르는 다양한 기간 관점에서 분석 될 수 있습니다. n은 시스템의 성능에 큰 영향을 미친다. 보다 신뢰성있는 결과는 일반적으로 더 긴 시간대에서 발생하지만, 실제 시장 상황을 판단 할 때 단기간은 오도 할 수있다. 그러나 이것은 극도로 긴 가격 기간 만 사용해야한다는 것을 의미하지 않는다. 기간이 길수록 이익 실현에 오래 걸릴 수 있습니다. Microsoft의 장기적인 사례를 살펴보면 몇 년 간 단기간에 비해 20 년이 넘는 기간을 관찰 할 수 있습니다. 우리는 분명히 할 수 있습니다. 단기간은 장기간의 정확한 표현이 아니며 그 반대도 마찬가지입니다. 일반적으로 경험에 의하면 5 년에서 10 년은 중장기 시스템 거래자에게 좋은 목표이며 6 개월에서 5 년은 단기 트레이더의 합리적인 범위 다시 말하지만, 언제 청산 할 것인지에 달려 있습니다. 어떤 가격 시리즈를 사용해야합니까? 대부분의 주식은 파손되지 않은 가격 시리즈로 차트로 표시됩니다. 즉, 차트는 연속입니다. 선물 거래 및 그러나 일부 다른 주식에는 연속성 대신 실제 계약 데이터를 사용하는 옵션이 있습니다. 선물 계약 자체는 불과 몇 개월 동안 지속되며, 시스템 백 테스팅에는 종종 1 년 이상의 데이터가 필요하기 때문에 시스템 트레이더는 종종 연속 선물을 활용합니다. 일련의 계약을 결합하여 데이터를 연속적으로 생성하는 방법 일반적으로 장기 트레이더는 단기 선물을 사용해야하며 단기 트레이더는 실제 계약 데이터를 사용해야합니다. 어떤 매개 변수와 설정을 사용해야합니까? 후속 섹션에서 거래 시스템 구축을 설명 기본적으로 매개 변수는 추측 및 확인 또는 맹목적인 시뮬레이션 생성 또는 매개 변수 그룹 사전 설정을 통해 선택되고 평균을 사용하여 성능을 결정합니다. 위험 및 기타 여러 요소가 필요할 때까지 원하는 유동성 시간의 영향을받을 수 있으므로 어떤 작업을 결정할 시간이 필요합니다 당신에게 가장 적합합니다. 소프트웨어 및 시스템 트레이딩 컴퓨터의 진화는 아마도 시스템 거래의 가장 큰 원동력이었을 것입니다. 원래 컴퓨터는 수치를 계산하는 데 사용되어 결국 시뮬레이션을 수행하고 실시간으로 신호를 생성하며 심지어는 일부 소프트웨어는 시스템 개발자가 시스템을 구축 할 수있는 플랫폼으로 간단히 설계되었습니다. 다른 소프트웨어는 신경망을 사용하여 시장에서 배우고 자체 기능을 향상시킵니다. 일부 소프트웨어는 사용자의 하드 드라이브에 설치됩니다. 다른 소프트웨어는 제공됩니다 온라인 시스템 개발자가 사용하는 몇 가지 기본 프로그램이 있습니다. 클라이언트 측 소프트웨어 클라이언트 측 소프트웨어는 사용자 컴퓨터에 설치해야합니다. 종종 인터넷에 연결되어 있으며 가격, 뉴스 등 실시간 데이터를 얻을 수 있습니다 , 등 일부 회사는 소프트웨어뿐만 아니라 데이터 비용을 청구합니다. 이 응용 프로그램은 일반적으로 사용자가 시간주기, p 유형 arameters, and more 그러나 가장 중요한 기능 중 하나는 사용자에게 시스템을 프로그래밍 할 수있는 기능을 제공합니다. 이는 구매 및 판매 신호를 생성하기 위해 규칙을 설정할 수있는 자주 사용되는 응용 프로그램과 관련된 간단한 프로그래밍 언어를 사용하여 수행됩니다. MetaTrader라는 클라이언트 측 응용 프로그램의 예입니다. 서버 측 소프트웨어 서버 측 소프트웨어가 원격 서버에 설치되는 경우가 종종 있습니다. 이러한 응용 프로그램은 종종 원격 서버에 설치된 신호를 반환합니다. 웹 페이지 또는 구독자 기반이 기능은 웹 브라우저 이외의 클라이언트 측 소프트웨어가 필요하지 않습니다. 또한 사용자는 프로그램을 구입하고 데이터 구독을 지불하는 것과 달리 작은 구독료를 지불합니다. 마지막으로 사용자는 개발할 필요가 없습니다 시스템에서는 생성 된 신호 만 수신합니다. 하지만 클라이언트 유형 소프트웨어는 그렇지 않은 반면, 이러한 종류의 소프트웨어는 종종 사기에 취약하다는 것을 기억해야합니다. 자세한 내용은 Trading Syste ms Coding. Conclusion 이제 거래 시스템에 대한 기본적인 이해를 가지며, 존재하는 여러 유형의 시스템, 시스템을 디자인 할 때 고려해야 할 요소 및 시스템 거래를보다 쉽게하기 위해 사용되는 소프트웨어 다음으로, 실제로 거래 시스템을 구축하고이를 사용하는 방법을 검토 할 것입니다. 사례 연구 채권 거래 시스템에서 패턴을 통합하는 패턴을 메시징합니다. 조나단 사이먼 (Jonathan Simon). 많은 패턴 또는 패턴 언어 컬렉션에서 벗어나기 쉽습니다. 패턴은 재사용 가능한 형태로 아이디어를 추상화합니다. 종종 패턴을 매우 유용하게 만드는 매우 일반적인 특성으로 인해 파악하기가 어렵습니다. 때로는 패턴을 이해하는 데 도움이되는 가장 좋은 방법은 현실 세계의 예입니다. 일어날 수있는 일에 대한 인위적 시나리오가 아니라 실제로 일어나는 일과 앞으로 발생할 일에 대해 설명합니다. 이 장에서는 발견 프로세스를 사용하여 문제를 해결하기위한 패턴을 적용합니다. 논의 할 시스템은 채권 거래입니다 초기 설계부터 제작까지 2 년간 함께 작업 한 시스템 시나리오 및 문제와 패턴을 해결하는 방법을 탐구합니다. 패턴을 선택하는 결정 프로세스와 패턴을 결합 및 조정하는 방법이 포함됩니다 시스템의 요구 그리고 이것은 비즈니스 요구 사항, 고객 결정, ar 등 실제 시스템에서 발생하는 힘을 고려하여 모두 완료되었습니다. 아키텍처 및 기술 요구 사항 및 레거시 시스템 통합이 접근법의 목적은 실용적인 응용 프로그램을 통해 패턴 자체를보다 명확하게 이해하는 것입니다. 시스템 구축. 주요 월 스트리트 투자 은행은 채권 거래 데스크의 워크 플로우를 간소화하려는 노력 현재 채권 거래자는 다수의 채권에 대한 가격을 각각의 사용자 인터페이스가있는 여러 거래 현장에 보내야합니다. 시스템의 목표는 모든 채권에 대한 가격 책정의 세부 사항을 최소화하는 것입니다. 단일 채권 사용자 인터페이스에서 채권 시장에 특화된 고급 분석 기능과 결합 된 채권 다양한 커뮤니케이션 프로토콜을 통한 여러 구성 요소와의 통합 및 통신을 의미합니다 시스템의 높은 수준의 흐름은 다음과 같습니다. 첫째, 시장 데이터가 시스템 시장에 도입됩니다. 데이터는 사람들이 원하는 것을 대표하는 채권의 가격 및 기타 속성에 관한 데이터입니다. g 시장에 대한 채권 매매. 시장 데이터는 즉시 데이터를 변경하는 분석 엔진으로 전송됩니다. 분석은 채권의 가격 및 기타 속성을 변경하는 금융 애플리케이션의 수학 함수를 나타냅니다. 이는 입력을 사용하는 일반 함수입니다 함수의 결과를 특정 채권에 맞게 조정하는 변수 각 상장 데스크톱에서 실행되는 클라이언트 응용 프로그램은 상인이 가격을 책정하는 각 채권에 대한 분석의 특성을 제어하면서 상거래 기준으로 분석 엔진을 구성합니다. 시장 데이터에 적용된 수정 된 데이터는 다른 회사의 상인이 채권을 매매 할 수있는 다양한 거래 장소로 보내집니다. Patterns를 사용한 아키텍처. 시스템의 워크 플로우 개요를 통해 아키텍처 문제 중 일부에 접근 할 수 있습니다 우리는 설계 과정에서 마주 치게됩니다. 우리가 알고있는 것을 보도록하겠습니다. Traders는 Windows NT와 Windows NT 모두에서 매우 반응이 빠른 응용 프로그램이 필요합니다. d Solaris 워크 스테이션 따라서 우리는 플랫폼 독립성과 사용자 입력 및 시장 데이터에 신속하게 응답 할 수 있기 때문에 클라이언트 애플리케이션을 Java 씩 클라이언트로 구현하기로 결정했습니다. 서버 측에서 우리 시스템이 활용할 레거시 C 구성 요소를 상속합니다 시장 데이터 구성 요소는 TIBCO 정보 버스 TIB 메시징 인프라와 통신합니다. 다음 구성 요소를 상속합니다. 시장 데이터 가격 공급 서버 TIB. Analytics 엔진에 들어오는 시장 데이터를 게시합니다. 들어오는 시장 데이터에 대한 분석을 수행하고 수정 된 시장 데이터를 TIB. Contribution Server는 거래 장소와의 모든 통신을 수행합니다 거래 장소는 은행이 통제하지 않는 제 3 자 구성 요소입니다. 거래 시장 데이터 하위 시스템. 기부금 하위 시스템. 우리는 별도의 하위 시스템 Java 씩 클라이언트, 시장 데이터 및 기여가 어떻게 이루어지는 지 결정해야합니다. 의사 소통을하려고합니다. 두꺼운 클라이언트가 직접 파일과 통신 할 수 있습니다. gacy 서버를 사용하지만 클라이언트에 너무 많은 비즈니스 로직이 필요할 것입니다. 대신 레거시 서버와 통신 할 수 있도록 한 쌍의 Java 게이트웨이를 구축 할 것입니다. 시장 데이터를위한 가격 결정 게이트웨이 공헌 게이트웨이는 거래 장소에 가격을 전송합니다. 이 영역과 관련된 비즈니스 로직의 구성 요소 아래에 시스템의 현재 구성 요소가 표시되어 있습니다. 표시된 연결은 구성 요소의 일부가 통신하는 방법을 여전히 확신 할 수 없음을 나타냅니다. 시스템 및 구성 요소. 첫 번째 통신 문제는 Java 씩 클라이언트와 두 개의 Java 서버 구성 요소를 사용하여 데이터를 교환하십시오. 이 책에서 제안하는 네 가지 통합 스타일을 살펴 보겠습니다. 파일 전송 공유 데이터베이스 원격 프로 시저 호출 및 메시징 공유 데이터베이스를 즉시 제외 할 수 있습니다. 클라이언트와 데이터베이스 간의 추상화 및 클라이언트에 데이터베이스 액세스 코드가 필요하지 않음 파일 Transfe 현재 가격이 거래 장소로 보내지는 것을 보장하기 위해 최소 대기 시간이 필요하기 때문에 유사하게 배제 될 수 있습니다. 이로 인해 원격 프로 시저 호출 또는 메시징 사이에서 선택이 이루어집니다. Java 플랫폼은 원격 프로 시저 호출 및 메시징 원격 메소드 호출 RMI, CORBA 또는 Enterprise Java Beans EJB를 사용하여 RPC 스타일의 통합을 달성 할 수 있습니다. Java Messaging Service JMS는 메시징 스타일 통합을위한 공통 API이므로 두 가지 통합 스타일 모두 Java에서 구현하기 쉽습니다. 이 프로젝트의 경우 원격 프로 시저 호출 또는 메시징 시스템에는 가격 게이트웨이의 인스턴스 하나와 컨트 리뷰 션 게이트웨이 인스턴스 하나만 존재하지만 일반적으로 많은 씩 클라이언트는 로그인 한 각 채권 거래자에 대해 이러한 서비스에 동시에 연결합니다 특정 시점에 은행은 또한 다른 응용 프로그램에서 활용할 수있는 일반적인 가격 책정 시스템을 원합니다. 알 수없는 수의 Think Client 외에도 Gateways에서 나오는 가격 데이터를 사용하는 다른 응용 프로그램이 알려지지 않은 경우도 있습니다. 두꺼운 클라이언트 또는 가격 데이터를 사용하는 다른 응용 프로그램은 RPC를 사용하여 게이트웨이로 전화를 걸 수 있습니다 가격 데이터 및 호출 처리 그러나 가격 데이터는 지속적으로 게시되며 특정 클라이언트는 특정 데이터에만 관심이 있으므로 적시에 관련 고객에게 적절한 데이터를 제공하는 것이 어려울 수 있습니다 클라이언트는 게이트웨이를 폴링 할 수 있지만 오버 헤드가 많이 발생합니다. 게이트웨이에서 클라이언트가 데이터를 사용할 수있게되는 즉시 사용할 수있게하는 것이 좋습니다. 그러나 각 게이트웨이가 현재 어떤 클라이언트가 활성 상태인지, 어떤 특정 데이터가 필요한지 추적해야합니다. 그런 다음 초 당 여러 번 발생하는 새로운 데이터 조각이 사용 가능 해지면 게이트웨이는 관심있는 각 클라이언트에게 clie로 데이터를 전달하는 RPC를 만들어야합니다 nt 이상적으로 모든 클라이언트는 동시에 통보 받아야하기 때문에 각각의 RPC는 자체적 인 동시 스레드로 만들어야합니다. 작동하지만 매우 복잡해집니다. 메시징은이 문제를 크게 단순화 메시징을 통해 서로 다른 유형의 개별 채널을 정의 할 수 있습니다 그런 다음 게이트웨이가 새 데이터를 가져 오면 해당 데이터 유형에 대한 게시 - 구독 채널에 해당 데이터가 포함 된 메시지를 추가합니다. 한편 특정 유형의 데이터에 관심이있는 모든 클라이언트는 이러한 유형의 게이트웨이는 관심있는 사용자에게 새로운 데이터를 쉽게 보낼 수 있으며, 청취자 응용 프로그램이 얼마나 많은지 또는 그들이 무엇인지 알 필요도 없습니다. 클라이언트는 여전히 게이트웨이에서 동작을 호출 할 수 있어야합니다. 두 개의 게이트웨이 만 존재하며 클라이언트가 메소드를 동 기적으로 호출하는 동안 클라이언트를 차단할 수 있지만 이러한 클라이언트 - 게이트웨이 호출은 RPC를 사용하여 쉽게 구현할 수 있습니다. 이미 게이트웨이 간 통신을 위해 메시징을 사용하고 있기 때문에 메시지는 클라이언트 대 게이트웨이 통신을 구현하는 데에도 좋은 방법 일 수 있습니다. 따라서 게이트웨이와 클라이언트 간의 모든 통신은 메시징을 통해 수행됩니다. 구성 요소가 Java로 작성된 경우 JMS는 메시징 시스템으로 쉽게 선택 가능 메시징 인프라를 거의 변경하지 않고 현재 시스템과 통합 할 수있는 메시지 버스 또는 아키텍처를 효과적으로 만듭니다. Java 구성 요소 JMS. JMS와 통신하는 것은 단순히 사양이며 JMS 호환 메시징 시스템을 결정해야합니다. IBM MQSeries JMS를 사용하기로 결정했습니다. 은행은 IBM 응용 프로그램 서버 및 다른 많은 IBM 제품을 사용하는 IBM 상점입니다. 결과적으로 우리는 이미 h 다음으로는 MQSeries 메시징 시스템을 독립형 C Contribution 서버 및 TIBCO 기반 Market Data and Analytics Engine 서버에 연결하는 방법에 대해 설명합니다. MQSeries 소비자가 다음을 수행 할 수있는 방법이 필요합니다. TIB 메시지에 액세스 할 수 있습니다. 그러나 Message Translator 패턴을 사용하여 TIB 메시지를 MQSeries 메시지로 변환 할 수 있습니다. MQSeries 용 C 클라이언트는 JMS Translator로 사용되지만 JMS 서버 독립성은 희생됩니다. TIBCO에는 Java API가 있지만, 고객 아키텍트와 관리자가이를 거부했습니다. 결과적으로 Message Translator 접근법을 포기해야합니다. TIB 서버에서 MQSeries 서버로가는 다리는 C와 Java 사이의 통신이 필요합니다. CORBA를 사용할 수 있지만, Message Translator 패턴은 통신 프로토콜 사용시 채널 어댑터와 관련이 있음을 보여줍니다. 채널의 핵심 어댑터는 비 메시징 시스템을 메시징 시스템에 연결합니다. 두 메시징 시스템을 연결하는 한 쌍의 채널 어댑터는 메시징 브리지입니다. 메시징 브리지의 목적은 한 메시징 시스템에서 다른 메시징 시스템으로 메시지를 전송하는 것입니다. 언어 간 Java-C 통신의 복잡성 추가 채널 어댑터와 CORBA의 조합을 사용하여 교차 언어 메시징 브리지를 구현할 수 있습니다. TIB와의 통신을 관리하는 C에서 하나, JMS와의 통신을 관리하는 Java Message Endpoint 인이 두 채널 어댑터는 CORBA를 통해 서로 통신합니다. MQSeries에 대한 우리의 선택처럼 JNI가 회사 표준이기 때문에 CORBA를 사용합니다. 메시징 브리지는 효과적으로 시뮬레이션 된 메시지를 구현합니다 겉으로보기에는 호환되지 않는 메시징 시스템과 다른 언어 간의 번역. 채널 Adapte를 사용하는 메시지 번역기 다음 다이어그램은 게이트웨이 및 기타 구성 요소를 포함한 현재 시스템 설계를 보여줍니다. 이것은 패턴 적용의 좋은 예입니다. 두 개의 채널 어댑터를 비 메시징 프로토콜과 결합하여 효과적으로 Message Translator 패턴을 구현합니다. 패턴 추가로, 우리는 메시징 시스템을 비 메시징 시스템에 연결하지 않고 비 메시징 교차 언어 변환 프로토콜로 두 메시징 시스템을 연결하도록 채널 어댑터의 컨텍스트를 변경했습니다. 현재 채널 어댑터가있는 시스템. 구조 채널. 키 패턴을 사용하는 것은 언제 패턴을 사용할 것인지뿐만 아니라이를 가장 효과적으로 사용하는 방법을 알고 있습니다. 각 패턴 구현은 다른 설계 기준뿐만 아니라 기술 플랫폼의 특성을 고려해야합니다. 이 섹션에서는 동일한 발견 프로세스를 적용하여 시장 데이터 서버가 t와 통신 할 때 Publish-Subscribe 채널을 가장 효율적으로 사용 그는 분석 엔진입니다. 실시간 시장 데이터는 TIB에서 시장 데이터를 브로드 캐스팅하는 C 서버 인 시장 데이터 피드에서 유래합니다. 시장 데이터 피드는 각 본드마다 별도의 게시 - 구독 채널을 사용하여 가격을 게시합니다. 새로운 채권마다 새로운 채널이 필요합니다. 하지만 실제로는 TIBCO에서 채널을 만들 필요가 없으므로 심각하지 않습니다. 채널은 주제라는 계층 적 주제 이름 집합으로 참조됩니다. TIBCO 서버는 주제별로 단일 메시지 흐름을 필터링합니다 , 각각의 고유 한 주제를 하나의 가상 채널로 보냅니다. 결과는 매우 가벼운 메시지 채널입니다. 우리는 몇 채널을 게시하는 시스템을 만들 수 있었고 구독자는 관심있는 가격만을들을 수있었습니다. 구독자가 메시지 필터 (Message Filter) 또는 선택 소비자 (Selective Consumer)를 사용하여 관심있는 채권 가격에 대한 전체 데이터 흐름을 필터링하여 각 메시지가 수신 될 때 처리해야하는지 여부를 결정합니다. e 시장 데이터가 본드 전용 채널에 게시되면 구독자는 일련의 채권에 대한 업데이트를 등록 할 수 있습니다. 이로 인해 구독자는 채널을 선택적으로 구독하고 메시지를받은 후 결정하기보다는 관심있는 업데이트 만 수신하여 효과적으로 필터링 할 수 있습니다. 필터링을 피하기 위해 다중 채널을 사용하는 것이 메시징 채널의 비표준적인 사용 임에도 불구하고 TIBCO 기술의 맥락에서 TIBCO에 내장 된 채널 필터링을 구현하거나 소유할지 여부를 결정하고 있습니다. 채널 데이터를 수정하고이를 TIB에 다시 브로드 캐스팅하는 또 다른 C TIB 서버 인 분석 엔진입니다. Java JMS 개발의 범위를 벗어나지 만 C 코드와 긴밀히 협력하고 있습니다. 팀은 분석 엔진이므로 기본 설계 팀이 우선적으로 고려해야 할 문제는 가장 효율적으로 재로드 카가되는 채널 구조를 찾는 것입니다 우리는 이미 시장 데이터 가격 피드로부터 상속 된 채권마다 하나의 전용 메시지 채널을 가지고 있기 때문에 시장 데이터를 수정하고 본드 전용 메시지 채널에 수정 된 시장 데이터를 재방송하는 것은 논리적 일 것입니다. 그러나 이것은 work since the analytics modifying the bonds prices are trader specific If we rebroadcast the modified data on the bond Message Channel we will destroy the data integrity by replacing generic market data with trader specific data On the other hand, we could have a different message type for trader specific market data that we publish on the same channel allowing subscribers to decide which message they are interested in to avoid destroying the data integrity But then clients will have to implement their own filters to separate out messages for other traders Additionally, there will a substantial increase in messages received by subscribers, placing an unnecessary burden on them. There are two options. One Channel per Trader Each trader has a designated channel for the modified market data This way, the original market data remains intact and each trader application can listen to its specific traders Message Channel for the modified price updates. One Channel per trader per Bond Create one Message Channel per-trader per-bond solely for the modified market data of that bond For example, the market data for bond ABC would be published on channel Bond ABC while the modified market data for trader A would be published on Message Channel Trader A, Bond ABC , modified market data for trader B on Trader B, Bond ABC, and so on. One channel per trader. One channel per bond per trader. There are advantages and disadvantages to each approach The per-bond approach, for example, uses a lot more Message Channel In the worst-case scenario, the number of Message Channel will be the number of bonds total multiplied by the number of traders We can put upper bounds on the number of channels that will be created since we know that there are only around 20 traders and they never price more than a couple hundred bonds This puts the upper limit below the 10,000 range, which is not so outlandish compared to the nearly 100,000 Message Channel the market data price feed is using Also, since we are using the TIB and Message Channel are quite inexpensive, the number of Message Channel s is not a severe issue On the other hand, the sheer number of Message Channel s could be a problem from a management perspective Every time a bond is added a channel for each trader must be maintained This could be severe in a very dynamic system Our system, however, is essentially static It also has an infrastructure for automatically managing Message Channel s This combined with the inherited architecture of a legacy component using a similar approach minimizes the downside This is not to say we should make an unnecessarily excessive number of Message Channel s Rather, we can implement an architectural approach that uses a large number of Message Channel s when there is a reason. And there is a reason in this case that comes down to the location of logic If we implement the per trader approach, the Analytics Engine needs logic to group input and output channels This is because the input channels from the Analytics Engine are per bond and the output Message Channel s would be per trader, requiring the Analytics Engine to route all analytics input from multiple bonds for a particular trader to a trader specific output Message Channel This effectively turns the analytics engine into a Content-Based Router to implement custom routing logic for our application. Following the Message Bus structure, the Analytics Engine is a generic server that could be used by several other systems in the So we don t want to cloud it with system specific functionality On the other hand, the per-bond approach works since the idea of a trader owning the analytics output of bond prices is a company accepted practice The per-bond a pproach keeps the Message Channel separation of the market data feed intact, while adding several more Message Channel s Before we reach the client, we want a Content-Based Router to combine these several channels into a manageable number of channels We don t want the client application running on the trader s desktop to be listening to thousands or tens of thousands of Message Channel s Now the question becomes where to put the Content-Based Router We could simply have the C TIB Channel Adapter forward all of the messages to the Pricing Gateway on a single Message Channel This is bad for two reasons we would be splitting up the business logic between C and Java, and we would lose the benefit of the separate Message Channel s on the TIB side allowing us to avoid filtering later in the data flow Looking at our Java components, we could either place it in the Pricing Gateway or create an intermediary component between the Pricing Gateway and the client. In theory, if we persisted the bond - based separation of Message Channel s all the way to the client, the Pricing Gateway would rebroadcast pricing information with the same channel structure as the Pricing Gateway and Analytics Engine This means a duplication of all of the bond dedicated TIB channels in JMS Even if we create an intermediary component between the Pricing Gateway and the client, the Pricing Gateway will still have to duplicate all of the channels in JMS On the other hand, implementing logic directly in the Pricing Gateway allows us to avoid duplicating the large number of channels in JMS allowing us to create a much smaller number of channels in the order of one per trader The Pricing Gateway registers itself through the C TIB Channel Adapter as a consumer for each bond of every trader in the system Then the Pricing Gateway will forward each specific client only the messages related to that particular trader This way, we only use a small number of Message Channel s on the JMS end, while maximizing the ben efit of the separation on the TIB end. The complete Market Data Flow to the client. The Message Channel layout discussion is a good example of how integrating patterns is important The goal here was to figure out how to effectively use the Message Channel s Saying you use a pattern isn t enough You need to figure out how to best implement it and incorporate into your system to solve the problems at hand Additionally, this example shows business forces in action If we could implement business logic in any of our components, we could have gone with the per trader approach and implemented an overall more simple approach with many less channels. Selecting a Message Channel. Now that we know the mechanics of the communication between the Java JMS components and the C TIBCO components, and we have seen some Message Channel structuring, we need to decide which type of JMS Message Channel s the Java components should use to communicate Before we can choose between the different Message Channels av ailable in JMS, let s look at the high level message flow of the system We have two gateways Pricing and Contribution communicating with the client Market data flows to the client from the Pricing Gateway which sends it out to the Contribution Gateway The client application sends message to the Pricing Gateway to alter the analytics being applied to each bond The Contribution Gateway also sends messages to the Client application relaying the status of the price updates to the different trading venues. The system message flow. The JMS specification describes two Message Channel types, Point-to-Point Channel JMS Queue and Publish-Subscribe Channel JMS Topic Recall that the case for using publish-subscribe is to enable all interested consumers to receive a message while the case for using point-to-point is to ensure that only one eligible consumer receives a particular message. Many systems would simply broadcast messages to all client applications, leaving each individual client application to decide for itself whether or not to process a particular message This will not work for our application since there are a large number of market data messages being sent to each client application If we broadcast market data updates to uninterested trader, we will be unnecessarily wasting client processor cycles deciding whether or not to process a market data update. Point-to-Point Channel s initially sound like a good choice since the clients are sending messages to unique servers and visa versa But it was a business requirement that traders may be logged in to multiple machines at the same time If we have a trader logged in at two workstations simultaneously and a point-to-point price update is sent, only one of the two client applications will get the message This is because only one consumer on a Point-to-Point Channel can receive a particular message Notice that only the first of each group of a trader s client applications receives the message. Point-to-Point Messaging for Pri ce Updates. We could solve this using the Recipient List pattern, which publishes messages to a list of intended recipients, guaranteeing that only clients in the recipient list will receive messages Using this pattern, the system could create recipient lists with all client application instances related to each trader Sending a message related to a particular trader would in turn send the message to each application in the recipient list This guarantees all client application instances related to a particular trader would receive the message The downside of this approach is that it requires quite a bit of implementation logic to manage the recipients and dispatch messages. Recipient List for Price Updates. Even though point-to-point could be made to work, let s see if there is a better way Using Publish-Subscribe Channel s, the system could broadcast messages on trader specific channels rather than client application specific channels 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 ca che 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 milliseco nds 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 mil liseconds 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 t hat 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 continu ously 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 mo re 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 guarantee s 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 refac toring 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. Want to keep up-to-date Follow My Blog. Want to read more in depth Check out My Articles. Want to s ee 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. 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. 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 Integration Patterns in Practice Case Study Bond Trading System.

No comments:

Post a Comment