วิธีการต่อไปนี้ เป็นวิธีการที่พิสูจน์แล้วว่าสามารถแก้ปัญหาได้จริง++
Background:
Crystal Report เป็น Tool ยอดนิยมตัวหนึ่งสำหรับนักพัฒนา .NET เนื่องด้วยความสามารถของมันและการที่มัน Bundle มาพร้อมกับ Visual Studio ตั้งแต่ Version 2003 เรื่อยมาจนถึงปัจจุบัน
การใช้ Crystal Report บน Web Application นักพัฒนาส่วนใหญ่พบปัญหาการเมื่อมีภาวะ Load การทำงานสูง หรือมีการใช้งานพร้อมกันหลายๆ คน ปัญหาดังกล่าวสืบเนื่องจาก Report Engine ซึ่งมีให้ใช้ “ฟรี” สามารถรองรับการทำงานได้จำกัด
ปัญหาดังกล่าวมักเกิดกับ Web Application เนื่องจากการการ Render Report จะัถูกกระทำบน Server ทั้งหมด ก่อนจะส่งผลลัพธ์ไปยัง Browser ของผู้ที่ร้องขอ อีกทั้งการที่จะต้องเก็บ State ของ Report ไว้ทำให้การจัดการทรัพยากรทำได้ยากลำบากยิ่งขึ้น
Testing Step1:
Benchmark ปัญหาก่อนการแก้ไข เราจะทำการทดสอบโดยใช้ Jakarta JMeter ในการจำลอง Concurrent User ซึ่งให้ผลดังนี้
หลังจากทำการ Load อย่างต่อเนื่องพร้อมๆ กัน ในครั้งที่ 70+ จะเริ่มเกิด Error จำนวนมาก (๋JMeter แสดงสีแดง) โดยมีข้อความดังต่อไปนี้
The maximum report processing jobs limit configured by your system administrator has been reached.
จากข้อมูลอ้างอิง http://www.sdn.sap.com/irj/boc/index?rid=/library/uuid/f053713e-3e3d-2c10-2a81-f79259e54023&overridelayout=true
สามารถสรุปได้ว่า สามารถแก้ไขได้ 3 วิธี
- เขียน code ให้ดี
- แก้ Registry เพิ่ม JobLimit ให้สูงขึ้น
- เปลี่ยนมาใช้ Crystal Report Application Server ซึ่งรองรับ Load จำนวนมากได้ (แต่ก็เสียเงินจำนวนมากด้วยเช่นกัน)
Testing Step 2: ทดลองปรับเปลี่ยน Code
หลักการคือ จะทำการ Close Report Document ทุกครั้งหลังจากที่ใช้งานเสร็จ โดยเลือกทำการ Close ที่ Event Page Unload ซึ่งจะถูกกระทำทุกครั้งหลังจาก Render HTML Page เรียบร้อยแล้ว
protected void Page_Unload(object sender, EventArgs e) { reportDoc.Close(); reportDoc.Dispose(); }
หลังจากนั้นทดสอบด้วย JMeter อีกครั้ง (Restart IIS ก่อนเริ่ม เพื่อให้ได้ผลลัพธ์ที่เที่ยงตรง)
ผลลัพธ์คือ ไม่เกิดปัญหา Processing job limit อีกต่อไป สามารถรองรับ High Load ได้อย่างสบายๆ โดยไม่ต้อง ปรับแก้ Registry JobLimit เลยด้วยซ้ำ..
No comments:
Post a Comment