.NET High Performance Socket Programming with XF.Server(ภาคเกริ่นนำ)

ถ้าเราลอง Search google เรื่อง Socket Programming in C# ผลที่ได้ก็จะมีมากมายที่มาพร้อมตัวอย่างเกือบทั้งหมดจะเริ่ม ด้วย Simple จนดูเหมือนการเขียนโปรแกรมบน TCP/IP ใน C# น่าจะเป็นเรื่องง่ายๆ ผมมีงานที่ต้องเขียนโปรแกรมแบบ Client-Server พอดีครับ(จริงๆเขียนมานานพอสมควรเหมือนกัน) ส่วนใหญ่ที่ได้ทำคือเขียน Client ครับแล้วก็ Follow bisness rule ของ Server อาทิเข่นก่อนจะส่งข้อความมากต้องส่ง 0001 มาก่อนรอตอบก่อนแล้วถึง Allow ให้ส่ง Message ได้ เคยคิดว่าเนี่ยมันเป้นสุดยอดของการเขียน Socket Programming แล้ว

งานล่าสุดทำให้ผมรู้ว่าจริงๆแล้ว TCP/IP programming หรือที่หลายๆคนเรียกว่า Socket Programming มันลึกล้ำมากครับ เรื่องมีอยู่ว่าคราวนี้ผมรับหน้าที่ในการเขียน Server ที่จะต้องรองรับการ Call จาก Client ซึ่งจากประเมินคราวเบื้องต้นน่าจะไม่เกิน 5 หมื่น record ต่อวัน หรือประมาณ 1 ครั้งต่อ 2 วินาที ซึ่งถ้ามาขนาดนี้ Simple รับมือไหวครับ ไม่ต้องขนาดแตก Thread หลังจาก Accept Connection แล้วค่อย Stream Data กันก็ยังไหว

งานมันมาเข้าตอนที่ผมได้โจทย์มาว่าให้ทำ Load/Stress Test ด้วยนี้แหละครับ โปรแกรมนี้เป็น Client-Server ที่ Client เขียนด้วย Java และ Server เขียนโดย .NET ด้วยนิสัยส่วนตัวเห็นว่าการ Load Test แบบแบ่ง Folder Java แล้วลูป KornShell ไม่น่าจะเอามาใช้ในการคำนวน Trasection/Sec. ได้ ผมเลยแถม Unit ของ Java Client ตัวนี้ให้และส่งไปพร้อมกับ jMeter ซึ่งสามารถConfigแตกThreadยิงได้ จากแรกที่ KornShell อย่างมากก็ได้10Clientที่ยิงมา พอใช้เป็น jMeter ยิงเข้ามาปรากฏว่าลองคำนวณคราวๆต้องให้ Server รับ Load ให้ได้ 400 tps หรือมั่วๆก็ 400 concurrent นั้นแหละ

บร๊ะเจ้าตกใส่(ไม่น่าสอนคนtestใช้jMeterเลยใช้งานง่ายสนุกกันใหญ่) ปรากฏว่าServerรับConnectจากClientได้ไม่ถึงครึ่งด้วยจำนวนtpsขนาดนี้ ต้องแก้โปรแกรมฝั่ง Server ที่เป็น .NET ครับ เริ่มรู้แหละที่เขาบอก Simple Simple เนี่ยมัน Hide ส่วนที่โคตะระยากส์อยุ่อีกเยอะเลย ต้องเปิดตำรา Network Programming กันยกใหญ่หลายตลบ ทั้ง Simple, Thread, Ssynchronous, etc. Simple กับ Thread ที่ServerตอนรับConnetionก็แล้วยังไม่สามารถแก้ไขปํญหาได้ ครั้นจะเปลี่ยนเป็นasynchronousก็ติดหลายอย่างต้องแก้ Architecture Design ของโปรแกรม แก้ Java Client, .NET Server แถม Asynchronous ของสองภาษายังไม่ค่อยจะลงลอยกันอีก

ต้องพึ่งพาอาจารย์gooล่ะ ได้เรื่องครับ

พอดูฝั่ง Java ก็พบปัญหาคล้ายๆกันบนฝั่ง Server แต่ด้วย Comunities ของ Java และความเป็น Opensource ที่ Developer รักเลยทำให้มี Third party เข้ามาช่วยเยอะ ไม่ว่าจะเป็น Mina, Nutty ใส่ทางกลับกัน .NET กับหา Third party opensource ที่จะมาช่วยยากเหลือเกิน พอเข้าไปดูใน Codeplex (Comunities ของ .NET) ก็เจอ supersocket แต่พอเอาเข้าจริงๆก็พี่ที่ office แนะนำให้ใช้ XF.Server เดินตามผู้ใหญ่สุนัขไม่กัดครับ ว่าไงว่าตามกัน

XF.Server คืออะไร

XF.Network is a component for creating high performance TCP/IP client-server applications using .NET platform. It provides a scalable, ready for multicore processors solution.

XF.Network คือคอมโพเนนต์สำหรับสร้างโปรแกรมประสิทธิภาพสูงบนสถาปัตยกรรมแบบClient-Server ที่ทำงานบน TCP/IP Layer ที่ใช้ .NET ไม่พอแค่นั้นมันยังพร้อมสำหรับการเพิ่มขนาด รวมถึงรองรับการทำงานแบบ Multicore ด้วย

โฆษณาเกินจริงๆเสมอครับ เอาง่ายแบบที่ผมเข้าใจเลยแล้วกันมันเป็น unmanaged code C++ ที่ทำขึ้นมาเพื่อแก้ปัญหาของ WinSock API และ I/O completion แล้วมี manage code มาครอบเพื่อให้เรียกใช้งานได้ง่ายบน .NET

เริ่มใช้งาน

เกริ่นนำยาวมากเริ่มใช้งานกันเลยดีกว่าครับ Download มาใช้ได้จาก website ของเขาเลยครับในนั้นจะมีตัวอย่างการใช้งานให้ด้วย

--ยังมีต่อครับแต่ตอนนี้เอาไว้แค่นี้ก่อนครับ ผมขอเวลาทำสรุปผล Test มาให้ดูก่อนดีกว่าครับจะได้เห็นภาพ--

ความคิดเห็น

^-FakE-^ กล่าวว่า
เข้ามาเชียร์
Giorno กล่าวว่า
ไม่เอาคำเชียร์เอาเวลามาช่วยกันทำดีก่า

บทความที่ได้รับความนิยม