การออกแบบ รูปแบบ การค้า ระบบ


ฉันอยู่ระหว่างการออกแบบแอปพลิเคชันการซื้อขายซึ่งจะใช้ API ตลาดเพื่อวางคำสั่งซื้อในตลาด นี่ไม่ใช่โปรแกรมประมวลผลอัลกอริธึมที่มีประสิทธิภาพสูงที่ซับซ้อนซึ่งใช้ในธนาคารเพื่อการลงทุน นี่เป็นเพียงส่วนเล็ก ๆ ของแอพพลิเคชันส่วนตัวที่จะซื้อขายได้สองหรือสามครั้งต่อวันขึ้นอยู่กับสภาพตลาดที่มีอยู่จริงแอ็พพลิเคชันจะประกอบไปด้วย (modalespackages) ต่อไปนี้: กลยุทธ์ - อัลกอริธึมการค้าที่แท้จริง Analytics - ชั้นเรียนสำหรับวิเคราะห์ราคาแอ็กทีฟสด ในตลาดเพื่อผลิตสัญญาณ buysell บริการ - ชั้นเรียนที่ใช้ในการรักษาความสัมพันธ์กับตลาดเรียกข้อมูลตลาดและสั่งซื้อสินค้า buysell จนถึงตอนนี้ทุกสิ่งทุกอย่างที่จำเป็นสำหรับแอพพลิเคชันน่าจะมีอยู่บนอินเทอร์เน็ต: Apache CXF สำหรับการสร้างคลาส Java ที่ใช้สำหรับการเข้าถึงตลาดบริการเว็บ Apache Maths สำหรับการวิเคราะห์วิกิพีเดียเกี่ยวกับการกำหนดราคาสำหรับรูปแบบการออกแบบต่างๆนั่นคือ Factory, SubjectObserver, State ฯลฯ ซึ่ง Im ติดอยู่กับอัลกอริทึมเสมอ Ive ตัดสินใจที่จะใช้รูปแบบของรัฐเพื่อแบ่งพาร์ทิชันเป็นกลุ่มตรรกะตรรกะต่างๆของที่ควรจะทำเมื่อเงื่อนไขตลาดบางอย่างเป็นไปตาม ปัญหาคือ Im เริ่มเห็นว่ามีโอกาสมากที่แต่ละชั้นรัฐจะมีการระเบิดถ้างบอื่น: ฉันลาดเทช่วย แต่รู้สึก Im ขาดอะไรที่นี่และที่ต้องมีกรอบหรือรูปแบบการออกแบบบาง I dont ทราบเกี่ยวกับที่ ช่วยให้นักพัฒนาสามารถห่อหุ้มอินพุตและเอาต์พุตทั้งหมดของบริบททางธุรกิจที่กำหนดให้เป็นจำนวนการกระทำที่ จำกัด สำหรับการดำเนินการทางธุรกิจที่สามารถสร้างกฎเกณฑ์ทางธุรกิจได้ นั่นคือ แทนที่จะต้อง hardcode อัลกอริทึม Im หวังว่าควรจะเป็นไปได้ที่จะทำให้โปรแกรมประยุกต์ในโปรเซสเซอร์กฎบางประเภท แต่น่าเสียดายที่ฉันไม่ทราบว่าจะเริ่มต้นในเรื่องนี้ ฉันหวังว่า Ive ได้อธิบายสถานการณ์ที่คลาดเคลื่อนของฉันไว้อย่างชัดเจนแล้วถ้าคุณต้องการให้ฉันชี้แจงอะไรโปรดแจ้งให้เราทราบ ขอขอบคุณคุณถาม 08 ต. ค. 52 ที่ 22: 48 รูปแบบการใช้งาน 187 รูปแบบการบูรณาการในการปฏิบัติ 187 กรณีศึกษา: ระบบการซื้อขายตราสารหนี้ (Jonathan Simon) คุณสามารถแยกแยะตัวเองออกจากชุดรูปแบบหรือภาษาของรูปแบบต่างๆได้ง่าย รูปแบบคือสิ่งที่เป็นนามธรรมของแนวคิดในรูปแบบที่นำมาใช้ซ้ำได้ บ่อยครั้งที่ลักษณะโดยทั่วไปของรูปแบบที่ทำให้พวกเขามีประโยชน์เพื่อให้พวกเขายังยากที่จะเข้าใจ บางครั้งสิ่งที่ดีที่สุดในการช่วยให้เข้าใจรูปแบบเป็นตัวอย่างของโลกแห่งความเป็นจริง ไม่ใช่สถานการณ์ที่บังเอิญในสิ่งที่อาจเกิดขึ้น แต่สิ่งที่เกิดขึ้นจริงและสิ่งที่จะเกิดขึ้น บทนี้ใช้รูปแบบในการแก้ปัญหาโดยใช้กระบวนการค้นพบ ระบบที่เราจะกล่าวถึงคือระบบการซื้อขายพันธบัตรที่ฉันทำงานด้วยเป็นเวลาสองปีนับตั้งแต่การออกแบบเริ่มต้นจนถึงการผลิต เราจะสำรวจสถานการณ์และปัญหาที่พบและวิธีแก้ปัญหาด้วยรูปแบบ นี้เกี่ยวข้องกับกระบวนการตัดสินใจในการเลือกรูปแบบรวมทั้งวิธีการรวมและปรับรูปแบบเพื่อให้เหมาะกับความต้องการของระบบ และนี่คือทั้งหมดที่เกิดขึ้นโดยคำนึงถึงแรงที่พบในระบบจริงเช่นความต้องการทางธุรกิจการตัดสินใจของลูกค้าความต้องการทางสถาปัตยกรรมและทางเทคนิคตลอดจนการรวมระบบเดิม เจตนาของวิธีนี้คือการให้ความเข้าใจที่ชัดเจนของรูปแบบตัวเองผ่านการประยุกต์ใช้ในทางปฏิบัติ การสร้างระบบธนาคารเพื่อการลงทุนของวอลล์สตรีตรายใหญ่ตั้งเป้าหมายที่จะสร้างระบบการกำหนดราคาพันธบัตรด้วยความพยายามที่จะปรับปรุงกระบวนการทำงานของโต๊ะซื้อขายตราสารหนี้ ขณะนี้ผู้ค้าตราสารหนี้ต้องส่งราคาสำหรับพันธบัตรจำนวนมากไปยังสถานที่ซื้อขายหลายแห่งโดยแต่ละแห่งมีส่วนติดต่อผู้ใช้ของตนเอง เป้าหมายของระบบคือการลดรายละเอียดของการกำหนดราคาพันธบัตรทั้งหมดของพวกเขารวมกับฟังก์ชันการวิเคราะห์ขั้นสูงเฉพาะสำหรับตลาดตราสารหนี้ในอินเทอร์เฟซผู้ใช้แบบห่อหุ้ม ซึ่งหมายถึงการรวมและการสื่อสารกับส่วนประกอบต่างๆผ่านโปรโตคอลการสื่อสารต่างๆ การไหลระดับสูงของระบบมีลักษณะดังนี้: ขั้นแรกข้อมูลตลาดจะเข้าสู่ระบบ ข้อมูลการตลาดเป็นข้อมูลเกี่ยวกับราคาและคุณสมบัติอื่น ๆ ของพันธบัตรที่แสดงถึงสิ่งที่ผู้คนเต็มใจที่จะซื้อและขายพันธบัตรในตลาดเสรี ข้อมูลตลาดจะถูกส่งไปยังเครื่องมือวิเคราะห์ข้อมูลที่เปลี่ยนแปลงข้อมูลทันที Analytics หมายถึงฟังก์ชันทางคณิตศาสตร์สำหรับแอ็พพลิเคชันทางการเงินที่เปลี่ยนแปลงราคาและคุณลักษณะอื่น ๆ ของพันธบัตร เหล่านี้เป็นฟังก์ชันทั่วไปที่ใช้ตัวแปรอินพุตเพื่อปรับแต่งผลลัพธ์ของฟังก์ชันให้เป็นพันธะเฉพาะ แอ็พพลิเคชันไคลเอ็นต์ที่จะทำงานบนเดสก์ท็อปของผู้ค้าแต่ละรายจะกำหนดค่าเครื่องมือวิเคราะห์บนพื้นฐานของผู้ค้าต่อแต่ละรายเพื่อควบคุมเฉพาะการวิเคราะห์สำหรับแต่ละพันธบัตรที่พ่อค้ากำหนดราคาไว้ เมื่อการวิเคราะห์ถูกนำไปใช้กับข้อมูลการตลาดแล้วข้อมูลที่แก้ไขจะถูกส่งไปยังสถานการค้าต่างๆที่ผู้ค้าจาก บริษัท อื่นสามารถซื้อหรือขายพันธบัตรได้ สถาปัตยกรรมกับรูปแบบด้วยภาพรวมของกระบวนการทำงานของระบบนี้เราสามารถหาแนวทางทางสถาปัตยกรรมที่เราพบในระหว่างขั้นตอนการออกแบบ ลองดูสิ่งที่เรารู้จนถึงปัจจุบัน ผู้ค้าต้องใช้แอพพลิเคชั่นที่ตอบสนองได้ดีทั้งบนเวิร์คสเตชั่นของ Windows NT และ Solaris ดังนั้นเราจึงตัดสินใจที่จะใช้แอ็พพลิเคชันไคลเอ็นต์เป็นไคลเอนต์หนาของ Java เนื่องจากความเป็นอิสระของแพลตฟอร์มและความสามารถในการตอบสนองต่อข้อมูลผู้ใช้และข้อมูลตลาดได้อย่างรวดเร็ว ด้านเซิร์ฟเวอร์เราสืบทอดองค์ประกอบ C แบบเดิมที่ระบบของเราจะใช้ คอมโพเนนต์ข้อมูลการตลาดสื่อสารกับโครงสร้างการรับส่งข้อความ TIBCO Information Bus (TIB) เรารับช่วงต่อไปนี้: Market Data Feed Server เผยแพร่ข้อมูลตลาดขาเข้าให้กับ TIB เครื่องมือ Analytics ดำเนินการวิเคราะห์ข้อมูลตลาดที่เข้ามาและออกอากาศข้อมูลตลาดที่แก้ไขไปยัง TIB Contribution Server ดำเนินการสื่อสารกับสถานที่ซื้อขายทั้งหมด สถานที่จัดจำหน่ายเป็นส่วนประกอบของบุคคลที่สามที่ไม่ได้รับการควบคุมโดยธนาคาร Legacy Market Data Subsystem Subsystem ระบบย่อยระบบเดิมเราต้องตัดสินใจว่าระบบย่อยที่แยกจากกัน (ไคลเอ็นต์หนาข้อมูลตลาด Java และข้อมูลสนับสนุน) จะสื่อสารกันอย่างไร เราอาจมีลูกค้าหนาสื่อสารโดยตรงกับเซิร์ฟเวอร์เดิม แต่ที่จะต้องตรรกะทางธุรกิจมากเกินไปในลูกค้า แทนที่จะสร้างคู่ของเกตเวย์ Java เพื่อสื่อสารกับเซิร์ฟเวอร์รุ่นเก่าเกตเวย์กำหนดราคาสำหรับข้อมูลตลาดเกตเวย์การมีส่วนร่วมสำหรับการส่งราคาไปยังสถานที่จัดจำหน่าย นี้จะบรรลุ encapsulation ดีของตรรกะทางธุรกิจที่เกี่ยวข้องกับพื้นที่เหล่านี้ คอมโพเนนต์ปัจจุบันในระบบแสดงด้านล่าง การเชื่อมต่อถูกทำเครื่องหมายว่า บ่งชี้ว่าเรายังไม่แน่ใจว่าคอมโพเนนต์บางส่วนจะสื่อสารกันอย่างไร ระบบและส่วนประกอบการสื่อสารคำถามแรกคือการผสานรวมไคลเอ็นต์ Java หนาและคอมโพเนนต์เซิร์ฟเวอร์ Java สองรายการเพื่อแลกเปลี่ยนข้อมูล ให้ดูที่สี่รูปแบบการรวมที่แนะนำในหนังสือเล่มนี้: File Transfer ฐานข้อมูลที่ใช้ร่วมกัน การเชิญชวนกระบวนการระยะไกล และการรับส่งข้อความ เราสามารถออกกฎ Shared Database ได้ทันทีเพราะเราต้องการสร้าง layer abstraction ระหว่าง client กับฐานข้อมูลและ dont ต้องการมีรหัสการเข้าถึงฐานข้อมูลใน client การถ่ายโอนไฟล์สามารถถูกตัดออกได้ในทำนองเดียวกันเนื่องจากต้องมีเวลาแฝงเล็กน้อยเพื่อให้แน่ใจว่าราคาปัจจุบันจะถูกส่งออกไปยังสถานที่ซื้อขาย ซึ่งทำให้เราสามารถเลือกระหว่างการเรียกกระบวนการทางไกลหรือการรับส่งข้อความ แพลตฟอร์ม Java มีการสนับสนุนทั้ง Remote Procedure Invocation และ Messaging การรวมแบบ RPC ทำได้โดยใช้ Remote Method Invocation (RMI), CORBA หรือ Enterprise Java Beans (EJB) Java Messaging Service (JMS) เป็น API ทั่วไปสำหรับการรวมระบบข้อความ ดังนั้นรูปแบบการรวมระบบทั้งสองจึงใช้งานง่ายใน Java ดังนั้นซึ่งจะทำงานได้ดีขึ้นสำหรับโครงการนี้การเรียกกระบวนการทางไกลหรือการรับส่งข้อความ มีเพียงหนึ่งอินสแตนซ์ของเกตเวย์กำหนดราคาและอินสแตนซ์หนึ่งของเกตเวย์การสมทบในระบบ แต่โดยปกติลูกค้าหนามากจะเชื่อมต่อกับบริการเหล่านี้ (หนึ่งสำหรับผู้ค้าตราสารหนี้แต่ละรายที่เข้าสู่ระบบในเวลาใดเวลาหนึ่ง) นอกจากนี้ธนาคารต้องการให้เป็นระบบการกำหนดราคาโดยทั่วไปซึ่งสามารถนำมาใช้ประโยชน์ในการใช้งานอื่น ๆ ได้ ดังนั้นนอกเหนือจาก Think Clients ที่ไม่รู้จักอาจมีแอปพลิเคชันอื่น ๆ ที่ไม่รู้จักจำนวนมากโดยใช้ข้อมูลราคาที่ออกมาจากเกตเวย์ ไคลเอ็นต์แบบหนา (หรือแอ็พพลิเคชันอื่นที่ใช้ข้อมูลราคา) สามารถใช้ RPC ได้อย่างง่ายดายพอสมควรเพื่อโทรไปที่เกตเวย์เพื่อรับข้อมูลราคาและเรียกใช้การประมวลผล อย่างไรก็ตามข้อมูลราคาจะถูกเผยแพร่ตลอดเวลาและลูกค้าบางรายสนใจเฉพาะข้อมูลบางอย่างเท่านั้นดังนั้นการรับข้อมูลที่เกี่ยวข้องกับลูกค้าที่เหมาะสมในเวลาที่เหมาะสมอาจเป็นเรื่องยาก ลูกค้าสามารถสำรวจเกตเวย์ แต่จะสร้างค่าใช้จ่ายจำนวนมาก มันจะดีกว่าสำหรับเกตเวย์ที่จะทำให้ข้อมูลที่มีให้กับลูกค้าโดยเร็วที่สุดเท่าที่จะสามารถใช้ได้ (ซึ่งจะเกิดขึ้นหลายครั้งต่อวินาที), เกตเวย์จะต้องทำให้ RPC ให้กับลูกค้าที่สนใจแต่ละรายเพื่อส่งข้อมูลไปยังลูกค้า ลูกค้าทุกคนควรได้รับการแจ้งเตือนพร้อม ๆ กันดังนั้นแต่ละ RPC จะต้องทำในหัวข้อพร้อม ๆ กัน นี้สามารถทำงานได้ แต่มีความซับซ้อนมากอย่างรวดเร็ว ข้อความช่วยลดปัญหานี้ได้ง่ายขึ้น ด้วยการรับส่งข้อความ เราสามารถกำหนดช่องทางแยกสำหรับข้อมูลการกำหนดราคาประเภทต่างๆได้ จากนั้นเมื่อเกตเวย์ได้รับข้อมูลใหม่ข้อมูลจะเพิ่มข้อความที่มีข้อมูลดังกล่าวลงในช่องเผยแพร่ - สมัครสมาชิกสำหรับประเภทข้อมูลนั้น ในขณะเดียวกันลูกค้าทั้งหมดที่สนใจในข้อมูลบางประเภทจะรับฟังช่องทางสำหรับประเภทนั้น ด้วยวิธีนี้เกตเวย์สามารถส่งข้อมูลใหม่ ๆ ไปให้คนที่สนใจได้โดยไม่จำเป็นต้องทราบว่ามีแอพพลิเคชันฟังมากหรือไม่ ลูกค้ายังคงต้องสามารถเรียกใช้พฤติกรรมในเกตเวย์ได้เช่นกัน เนื่องจากมีเพียงสองเกตเวย์เท่านั้นและไคลเอ็นต์อาจจะปิดกั้นในขณะที่เมธอดนี้ถูกเรียกใช้พร้อม ๆ กันเกร็ดเหล่านี้จะสามารถใช้งานได้โดยง่ายโดยใช้ RPC อย่างไรก็ตามเนื่องจากเราใช้การรับส่งข้อความสำหรับการสื่อสารระหว่างเกตเวย์กับไคลเอ็นต์แล้วข้อความน่าจะเป็นวิธีที่ดีในการใช้การสื่อสารแบบไคลเอ็นต์กับเกตเวย์ด้วยเช่นกัน ดังนั้นการติดต่อสื่อสารระหว่างเกตเวย์กับลูกค้าจะทำได้โดยการส่งข้อความ เนื่องจากคอมโพเนนต์ทั้งหมดถูกเขียนขึ้นใน Java JMS จึงเป็นทางเลือกที่ง่ายสำหรับการใช้เป็นระบบส่งข้อความ นี่เป็นการสร้าง Message Bus หรือสถาปัตยกรรมที่จะช่วยให้ระบบในอนาคตสามารถทำงานร่วมกับระบบในปัจจุบันได้โดยไม่ต้องมีการเปลี่ยนแปลงโครงสร้างการรับส่งข้อความเพียงเล็กน้อยหรือไม่มีเลย ด้วยวิธีนี้ฟังก์ชันทางธุรกิจของแอปพลิเคชันสามารถใช้งานได้ง่ายโดยโปรแกรมอื่น ๆ ที่ธนาคารพัฒนา คอมโพเนนต์ Java การสื่อสารกับ JMS JMS เป็นเพียงข้อกำหนดและเราจำเป็นต้องตัดสินใจเกี่ยวกับระบบการรับส่งข้อความที่สอดคล้องกับ JMS เราตัดสินใจที่จะใช้ IBM MQSeries JMS เนื่องจากธนาคารเป็นร้านค้าของ IBM โดยใช้เซิร์ฟเวอร์แอ็พพลิเคชัน WebSphere และผลิตภัณฑ์อื่น ๆ ของ IBM ด้วยเหตุนี้เราจึงจะใช้ MQSeries เนื่องจากเรามีโครงสร้างพื้นฐานการสนับสนุนอยู่ในสถานที่และได้รับใบอนุญาตของไซต์แล้ว คำถามต่อไปคือวิธีเชื่อมต่อระบบการรับส่งข้อความ MQSeries กับเซิร์ฟเวอร์ C Contribution แบบสแตนด์อโลนและข้อมูลตลาดของ TIBCO และเซิร์ฟเวอร์ Analytics Engine เราต้องการทางให้ผู้บริโภค MQSeries สามารถเข้าถึงข้อความ TIB ได้ แต่บางทีเราอาจใช้รูปแบบข้อความนักแปลเพื่อแปลข้อความ TIB เป็นข้อความ MQSeries แม้ว่าไคลเอนต์ C สำหรับ MQSeries ทำหน้าที่เป็นตัวแปลข้อความ ใช้มันจะเสียสละความเป็นอิสระเซิร์ฟเวอร์ JMS และแม้ว่า TIBCO จะมี Java API แต่สถาปนิกลูกค้าและผู้จัดการได้ปฏิเสธมัน ด้วยเหตุนี้ระบบ Message Translator จึงต้องถูกยกเลิก สะพานจากเซิร์ฟเวอร์ TIB ไปยังเซิร์ฟเวอร์ MQSeries ต้องมีการสื่อสารระหว่าง C และ Java เราสามารถใช้ CORBA แต่แล้วสิ่งที่เกี่ยวกับการรับส่งข้อความรูปลักษณ์ของนักแปลข้อความจะดูว่าเกี่ยวข้องกับ Channel Adaptor ในการใช้โปรโตคอลการสื่อสาร หัวใจของอะแดปเตอร์ช่องคือการเชื่อมต่อระบบที่ไม่ใช่ข้อความเข้ากับระบบการรับส่งข้อความ คู่ของอะแดปเตอร์ช่องที่เชื่อมต่อระบบข้อความสองตัวคือ Messaging Bridge วัตถุประสงค์ของสะพาน Messaging คือการถ่ายโอนข้อความจากระบบข้อความหนึ่งไปยังอีกระบบหนึ่ง นี่คือสิ่งที่เรากำลังทำอยู่กับความซับซ้อนที่เพิ่มขึ้นของการสื่อสารภายในภาษา Java เพื่อ C เราสามารถใช้สะพานข้อความข้ามภาษาโดยใช้ชุดตัวแปลงช่องสัญญาณและ CORBA เราจะสร้างสองเซิร์ฟเวอร์อะแดปเตอร์ช่องสัญญาณที่มีน้ำหนักเบาหนึ่งใน C จัดการการสื่อสารกับ TIB และหนึ่งใน Java การสื่อสารการจัดการกับ JMS อะแดปเตอร์ช่องสัญญาณสองช่องทางนี้ ซึ่งเป็นปลายทางของ Message End จะสื่อสารกันผ่านทาง CORBA เช่นเดียวกับทางเลือกของ MQSeries เราจะใช้ CORBA แทน JNI เนื่องจากเป็นมาตรฐานของ บริษัท สะพานการรับส่งข้อความใช้การแปลข้อความจำลองระหว่างระบบส่งข้อความที่ไม่สามารถเข้ากันได้และภาษาอื่นได้อย่างมีประสิทธิภาพ นักแปลข้อความใช้ Channel Adapters แผนภาพต่อไปจะแสดงการออกแบบระบบในปัจจุบันรวมถึงเกตเวย์และส่วนประกอบอื่น ๆ นี่คือตัวอย่างที่ดีของการประยุกต์ใช้รูปแบบ เราได้รวมช่องสองช่องเข้ากับโปรโตคอลที่ไม่ใช่ข้อความเพื่อใช้รูปแบบข้อความนักแปลซึ่งมีประสิทธิภาพในการใช้รูปแบบอื่นเพื่อใช้รูปแบบอื่น นอกจากนี้เราเปลี่ยนบริบทของช่อง Adaptor เพื่อเชื่อมโยงระบบข้อความสองระบบเข้ากับโปรโตคอลการแปลข้ามภาษาที่ไม่ใช่ข้อความแทนที่จะเชื่อมต่อระบบการรับส่งข้อความไปยังระบบที่ไม่ใช่ข้อความ ระบบปัจจุบันที่มี Channel Adapters Adapters Channels กุญแจสำคัญในการทำงานร่วมกับรูปแบบคือไม่เพียง แต่รู้ว่าควรใช้รูปแบบใด แต่ควรใช้อย่างไร การใช้รูปแบบแต่ละรูปแบบจะต้องคำนึงถึงลักษณะเฉพาะของแพลตฟอร์มเทคโนโลยีตลอดจนเกณฑ์การออกแบบอื่น ๆ ส่วนนี้ใช้กระบวนการค้นพบเดียวกันเพื่อหาช่องทางเผยแพร่ - สมัครสมาชิกที่มีประสิทธิภาพมากที่สุดในบริบทของเซิร์ฟเวอร์ข้อมูลตลาดที่สื่อสารกับเครื่องมือการวิเคราะห์ ข้อมูลตลาดเรียลไทม์มาจากฟีดข้อมูลตลาดซึ่งเป็นเซิร์ฟเวอร์ C ที่เผยแพร่ข้อมูลตลาดใน TIB ฟีดข้อมูลตลาดใช้ช่องทางเผยแพร่ - สมัครสมาชิกแยกต่างหากสำหรับแต่ละพันธบัตรเป็นราคาเผยแพร่สำหรับ ซึ่งอาจดูเหมือนเล็กน้อยเนื่องจากพันธบัตรใหม่แต่ละแห่งต้องการช่องทางใหม่ของตัวเอง แต่นี่ไม่ใช่เรื่องรุนแรงมากนักเนื่องจากคุณไม่จำเป็นต้องสร้างช่องใน TIBCO แต่มีการอ้างอิงถึงช่องโดยชุดชื่อลำดับชั้นที่เรียกว่าอาสาสมัคร เซิร์ฟเวอร์ TIBCO จะกรองการรับส่งข้อความแบบเดี่ยวตามหัวข้อส่งแต่ละหัวข้อที่ไม่ซ้ำกันไปยังช่องทางเสมือนเดียว ผลที่ได้คือช่องข้อความที่มีน้ำหนักเบามาก เราสามารถสร้างระบบที่เผยแพร่ในสองสามช่องทางและสมาชิกสามารถฟังเฉพาะราคาที่พวกเขาสนใจเท่านั้นซึ่งจะทำให้สมาชิกต้องใช้ตัวกรองข้อความหรือผู้บริโภคที่เลือกเพื่อกรองการไหลของข้อมูลทั้งหมดเพื่อหาราคาพันธบัตรที่น่าสนใจ ควรได้รับการประมวลผลตามที่ได้รับ เนื่องจากข้อมูลตลาดมีการเผยแพร่บนช่องทางที่ผูกมัดเฉพาะผู้ลงทะเบียนสามารถลงทะเบียนเพื่ออัปเดตชุดพันธบัตรได้ การดำเนินการนี้ช่วยให้สมาชิกสามารถกรองข้อมูลโดยเลือกรับช่องและรับเฉพาะการอัปเดตที่น่าสนใจแทนที่จะตัดสินใจหลังจากที่ได้รับข้อความแล้ว โปรดทราบว่าการใช้แชเนลหลายช่องเพื่อหลีกเลี่ยงการกรองคือการใช้ช่องทางการรับส่งข้อความที่ไม่เป็นไปตามมาตรฐาน อย่างไรก็ตามในบริบทของเทคโนโลยี TIBCO เรากำลังตัดสินใจอย่างแท้จริงว่าจะใช้หรือเป็นเจ้าของตัวกรองหรือใช้ช่องกรองที่มีอยู่ภายใน TIBCO แทนการใช้ช่องจำนวนมากหรือไม่ องค์ประกอบถัดไปที่เราต้องออกแบบคือเครื่องมือการวิเคราะห์เซิร์ฟเวอร์ CTIB เครื่องอื่นที่จะแก้ไขข้อมูลการตลาดและเผยแพร่ใหม่ให้กับ TIB แม้ว่าจะอยู่นอกขอบเขตของการพัฒนา JavaJMS ของเรา แต่เรากำลังทำงานอย่างใกล้ชิดกับทีม C ในการออกแบบเนื่องจากเราเป็นลูกค้าหลักของ Analytics Engine ปัญหาที่เกิดขึ้นคือการหาโครงสร้างช่องที่มีประสิทธิภาพมากที่สุดในการเผยแพร่ข้อมูลตลาดใหม่ที่มีการปรับปรุงใหม่ เนื่องจากเรามีช่องข้อความเฉพาะสำหรับแต่ละพันธบัตรที่สืบทอดมาจากฟีดข้อมูลราคาตลาดจึงเป็นเรื่องที่เป็นไปได้ที่จะแก้ไขข้อมูลตลาดและเผยแพร่ข้อมูลตลาดที่มีการแก้ไขเกี่ยวกับพันธบัตรช่องทางการสื่อสารใหม่ แต่การดำเนินการนี้จะไม่สามารถใช้งานได้เนื่องจากการวิเคราะห์ราคาเปลี่ยนแปลงเป็นราคาที่ผู้ค้าเฉพาะเจาะจง ถ้าเราเผยแพร่ข้อมูลใหม่ที่แก้ไขบนช่องข้อความพันธบัตร เราจะทำลายความสมบูรณ์ของข้อมูลโดยการแทนที่ข้อมูลตลาดทั่วไปด้วยข้อมูลเฉพาะของพ่อค้า ในทางกลับกันเราอาจมีประเภทข้อความที่แตกต่างกันสำหรับข้อมูลตลาดเฉพาะเจาะจงของผู้ค้าที่เราเผยแพร่ในช่องทางเดียวกันเพื่อให้สมาชิกสามารถเลือกได้ว่าข้อความใดที่พวกเขาสนใจเพื่อหลีกเลี่ยงการทำลายข้อมูล แต่แล้วลูกค้าจะต้องใช้ตัวกรองของตนเองเพื่อแยกข้อความสำหรับผู้ค้ารายอื่นออก นอกจากนี้จะมีการเพิ่มขึ้นอย่างมากในข้อความที่ได้รับจากสมาชิกโดยวางภาระที่ไม่จำเป็นให้กับพวกเขา มีสองตัวเลือก: One Channel per Trader: ผู้ค้าแต่ละรายมีช่องทางที่กำหนดสำหรับข้อมูลตลาดที่ปรับเปลี่ยน ด้วยวิธีนี้ข้อมูลตลาดเดิมยังคงเหมือนเดิมและผู้ค้าแต่ละรายสามารถรับฟังข้อความจากผู้ค้ารายนั้นได้ช่องข้อความสำหรับการปรับปรุงราคาที่ปรับเปลี่ยน หนึ่งแชแนลต่อผู้ค้าต่อหนึ่งพันธบัตร: สร้างช่องข้อความหนึ่งข้อความต่อผู้ค้าต่อพันธบัตรเพียงอย่างเดียวสำหรับข้อมูลตลาดที่มีการแก้ไขของพันธบัตรดังกล่าว ตัวอย่างเช่นข้อมูลตลาดสำหรับตราสารหนี้ ABC จะเผยแพร่บนช่อง Bond ABC ในขณะที่ข้อมูลตลาดที่ปรับเปลี่ยนสำหรับผู้ค้า A จะได้รับการเผยแพร่ใน Trader A ของผู้ให้บริการช่องข้อความ ABC Bond แก้ไขข้อมูลตลาดสำหรับผู้ประกอบการรายย่อย B ใน Trader B พันธบัตร ABC และ อื่น ๆ หนึ่งแชแนลต่อผู้ขายหนึ่งแชแนลต่อพันธบัตรแต่ละรายมีข้อดีและข้อเสียของแต่ละวิธี วิธีการต่อพันธบัตรตัวอย่างเช่นใช้ช่องข้อความมากขึ้น ในกรณีที่เลวร้ายที่สุดจำนวนช่องข้อความจะเป็นจำนวนของพันธบัตรทั้งหมดคูณด้วยจำนวนผู้ค้า เราสามารถวางขอบเขตบนจำนวนช่องที่จะสร้างขึ้นเนื่องจากเรารู้ว่ามีเพียงประมาณ 20 ผู้ค้าและพวกเขาไม่เคยราคาสูงกว่าสองร้อยพันธบัตร ซึ่งจะทำให้วงเงินด้านบนต่ำกว่าช่วง 10,000 ซึ่งไม่เป็นที่ต่างชาติเมื่อเทียบกับช่องข้อความเกือบ 100,000 ช่องที่ใช้ฟีดข้อมูลราคาในตลาด นอกจากนี้เนื่องจากเราใช้ TIB และ Message Channel ค่อนข้างมีราคาไม่แพงจำนวนช่องข้อความไม่ใช่เป็นปัญหาที่รุนแรง ในทางกลับกันจำนวนแชแนลข้อความที่แท้จริงอาจเป็นปัญหาจากมุมมองด้านการจัดการ ทุกครั้งที่มีการเพิ่มพันธบัตรช่องของผู้ค้าแต่ละรายต้องได้รับการปรับปรุง นี้อาจจะรุนแรงในระบบแบบไดนามิกมาก ระบบของเรามีความเป็นไปได้อย่างมาก นอกจากนี้ยังมีโครงสร้างพื้นฐานสำหรับจัดการช่องข้อความโดยอัตโนมัติ นี้รวมกับสถาปัตยกรรมสืบทอดขององค์ประกอบเดิมโดยใช้วิธีการเดียวกันลดข้อเสีย นี่ไม่ได้หมายความว่าเราควรสร้างช่องข้อความ s ที่ไม่จำเป็นจำนวนมาก แต่เราสามารถใช้แนวทางสถาปัตยกรรมที่ใช้ช่องข้อความจำนวนมากเมื่อมีเหตุผล และมีเหตุผลในกรณีนี้ที่ลงมายังที่ตั้งของตรรกะ หากเราใช้วิธีการต่อผู้ค้าแต่ละราย Analytics Engine ต้องการตรรกะเพื่อจัดกลุ่มช่องสัญญาณเข้าและออก ทั้งนี้เนื่องจากช่องทางอินพุตจากเครื่อง Analytics เป็นต่อหนึ่งพันธบัตรและช่องข้อความขาออกจะเป็นต่อผู้ขายโดยกำหนดให้ Analytics Engine กำหนดเส้นทางการป้อนข้อมูลการวิเคราะห์ทั้งหมดจากหลายสตอเรจสำหรับผู้ค้ารายย่อยไปยังช่องข้อความเฉพาะของ Trader Out เครื่องมือนี้จะเปลี่ยนเครื่องมือการวิเคราะห์ให้กลายเป็น Content-Based Router เพื่อใช้ตรรกะการกำหนดเส้นทางที่กำหนดเองสำหรับแอ็พพลิเคชันของเรา ตามโครงสร้างข้อความบัสเครื่องมือ Analytics เป็นเซิร์ฟเวอร์ทั่วไปที่สามารถใช้โดยระบบอื่น ๆ ในระบบได้ ดังนั้นเราจึงไม่ต้องการทำคลาวด์ด้วยฟังก์ชันการทำงานเฉพาะระบบ ในขณะที่วิธีการต่อพันธบัตรทำงานได้เนื่องจากแนวคิดของผู้ค้าที่เป็นเจ้าของผลการวิเคราะห์ราคาตราสารหนี้เป็นแนวทางที่ บริษัท ยอมรับ วิธีการต่อสตาร์ทจะช่วยให้การแยกช่องทางข้อความของฟีดข้อมูลตลาดเหมือนเดิมในขณะที่เพิ่มช่องข้อความอีกหลายช่อง ก่อนที่เราจะเข้าถึงลูกค้าเราต้องการให้ Content-Based Router รวมช่องหลายช่องเหล่านี้เข้ากับช่องที่สามารถจัดการได้ เราไม่ต้องการให้แอปพลิเคชันไคลเอ็นต์ทำงานบนเดสก์ท็อปสำหรับผู้ค้าปลีกเพื่อรับฟังข้อความนับพันหรือหลายหมื่นข้อความจากช่องข้อความ ตอนนี้คำถามคือจะต้องวาง Content-Based Router ไว้ที่ไหน เราเพียงแค่มีช่องเสียบการ์ด CTIB ส่งต่อข้อความทั้งหมดไปยังเกตเวย์ราคาในช่องข้อความเดียว นี่เป็นเหตุผลที่สองเหตุผลที่เราจะแยกเหตุผลทางธุรกิจระหว่าง C และ Java และเราจะสูญเสียประโยชน์จากช่องข้อความที่แยกจากกันในฝั่ง TIB ซึ่งทำให้เราสามารถหลีกเลี่ยงการกรองข้อมูลในภายหลังได้ มองไปที่ส่วนประกอบ Java ของเราเราสามารถวางไว้ในเกตเวย์ราคาหรือสร้างองค์ประกอบที่เป็นตัวกลางระหว่างเกตเวย์ราคากับลูกค้า ในทางทฤษฎีถ้าเรายังคงมีการแยกช่องทาง Message Channel ไปยังไคลเอ็นต์เกตเวย์ราคาจะเผยแพร่ข้อมูลการกำหนดราคาอีกครั้งด้วยโครงสร้างช่องเดียวกับ Gateway ราคาและ Analytics Engine ซึ่งหมายความว่าการทำสำเนาของพันธบัตร TIB ทั้งหมดใน JMS แม้ว่าเราจะสร้างองค์ประกอบตัวกลางระหว่าง Gateway ราคากับลูกค้าเกตเวย์ราคาจะยังคงต้องทำซ้ำช่องทั้งหมดใน JMS ในทางกลับกันการใช้ตรรกะโดยตรงในเกตเวย์ราคาจะช่วยให้เราสามารถหลีกเลี่ยงการทำซ้ำช่องจำนวนมากใน JMS เพื่อให้เราสามารถสร้างช่องทางที่มีขนาดเล็กลงได้ตามลำดับหนึ่งรายต่อผู้ขาย เกตเวย์ราคาลงทะเบียนผ่านตัวเชื่อมต่อช่องสัญญาณ CTIB เป็นผู้บริโภคสำหรับพันธบัตรแต่ละตัวของผู้ค้าทุกรายในระบบ จากนั้นเกตเวย์กำหนดราคาจะส่งต่อเฉพาะลูกค้าแต่ละรายเฉพาะข้อความที่เกี่ยวข้องกับผู้ค้ารายนั้นเท่านั้น ด้วยวิธีนี้เราจะใช้เพียงช่องข้อความขนาดเล็กจำนวนเล็กน้อยในส่วนท้ายของ JMS และเพิ่มผลประโยชน์สูงสุดจากการแยกออกจากปลาย TIB การไหลข้อมูลตลาดแบบสมบูรณ์ให้กับลูกค้าการอภิปรายโครงร่างของช่องข้อความเป็นตัวอย่างที่ดีว่ารูปแบบการรวมเป็นส่วนสำคัญอย่างไร เป้าหมายคือการหาวิธีใช้ช่องข้อความของ s ได้อย่างมีประสิทธิภาพ บอกว่าคุณใช้ลวดลายไม่เพียงพอ คุณจำเป็นต้องคิดวิธีการที่ดีที่สุดที่จะใช้มันและรวมไว้ในระบบของคุณเพื่อแก้ปัญหาในมือ นอกจากนี้ตัวอย่างนี้แสดงให้เห็นถึงแรงธุรกิจที่กำลังดำเนินการ ถ้าเราสามารถใช้ตรรกะทางธุรกิจในส่วนใดส่วนหนึ่งของเราได้เราอาจใช้วิธีการต่อเทรดเดอร์ต่อไปและใช้แนวทางที่เรียบง่ายโดยรวมกับช่องทางที่น้อยลง การเลือกช่องข้อความขณะนี้เรารู้กลศาสตร์ของการสื่อสารระหว่างส่วนประกอบ JavaJMS กับคอมโพเนนต์ C TIBCO และเราได้เห็นการจัดโครงสร้างช่องข้อความบางอย่างเราจำเป็นต้องตัดสินใจว่า JMS Message Channel ประเภทใดของ Java Component ควรใช้เพื่อสื่อสาร . ก่อนที่เราจะสามารถเลือกระหว่างช่องข้อความต่าง ๆ ที่มีอยู่ใน JMS ให้ดูที่การไหลของข้อความในระดับสูงของระบบ เรามีเกตเวย์สอง (การกำหนดราคาและเงินสมทบ) ติดต่อกับลูกค้า ข้อมูลการตลาดไหลไปยังลูกค้าจากเกตเวย์ราคาซึ่งจะส่งข้อมูลไปยัง Contribution Gateway แอ็พพลิเคชันไคลเอ็นต์จะส่งข้อความไปยังเกตเวย์กำหนดราคาเพื่อแก้ไขการวิเคราะห์ที่ใช้กับแต่ละพันธบัตร เกตเวย์การมีส่วนร่วมจะส่งข้อความไปยังแอปพลิเคชันไคลเอ็นต์เพื่อถ่ายทอดสถานะการอัปเดตราคาไปยังสถานที่ซื้อขายที่แตกต่างกัน การไหลของข้อความระบบข้อกำหนด JMS ระบุประเภทช่องข้อความสองช่อง Point-to-Point (JMS Queue) และช่องเผยแพร่ - สมัครสมาชิก (หัวข้อ JMS) จำได้ว่ากรณีการใช้ publish-subscribe คือการทำให้ผู้บริโภคที่สนใจทุกคนได้รับข้อความในขณะที่กรณีการใช้จุดต่อจุดคือเพื่อให้แน่ใจว่าผู้บริโภคที่มีสิทธิ์ได้รับข้อความใดข้อความหนึ่งเท่านั้น ระบบจำนวนมากจะออกอากาศข้อความไปยังแอ็พพลิเคชันไคลเอ็นต์ทั้งหมดโดยให้แอพพลิเคชันไคลเอ็นต์แต่ละตัวตัดสินใจเองว่าจะประมวลผลข้อความใดข้อความหนึ่งหรือไม่ การดำเนินการนี้จะไม่สามารถใช้ได้กับแอปพลิเคชันของเราเนื่องจากมีข้อมูลตลาดจำนวนมากถูกส่งไปยังแอปพลิเคชันไคลเอ็นต์แต่ละเครื่อง หากเราเผยแพร่ข้อมูลตลาดไปยังผู้ค้าที่ไม่สนใจเราจะเสียรอบหน่วยประมวลผลของไคลเอ็นต์อย่างไม่จำเป็นโดยจะตัดสินใจว่าจะประมวลผลการอัปเดตข้อมูลตลาดหรือไม่ Point-to-Point Channel เริ่มเป็นเหมือนทางเลือกที่ดีเนื่องจากลูกค้าส่งข้อความไปยังเซิร์ฟเวอร์ที่ไม่ซ้ำกันและในทางกลับกัน แต่เป็นความต้องการทางธุรกิจที่ผู้ค้าอาจเข้าสู่เครื่องหลาย ๆ เครื่องในเวลาเดียวกัน ถ้าเรามีผู้ซื้อขายเข้าสู่ระบบที่เวิร์คสเตชั่นสองเครื่องพร้อมกันและมีการส่งการอัพเดทราคาแบบจุดต่อจุดจะมีเพียงหนึ่งแอพพลิเคชันไคลเอ็นต์สองเครื่องเท่านั้นที่จะได้รับข้อความ เนื่องจากผู้บริโภคเพียงรายเดียวในช่อง Point-to-Point สามารถรับข้อความเฉพาะได้ ขอให้สังเกตว่าเฉพาะลูกค้ากลุ่มแรกที่ได้รับข้อความเท่านั้น Point-to-Point Messaging สำหรับการอัพเดทราคาเราสามารถแก้ปัญหานี้ได้โดยใช้รูปแบบรายชื่อผู้รับซึ่งเผยแพร่ข้อความไปยังรายชื่อผู้รับที่ตั้งใจไว้ซึ่งจะรับประกันว่าเฉพาะลูกค้าในรายชื่อผู้รับเท่านั้นที่จะได้รับข้อความ การใช้รูปแบบนี้ระบบสามารถสร้างรายชื่อผู้รับกับอินสแตนซ์แอ็พพลิเคชันไคลเอ็นต์ทั้งหมดที่เกี่ยวข้องกับผู้ค้าแต่ละราย การส่งข้อความที่เกี่ยวข้องกับผู้ค้ารายย่อยจะส่งข้อความไปยังแต่ละแอ็พพลิเคชันในรายชื่อผู้รับ การรับประกันนี้จะรับรองได้ว่ากรณีแอปพลิเคชันไคลเอ็นต์ทั้งหมดที่เกี่ยวข้องกับผู้ค้ารายหนึ่ง ๆ จะได้รับข้อความ ข้อเสียของวิธีนี้คือต้องใช้ตรรกะในการจัดการกับผู้รับและส่งข้อความ รายชื่อผู้รับสำหรับการอัพเดทราคาแม้ว่าจะมีการทำจุดต่อจุดเพื่อให้สามารถทำงานได้แล้วก็ตามดูว่ามีวิธีที่ดีกว่านี้หรือไม่ การใช้ Publish-Subscription Channel s ระบบจะเผยแพร่ข้อความบนช่องเฉพาะเจาะจงของผู้ค้าแทนที่จะเป็นช่องเฉพาะของแอปพลิเคชันไคลเอ็นต์ ด้วยวิธีนี้แอปพลิเคชันไคลเอ็นต์ทั้งหมดที่ประมวลผลข้อความสำหรับผู้ค้ารายเดียวจะได้รับและประมวลผลข้อความ Publish-Subscription Messaging สำหรับการอัพเดทราคาข้อเสียของการใช้ Publish-Subscription Channel s คือการประมวลผลข้อความที่ไม่ซ้ำกันจะไม่ได้รับการรับประกันด้วยคอมโพเนนต์ของเซิร์ฟเวอร์ อาจเป็นไปได้ที่อินสแตนซ์เซิร์ฟเวอร์หลายอินสแตนซ์จะสร้างอินสแตนซ์และแต่ละอินสแตนซ์ประมวลผลข้อความเดียวกันอาจส่งออกราคาที่ไม่ถูกต้อง การเรียกคืนการไหลของข้อความระบบเพียงทิศทางการสื่อสารเดียวที่น่าพอใจสำหรับแต่ละช่องข้อความ การสื่อสารแบบเซิร์ฟเวอร์ต่อไคลเอนต์กับการสมัครสมาชิกเป็นที่น่าพอใจในขณะที่การสื่อสารแบบ client-to-server ไม่ได้เป็นเช่นไรและการสื่อสารแบบ client-server กับ point-to-point เป็นที่น่าพอใจในขณะที่ client-server ไม่เป็นเช่นนั้น เนื่องจากไม่จำเป็นต้องใช้ช่องข้อความเดียวกันในทั้งสองทิศทางเราจึงสามารถใช้ช่องข้อความแต่ละช่องได้ในทิศทางเดียว การสื่อสารระหว่างไคลเอ็นต์กับเซิร์ฟเวอร์จะดำเนินการกับจุดต่อจุดในขณะที่การสื่อสารแบบเซิร์ฟเวอร์ต่อไคลเอ็นต์จะดำเนินการกับการเผยแพร่การสมัครรับข้อมูล การใช้การรวมกันของ Message Channel นี้ระบบจะได้รับประโยชน์จากการสื่อสารโดยตรงกับส่วนประกอบเซิร์ฟเวอร์โดยใช้การส่งข้อความแบบจุดต่อจุดและลักษณะแบบหลายผู้รับของการเผยแพร่การสมัครสมาชิกโดยไม่มีข้อเสียใด ๆ การไหลของข้อความที่มีประเภทช่องปัญหาการแก้ปัญหาด้วยรูปแบบรูปแบบเป็นเครื่องมือและชุดรูปแบบเป็นกล่องเครื่องมือ พวกเขาช่วยแก้ปัญหา บางคนคิดว่ารูปแบบมีประโยชน์เฉพาะในระหว่างการออกแบบ หลังจากการเปรียบเทียบกล่องเครื่องมือนี้ก็เหมือนกับบอกว่าเครื่องมือนี้มีประโยชน์เฉพาะเมื่อคุณสร้างบ้านไม่ใช่เมื่อคุณแก้ไข ความจริงก็คือรูปแบบเป็นเครื่องมือที่มีประโยชน์ตลอดทั้งโครงการเมื่อใช้ได้ดี ในส่วนต่อไปนี้เราจะใช้กระบวนการสำรวจรูปแบบเดียวกันที่เราใช้ในส่วนก่อนหน้าเพื่อแก้ปัญหาในระบบการทำงานของเราตอนนี้ การอัพเดตข้อมูลตลาดกระพริบผู้ค้าต้องการให้เซลล์ของตารางกะพริบเมื่อข้อมูลตลาดใหม่ได้รับสำหรับพันธบัตรโดยระบุการเปลี่ยนแปลงอย่างชัดเจน ไคลเอ็นต์ Java ได้รับข้อความพร้อมข้อมูลใหม่ซึ่งจะเรียกข้อมูลการอัปเดตแคชข้อมูลไคลเอ็นต์และกระพริบในที่สุดในตาราง ปัญหาคือการปรับปรุงมาค่อนข้างบ่อย สแต็คเธรด GUI กำลังลุกลามและแช่แข็งไคลเอ็นต์ในที่สุดเนื่องจากไม่สามารถตอบสนองต่อการโต้ตอบของผู้ใช้ได้ เราจะสมมติว่าการกระพริบเป็นไปอย่างเหมาะสมและเน้นการไหลเวียนข้อมูลของข้อความผ่านกระบวนการอัพเดต การตรวจสอบข้อมูลประสิทธิภาพแสดงให้เห็นว่าแอ็พพลิเคชันไคลเอ็นต์ได้รับการอัปเดตหลายครั้งในหนึ่งวินาทีการอัปเดตบางอย่างเกิดขึ้นน้อยกว่ามิลลิวินาทีนอกจากนี้ สองรูปแบบที่ดูเหมือนจะช่วยชะลอการไหลของข้อความคือตัวรวบรวมและตัวกรองข้อความ ความคิดแรกคือการใช้ตัวกรองข้อความเพื่อควบคุมความเร็วของการส่งข้อความโดยการโยนข้อมูลอัปเดตที่ได้รับเป็นระยะเวลาสั้น ๆ หลังจากข้อความอ้างอิง ตัวอย่างเช่นสมมติว่าเราจะละเว้นข้อความภายใน 5 มิลลิวินาทีของกันและกัน ตัวกรองข้อความสามารถแคชเวลาของข้อความที่ยอมรับได้ล่าสุดและโยนอะไรออกภายใน 5 มิลลิวินาทีต่อไป แม้ว่าแอ็พพลิเคชันอื่นอาจไม่สามารถทนทานต่อการสูญหายของข้อมูลได้ในระดับหนึ่ง แต่นี่เป็นข้อเสนอที่ยอมรับได้อย่างสมบูรณ์ในระบบของเราเนื่องจากความถี่ในการอัปเดตราคา ตัวกรองข้อความตามเวลาปัญหาเกี่ยวกับวิธีนี้คือไม่ได้มีการปรับปรุงข้อมูลทั้งหมดในเวลาเดียวกัน แต่ละพันธบัตรมีข้อมูลข้อมูลประมาณ 50 รายการที่แสดงต่อผู้ใช้รวมทั้งราคา เราตระหนักว่าทุกฟิลด์ไม่ได้รับการอัปเดตทุกอย่าง ถ้าระบบละเว้นข้อความติดต่อกันอาจเป็นการดีที่จะโยนข้อมูลที่สำคัญ รูปแบบอื่นที่น่าสนใจคือ Aggregator Aggregator ใช้ในการจัดการการจับคู่ข้อความหลาย ๆ ข้อความที่เกี่ยวข้องลงในข้อความเดียวซึ่งอาจช่วยลดการไหลของข้อความ ผู้รวบรวมสามารถเก็บสำเนาข้อมูลพันธบัตรจากข้อความที่รวบรวมไว้ก่อนหน้านี้แล้วอัปเดตเฉพาะข้อความใหม่หรือเปลี่ยนแปลงต่อเนื่องเท่านั้น ในที่สุดข้อมูลพันธบัตรที่รวบรวมจะถูกส่งผ่านไปในข้อความถึงลูกค้า ตอนนี้ให้สมมติว่า Aggregator จะส่งข้อความทุกๆ 5 มิลลิวินาทีเช่นตัวกรองข้อความ หลังจากนั้นให้สำรวจทางเลือกอื่น ผู้รวบรวมที่มีการอัปเดตต่อเนื่องบางส่วนผู้รวบรวมข้อมูล เช่นเดียวกับรูปแบบอื่น ๆ ไม่ใช่สัญลักษณ์แสดงหัวข้อย่อยของเงินที่มีประโยชน์และความเสี่ยงที่จำเป็นต้องสำรวจ มีข้อดีอย่างหนึ่งคือการนำ Aggregator ไปใช้จะช่วยลดปริมาณการเข้าชมข้อความให้มากขึ้นในกรณีของเราเฉพาะกรณีที่มีข้อความจำนวนมากเข้ามาภายในระยะเวลาสั้น ๆ เกี่ยวกับพันธบัตรเดียวกัน ในทางกลับกันเราจะไม่ได้อะไรเลยหากลูกค้า Java ได้รับข้อมูลอัปเดตสำหรับฟิลด์ใดฟิลด์หนึ่งในพันธบัตรผู้ค้าทั้งหมดเท่านั้น 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. 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 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. 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 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 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 187 Integration Patterns in Practice 187 Case Study: Bond Trading SystemTrading Systems: Designing Your System - Part 1 13 The preceding section of this tutorial looked at the elements that make up a trading system and discussed the advantages and disadvantages of using such a system in a live trading environment. ในส่วนนี้เราจะสร้างความรู้ดังกล่าวขึ้นโดยการตรวจสอบว่าตลาดใดเหมาะกับการซื้อขายระบบมากที่สุด จากนั้นเราจะดูลึกซึ้งในรูปแบบต่างๆของระบบการซื้อขาย การซื้อขายในตลาดที่แตกต่างกันตลาดตราสารทุนตลาดตราสารทุนน่าจะเป็นตลาดที่มีการค้าขายโดยทั่วไปโดยเฉพาะอย่างยิ่งในกลุ่มสามเณร ในเวทีนี้ผู้เล่นรายใหญ่เช่น Warren Buffett และ Merrill Lynch ครองและค่านิยมแบบดั้งเดิมและกลยุทธ์การลงทุนที่เพิ่มมากขึ้นเป็นที่นิยมมากที่สุด อย่างไรก็ตามหลายสถาบันได้ลงทุนอย่างมากในการออกแบบพัฒนาและดำเนินการระบบการซื้อขาย นักลงทุนรายย่อยเข้าร่วมแนวโน้มนี้แม้ว่าจะช้าๆก็ตาม ต่อไปนี้เป็นปัจจัยสำคัญที่ต้องจดจำเมื่อใช้ระบบการซื้อขายในตลาดตราสารทุน: จำนวนหุ้นที่มีอยู่จำนวนมากช่วยให้นักลงทุนสามารถทดสอบระบบในรูปแบบต่างๆของหุ้น - ทุกอย่างจากหุ้นที่ไม่ต้องสั่งซื้อ (OTC) ผันผวนอย่างมาก ชิปสีน้ำเงินที่ไม่ระเหย ประสิทธิผลของระบบการซื้อขายอาจถูก จำกัด ด้วยสภาพคล่องของหุ้นบางส่วนที่มีสภาพคล่องต่ำโดยเฉพาะประเด็นเรื่อง OTC และ Pink Sheet ค่าคอมมิชชั่นสามารถกินเข้าไปในผลกำไรที่เกิดจากการค้าที่ประสบความสำเร็จและสามารถเพิ่มความสูญเสียได้ หุ้นของ OTC และ Pink Sheet มักมีค่าธรรมเนียมเพิ่มเติม ระบบการซื้อขายหลักที่ใช้คือระบบการซื้อขายหลักซึ่งหมายถึงระบบที่ใช้พารามิเตอร์ที่แตกต่างกันเพื่อพิจารณาว่าการรักษาความปลอดภัยถูกประเมินต่ำกว่าผลการดำเนินงานที่ผ่านมาเพื่อนหรือตลาดโดยทั่วไปหรือไม่ ตลาดแลกเปลี่ยนเงินตราต่างประเทศหรืออัตราแลกเปลี่ยน เป็นตลาดที่ใหญ่ที่สุดและมีสภาพคล่องมากที่สุดในโลก รัฐบาลโลกธนาคารและสถาบันการเงินขนาดใหญ่อื่น ๆ ทำการค้าเงินหลายล้านล้านดอลลาร์ในตลาดอัตราแลกเปลี่ยนทุกวัน ผู้ค้าสถาบันส่วนใหญ่ในระบบอัตราแลกเปลี่ยนพึ่งพาระบบการซื้อขาย เดียวกันจะไปสำหรับบุคคลในอัตราแลกเปลี่ยน แต่การค้าบางส่วนขึ้นอยู่กับรายงานทางเศรษฐกิจหรือการจ่ายดอกเบี้ยที่นี่มีบางปัจจัยสำคัญที่ต้องจำไว้เมื่อใช้ระบบการซื้อขายในตลาดอัตราแลกเปลี่ยน: สภาพคล่องในตลาดนี้ - เนื่องจากปริมาณมาก - ทำให้ระบบการซื้อขายมีความถูกต้องและมีประสิทธิภาพมากขึ้น ไม่มีค่าคอมมิชชั่นในตลาดนี้ ดังนั้นง่ายมากที่จะทำธุรกรรมจำนวนมากโดยไม่ต้องเพิ่มค่าใช้จ่าย เมื่อเทียบกับจำนวนหุ้นหรือสินค้าที่มีอยู่จำนวนสกุลเงินที่ใช้ในการซื้อขายมีจำนวน จำกัด แต่เนื่องจากความพร้อมของคู่สกุลเงินที่แปลกใหม่นั่นคือสกุลเงินจากประเทศเล็ก ๆ ช่วงของความผันผวนไม่จำเป็นต้อง จำกัด ระบบการซื้อขายหลักที่ใช้ในการแลกเปลี่ยนเงินตราต่างประเทศคือแนวโน้มที่เป็นไปตามแนวโน้ม (คำนิยมในตลาดคือแนวโน้มของเพื่อนของคุณ) หรือระบบที่ซื้อหรือขายบน breakouts เนื่องจากตัวชี้วัดทางเศรษฐกิจมักก่อให้เกิดการเคลื่อนไหวของราคาขนาดใหญ่ในครั้งเดียว ตลาดตราสารทุนตลาดตราสารอนุพันธ์ตลาดซื้อขายสัญญาซื้อขายล่วงหน้าและสินค้าโภคภัณฑ์มีการซื้อขายสัญญาซื้อขายล่วงหน้า นี่เป็นยานพาหนะยอดนิยมสำหรับการซื้อขายระบบเนื่องจากปริมาณการใช้ประโยชน์ที่มากขึ้นและสภาพคล่องและความผันผวนเพิ่มขึ้น อย่างไรก็ตามปัจจัยเหล่านี้สามารถลดทั้งสองวิธี: พวกเขาสามารถขยายผลกำไรของคุณหรือขยายการสูญเสียของคุณ ด้วยเหตุนี้การใช้ฟิวเจอร์สมักสงวนไว้สำหรับผู้ค้ารายย่อยและระบบสถาบันขั้นสูง เนื่องจากระบบการซื้อขายที่มีความสามารถในการใช้ประโยชน์จากตลาดฟิวเจอร์สจำเป็นต้องมีการปรับแต่งมากขึ้นให้ใช้ตัวชี้วัดขั้นสูงและใช้เวลานานกว่าในการพัฒนา ดังนั้นที่ดีที่สุดคือถึงนักลงทุนรายย่อยในการตัดสินใจว่าตลาดใดเหมาะที่สุดสำหรับการซื้อขายระบบแต่ละข้อมีข้อดีและข้อเสียของตัวเอง คนส่วนใหญ่คุ้นเคยกับตลาดตราสารทุนมากขึ้นและความคุ้นเคยนี้ทำให้การพัฒนาระบบการซื้อขายง่ายขึ้น อย่างไรก็ตามเทรดมักถูกคิดว่าเป็นแพลตฟอร์มที่เหนือกว่าในการใช้ระบบการซื้อขายโดยเฉพาะอย่างยิ่งในหมู่ผู้ค้าที่มีประสบการณ์มากขึ้น นอกจากนี้หากนักลงทุนตัดสินใจที่จะใช้ประโยชน์จากความได้เปรียบในการลงทุนและความผันผวนมากขึ้นทางเลือกฟิวเจอร์สจะเปิดเสมอ ท้ายที่สุดทางเลือกที่อยู่ในมือของผู้พัฒนาระบบประเภทของระบบเทรดดิ้ง Trend-Following Systems วิธีที่พบมากที่สุดในการซื้อขายระบบคือระบบแนวโน้มที่ตามมา ในรูปแบบพื้นฐานที่สุดระบบนี้ก็รอการเคลื่อนไหวของราคาที่สำคัญจากนั้นจะซื้อหรือขายในทิศทางนั้น ประเภทของธนาคารระบบนี้กับหวังว่าการเคลื่อนไหวของราคาเหล่านี้จะรักษาแนวโน้ม Moving Average Systems ใช้บ่อยในการวิเคราะห์ทางเทคนิค ค่าเฉลี่ยเคลื่อนที่เป็นตัวบ่งชี้ที่แสดงราคาเฉลี่ยของหุ้นในช่วงระยะเวลาหนึ่ง สาระสำคัญของแนวโน้มจะได้มาจากการวัดนี้ วิธีที่ใช้ทั่วไปในการกำหนดการเข้าและทางออกคือการครอสโอเวอร์ ตรรกะที่อยู่เบื้องหลังนี้เป็นเรื่องง่าย: มีการสร้างเทรนด์ใหม่เมื่อราคาตกหรือต่ำกว่าค่าเฉลี่ยของราคาในอดีต (แนวโน้ม) นี่คือแผนภูมิที่ใช้สำหรับการคำนวณทั้งราคา (เส้นสีน้ำเงิน) และเส้นสีแดง (MA) ระยะเวลา 20 วันของ IBM: Breakout Systems แนวคิดพื้นฐานที่อยู่เบื้องหลังระบบประเภทนี้มีลักษณะคล้ายกับระบบค่าเฉลี่ยเคลื่อนที่ แนวคิดก็คือเมื่อมีการจัดตั้งฐานสูงหรือต่ำใหม่ขึ้นการเคลื่อนไหวของราคาน่าจะยังคงดำเนินต่อไปในทิศทางของการฝ่าวงล้อม ตัวบ่งชี้หนึ่งที่สามารถใช้ในการกำหนด breakouts คือการวางซ้อนแบบ Bollinger Band แบบง่ายๆ Bollinger Bands แสดงค่าเฉลี่ยของราคาที่สูงและราคาต่ำและการเกิดสิวเกิดขึ้นเมื่อราคาตรงกับขอบของแถบ นี่คือแผนภูมิที่ใช้คำนวณราคา (เส้นสีน้ำเงิน) และเส้น Bollinger Bands (เส้นสีเทา) ของ Microsoft: ข้อเสียของระบบ Trend-Following: ต้องมีการตัดสินใจเชิงประจักษ์ - เมื่อพิจารณาแนวโน้มจะมีองค์ประกอบเชิงประจักษ์อยู่เสมอ: ระยะเวลา แนวโน้มทางประวัติศาสตร์ ตัวอย่างเช่นค่าเฉลี่ยเคลื่อนที่อาจเป็นเวลา 20 วันที่ผ่านมาหรือในช่วงห้าปีที่ผ่านมาดังนั้นนักพัฒนาซอฟต์แวร์ต้องเป็นผู้กำหนดว่าระบบจะดีที่สุดสำหรับระบบ ปัจจัยอื่น ๆ ที่จะพิจารณาคือค่าเฉลี่ยเสียงสูงและต่ำสุดในระบบ breakout Lagging Nature - ค่าเฉลี่ยเคลื่อนที่และระบบ breakout จะล้าหลังเสมอ กล่าวอีกนัยหนึ่งก็คือพวกเขาไม่สามารถตีด้านบนหรือด้านล่างของแนวโน้มได้อย่างแน่นอน นี้ย่อมส่งผลให้ริบของกำไรที่อาจเกิดขึ้นซึ่งบางครั้งอาจเป็นสำคัญ ผลกระทบ Whipsaw - ในหมู่แรงตลาดที่เป็นอันตรายต่อความสำเร็จของระบบแนวโน้มต่อไปนี้เป็นหนึ่งในที่พบมากที่สุด ผลกระทบ whipsaw เกิดขึ้นเมื่อค่าเฉลี่ยเคลื่อนที่สร้างสัญญาณเท็จ - นั่นคือเมื่อค่าเฉลี่ยลดลงเพียงในช่วงจากนั้นก็กลับทิศทาง นี้อาจทำให้เกิดการสูญเสียมากเว้นแต่มีประสิทธิภาพหยุดขาดทุนและเทคนิคการบริหารความเสี่ยงที่ใช้ ตลาดด้านข้าง - ระบบติดตามแนวโน้มโดยธรรมชาติสามารถทำเงินได้เฉพาะในตลาดที่ทำตามแนวโน้ม อย่างไรก็ตามตลาดยังเคลื่อนไหวไปด้านข้าง อยู่ในช่วงที่กำหนดเป็นระยะเวลานาน ความผันผวนที่รุนแรงอาจเกิดขึ้น - บางครั้งระบบแนวโน้มตามอาจมีความผันผวนมาก แต่ผู้ประกอบการต้องยึดติดกับระบบของตน การไม่สามารถทำเช่นนั้นจะส่งผลให้เกิดความล้มเหลวที่มั่นใจได้ Countertrend Systems โดยทั่วไปเป้าหมายของระบบ countertrend คือการซื้อที่ต่ำสุดต่ำสุดและขายได้ที่ระดับสูงสุด ข้อแตกต่างหลักระหว่างระบบนี้และระบบแนวโน้มคือระบบเคาน์เตอร์แทร็กไม่สามารถแก้ไขตัวเองได้ กล่าวอีกนัยหนึ่งไม่มีเวลาที่จะออกจากตำแหน่งและส่งผลให้เกิดข้อเสียที่ไม่ จำกัด ชนิดของระบบการนับถอยหลังระบบต่างๆหลายประเภทถือเป็นระบบการนับถอยหลัง ความคิดที่นี่คือการซื้อเมื่อโมเมนตัมในทิศทางเดียวเริ่มซีดจาง นี่คือการคำนวณโดยส่วนใหญ่ใช้ oscillators ตัวอย่างเช่นสัญญาณสามารถสร้างขึ้นเมื่อ stochastics หรือตัวบ่งชี้ความแข็งแกร่งอื่น ๆ ตกอยู่ภายใต้จุดบางอย่าง มีระบบการซื้อขายแบบ countertrend ประเภทอื่น ๆ แต่ทุกคนมีเป้าหมายพื้นฐานเดียวกัน - ซื้อต่ำและขายสูง ข้อเสียของ Countertrend ต่อไปนี้ระบบ: จำเป็นต้องมีการตัดสินใจในการตัดสินใจ - ตัวอย่างเช่นปัจจัยหนึ่งที่นักพัฒนาระบบต้องตัดสินใจคือจุดที่ตัวบ่งชี้ความเข้มของสัมพัทธ์จางหายไป อาจเกิดความผันผวนได้มาก - ระบบเหล่านี้อาจมีความผันผวนมากและไม่สามารถติดตั้งระบบได้แม้ว่าจะมีความผันผวนนี้จะส่งผลให้เกิดความล้มเหลวได้อย่างมั่นใจ Unside Downside - ตามที่กล่าวมาแล้วมีข้อเสียที่ไม่ จำกัด เนื่องจากระบบไม่สามารถแก้ไขตัวเองได้ (ไม่มีเวลาที่จะออกจากตำแหน่ง) ข้อสรุปตลาดหลักที่ระบบการซื้อขายมีความเหมาะสมคือตลาดตราสารทุนตลาดอนุพันธ์และตลาดฟิวเจอร์ส แต่ละตลาดมีข้อดีและข้อเสีย ระบบการซื้อขายหลักสองประเภทคือระบบเทรนด์และระบบ countertrend แม้จะมีความแตกต่างทั้งสองประเภทของระบบในขั้นตอนการพัฒนาของพวกเขาต้องมีการตัดสินใจเชิงประจักษ์ในส่วนของนักพัฒนา นอกจากนี้ระบบเหล่านี้อาจมีความผันผวนมากและอาจต้องการความแข็งแกร่งบางอย่าง - ผู้ค้าระบบต้องยึดติดกับระบบของตนเองในช่วงเวลาดังกล่าว ในงวดต่อไปนี้ให้ดูที่วิธีการออกแบบระบบการซื้อขายและพูดคุยเกี่ยวกับซอฟต์แวร์บางอย่างที่ผู้ค้าระบบใช้เพื่อทำให้ชีวิตของพวกเขาง่ายขึ้น ระบบการซื้อขาย: การออกแบบระบบของคุณ - ตอนที่ 2

Comments