[K2 Five] – Server Side Events

สวัสดีครับ วันนี้เราจะมาพูดถึง server side event ที่เป็น feature ที่มีมาตั้งแต่ K2 5.1 ว่า ทำอะไรได้บ้าง และจะช่วยอะไรเราได้บ้าง

อย่างแรกเลย Server Side Event ที่มีมาให้ จะมีอยู่ 5 แบบด้วยกัน โดยจะเป็นเกี่ยวกับการ load ข้อมูลทั้งหมด

serverside01

ก่อนหน้านี้เวลาเรา load form เราจะทำผ่าน event Initializing หรือ Initialized ก็ให้เปลี่ยนมาใช้ When the server loads แทน เรามาดูผลการทดสอบกันว่า มีผลยังไงบ้าง

หน้าแรกเราใช้ View Initializing แบบปกติ กับข้อมูล 300 records ใช้เวลาในการ load 726 ms

serverside02

หน้าที่สองเราเปลี่ยนไปใช้ When server loads a View ใช้เวลาลดลงเหลือ 393 ms

serverside03

จะเห็นว่า ลดเวลาลงไปได้ประมาณครึ่งนึงเลย ถ้าใคร upgrade เป็น K2 5.1 หรือ 5.2 แล้ว ก็แนะนำให้เปลี่ยนมาใช้เป็น When server loads แทนครับ 🙂

10 เทคนิคที่ทำให้ List View ของคุณโหลดเร็ว!!

List View เป็นการแสดงข้อมูลแบบหลาย records (ใครเขียน coding จะคล้ายๆ Grid view ใน C#) ในที่นี้จะขอรวมเทคนิคในการทำให้การเปิด List View ของคุณนั้นเร็วขึ้นมาอย่างแน่นอน

1. เรียกใช้ rule ในการ List แบบ Asynchronous

เปลี่ยนการเรียก execution block จาก then เป็น asynchronous ช่วยให้เรียก rule ได้อย่างรวดเร็วไม่ต้องรอจนทำงานเสร็จก่อนเรียก rule ถัดไป

execution block

ตอนแก้เสร็จก็ทดสอบก่อนนะ บางครั้งเราต้องรอข้อมูลก่อนหน้าให้โหลดเสร็จ แบบนี้ก็ต้องใช้ then ไปเนอะ

2. เปิด option ให้แสดงผลแบบ Paging

เปิด paging ใน list view แล้วจำกัดจำนวน item ที่จะเห็นในหน้าจอ จะช่วยลดปริมาณข้อมูลที่ต้องดึงมาแสดงผลที่หน้าจอได้

setting

ไม่ได้มีเลขเป๊ะ ๆ ว่าควรแสดงกี่รายการ แต่ส่วนใหญ่ที่ทำมักจะใช้ในช่วง 10 – 50 รายการต่อหน้าจอครับ

3. ลดการใช้งาน Association

ปกติจะใช้ร่วมกับ List Display ในกรณีที่เราเก็บ ID เป็น reference ไว้ แล้วต้องการไปดึงค่า Value ออกมาแสดงโดยอ้างอิงจาก ID

ถ้าเราอยากให้ performance ในการโหลด List View เร็วขึ้น สามารถทำได้โดยการทำการ join ในข้อมูลตั้งแต่ data source เองเช่น การเขียน Stored procedure หรือเขียน view ใน SQL ก็จะช่วยลดการทำงานในส่วนของ List Display และ association นี้ลงได้ (แต่ถ้าไม่ได้ช้ามาก ใช้ association ก็สะดวกดีครับ)

4. ลดจำนวน Column ที่แสดงใน List View

จำนวน column ที่แสดงน้อยลงจะทำให้ตอน bind เข้า List view สามารถแสดงผลได้รเ็วขึ้นไปอีก อ่อ..ต้องลบออกนะครับ ไม่ใช่แค่ซ่อนด้วย Visible = false

removeColumn

5. ลดจำนวน Properties ที่ส่งกลับมาจาก SmartObjects

โดยปกติถ้าเราสร้าง SmartObjects จากตารางบนฐานข้อมูล ใน SmartObjects จะมีจำนวน Properties เท่ากับจำนวนคอลัมน์ในตารางเลย ซึ่งเราสามารถไปลบ properties นี้ออก หรือเลือกให้ส่งกลับมาเฉพาะ properties ที่เราจะใช้ก็พอ

bind.png

หรือถ้ามีคนอื่นใช้ method นี้อยู่ด้วย ไปสร้าง method แยกไว้สำหรับหน้านี้โดยเฉพาะก็ยังได้ครับ

6. แสดงไฟล์ใน List View ด้วยลิงค์สำหรับดาวน์โหลด แทนที่จะแสดง file content

กรณีถ้าเราต้องโหลดไฟล์ขนาดใหญ่หรือไฟล์เล็ก ๆ จำนวนมากใน 1 หน้าจอก็ตาม การแสดงผลด้วย data type เป็น File จะโหลดไฟล์จริงขึ้นมาด้วย ถ้ายิ่งไฟล์มีขนาดใหญ่ ก็จะใช้ระยะเวลานานในการโหลดข้อมูล

fileListView.png

เราสามารถเปลี่ยนวิธีการเก็บไฟล์ไปอยู่บน shared network path หรือ Content Management System (CMS) เช่น SharePoint แทนได้ และแสดงผลเป็นลิ้งค์แทน เมื่อผู้ใช้งานต้องการเปิดไฟล์ ค่อยกดลิ้งค์ที่เราแสดงเพื่อไปโหลดไฟล์นั้นตรงจากที่ที่เราเก็บไฟล์ไว้ได้

7. ใช้ Input Properties ในการดึงข้อมูลแทนที่จะใช้ Filter

Filter นั้นมีความสามารถในการช่วยกรองข้อมูลที่จะแสดงใน List View ได้ด้วยเงื่อนไขต่าง ๆ แต่คุณรู้หรือไม่ว่าการใช้ Filter นั้นทำให้การแสดงผลใน List View ช้าลง เพราะข้อมูลจะถูกดึงมาทั้งหมดก่อนจึงจะมากรองออกด้วย Filter เพื่อแสดงผลในหน้าจอ

filter.png

การใช้ Input properties นั้นหลังบ้านมันคือการใส่ Where casue ว่า Input properties = ‘Value’ นั่นเอง ทำให้สำหรับหลายกรณี เจอว่า Input Properties นั้นไม่เพียงพอ เพราะต้องการค้นหาด้วยเงื่อนไขอื่นเช่น Contains, Greater than บ้าง

วิธีปรับคือพยายามควรป้อนข้อมูลใน Input properties ได้มากที่สุดก่อนเพื่อลดปริมาณข้อมูลที่ต้องโหลดขึ้นมา แล้วจึงเลือกใช้ Filter ต่ออีกทีเพื่อใส่เงื่อนไขแบบซับซ้อนลงไป หรือถ้าพบยังไม่เพียงพอ ผมก็จะใช้ View หรือ stored procedure มาช่วยรองรับเงื่อนไขแบบซับซ้อนครับ

8. ตรวจสอบว่าไม่โหลดข้อมูลซ้ำ 2 รอบ

ในการสร้าง List View ต่อกับ SmartObjects จะมี option ที่หน้า general ตรงด้านล่างว่าจะให้ Call this method when the form loads เลยหรือไม่

ถ้าไปติ๊กเลือก option นี้ระบบจะไปสร้าง rule Get List ไว้ใน View Initilize และถ้าลากไปใช้ใน Form Method Get List นี้ก็จะถูกเรียกใน Form Initilizing ด้วย (นอกจากนี้ด้วยค่า default ไม่ได้ใส่ input properties เลยทำให้มันจะดึงข้อมูลขึ้นมาทั้งหมด!!)

ListViewsGet.png

เคสที่เคยเจอคือมีไปเลือก option นี้ใน View ทำให้มีการโหลดข้อมูลแบบทั้งหมดขึ้นมา และเพิ่ม rule ใน Form initilzing ต่อ โดยโหลดข้อมูลแบบใส่ input properties ทำให้ตอนทดสอบแสดงผลที่หน้าจอถูกนะ แต่กว่าจะเปิดขึ้นมาทีช้ามาก วิธีแก้คือไปเอา rule นี้ออกซะ หรือเพิ่มเงื่อนไขให้เช็คก่อนใน View Initilize

9. ปิดการใช้ SmartForm ListView Row Count

จากที่เคยเขียน Blog ว่าด้วยเรื่องการแสดง Paging ใน Listview และ แก้ปัญหา SmartObjects สร้างข้อมูลซ้ำ หลังบ้านมีการทำงานโดยไปเรียก List method ขึ้นมา 2 ครั้งเพืื่อหาจำนวน page และเพื่อแสดงรายการ ทำให้เวลาในการโหลดข้อมูลนานขึ้น การไปตั้งค่า SmartObject.RuntimeListViewRowCount = false ก็จะช่วยให้ List method ต่าง ๆ ทำงานได้เร็วขึ้น

10. Tuning data source

ข้อนึงที่มักจะมองข้ามกัน คือการตรวจสอบที่ data soruce ตั้งต้นด้วยครับ ว่าเรียกใช้งานตรงๆ (ด้วยค่า input เดียวกับที่เราเรียกใน List view) ใช้ระยะเวลาเท่าไหร่ ถ้าระยะเวลาในการโหลดนานย่อมส่งผลต่อการเรียกผ่าน List View ไปด้วย

ส่วนวิธีแก้ให้ทำการปรับแต่งตั้งแต่ที่ data source ด้วยครับ เช่นการใส่ index ใน view หรือ table, การแก้ logic ที่ web service หรือ stored procedure ให้ทำงานเร็วตั้งต้นทาง

สำหรับเทคนิคที่ได้แนะนำไปมีทั้งทำง่าย ๆ ปรับตามได้เลย จนไปถึงยากมีต้องใช้ effort ในการทำที่มากน้อยต่างกันไป ขอให้ลองเลือกใช้ให้เหมาะสมนะครับ ว่าจะเลือกปรับตามข้อไหนและความเร็วที่ได้จากการ tuning นั้นคุ้มค่ากับที่เราลงแรงทำไปหรือเปล่า

ว่าด้วยเรื่องการแสดง Paging ใน Listview

วันนี้มาว่ากันด้วยเรื่อง paging ใน listview นะครับ โดยปกติในหน้าจอ View Settings ของ listview เราสามารถใส่ paging ได้ (ใครหาไม่เจอ เข้าหน้า design listview แล้วหารูปเฟืองนะครับ) ตามรูปด้านล่างผมใส่ให้แสดง 10 รายการต่อ 1 หน้า

setting

ตอนที่ใช้งานมีข้อสังเกตว่า ด้านล่างของ list view มีเลขบอกนะ ว่าเปิดอยู่หน้าไหนอยู่ แต่ไม่ได้แสดงหน้าทั้งหมดที่มี และไม่สามารถกระโดดข้ามไปหน้าสุดท้ายได้เลย

listview

กลไกการทำงานส่วนนี้ ทำเพื่อเพิ่มความเร็วในการโหลดหน้าจอครับ ซึ่งถ้าเราใส่ไว้ว่าให้โหลดหน้าละ 10 รายการ ตอนดึงข้อมูลมาจากฐานข้อมูล ก็จะดึงแค่ 10 รายการ แต่กรณีที่เราต้องการให้แสดงจำนวนหน้าทั้งหมดจริงๆ เราสามารถไปปรับ setting ได้ โดยไปแก้ไขที่ไฟล์ C:\Program Files (x86)\K2 blackpearl\K2 smartforms Runtime\web.config (อย่าลืม backup ไฟล์ทุกครั้งก่อนแก้ไขนะครับ)

<add key=”SmartObject.RuntimeListViewRowCount” value=”false” />

แก้เป็น

<add key=”SmartObject.RuntimeListViewRowCount” value=”true” />

Save ไฟล์ และทดสอบผล แสดงจำนวน page ทั้งหมด แล้ว 🙂

listview2

แต่เดี๋ยวก่อน!! ทดสอบแล้วอย่าเพิ่งรีบเอาไปใช้จริงนะครับ ขอให้อ่าน note ตามนี้ก่อนใช้งานครับ

  1. เวลาที่ใช้ในการโหลดหน้าจอจะเพิ่มขึ้น อย่างที่บอกไปตอนต้นว่ากลไกนี้มีเพื่อเพิ่มความเร็วในการโหลด ผมลองจับเวลาในการโหลด list view 2 ชุดข้อมูล
    • Listview แสดง 2 column จำนวน 20,000 กว่ารายการ พบว่าใช้เวลาเฉลี่ยในการเปิดหน้าจอเปิดขึ้นจาก 1.59 วินาทีเป็น 1.76 วินาที (เพิ่มราว ๆ 10%)
    • Listview แสดง 4 column จำนวน 100,000 กว่ารายการ พบว่าใช้เวลาเฉลี่ยในการเปิดหน้าจอเปิดขึ้นจาก 4.58 วินาทีเป็น 6.02 วินาที (เพิ่มราว ๆ 30%)
  2. Setting ตัวนี้เป็น setting กลาง แปลว่าถ้าแก้ไปแล้วจะมีผลกับทุก ๆ หน้าจอครับ (list view, รวมไปถึง picker control ด้วย)

สรุป ถ้าใช้งานกับลูกค้าจริง ผมแนะนำให้เปิดหน้าจอที่ข้อมูลเยอะที่สุด แล้วให้ลูกค้าทดลองใช้งานครับ ว่าเวลาโหลดหน้าจอที่เพิ่มขึ้น มันคุ้มค่ากับการแสดงผล paging แบบนี้หรือไม่

Test with K2 4.6.11

[K2 Blackpearl] Performance enhance โดย K2 Archiving

สวัสดีครับ วันนี้ขอนำเสนออีกหนึ่ง feature ของ K2 ที่ไม่ค่อยได้กล่าวถึงและใช้งานกันสักเท่าไหร่นะครับ ซึ่ง feature นี้ก็คือ K2 Archiving ตามหัวข้อนั่นเอง

เมื่อเราใช้งาน K2 ไปสักระยะหนึ่ง ขนาดไฟล์ของ database K2 นั้นก็จะเพิ่มขึ้นไปตามปริมาณการใช้งานไปด้วย การลดขนาดของ database ได้นั้นจะช่วยให้การทำงานโดยภาพรวมของระบบเร็วขึ้นทั้งส่วนของ K2 และส่วนของ MS SQL Server ด้วย  Archiving เป็น feature ที่มีเพื่อทำการย้ายข้อมูลของ process ของ K2 ที่จบการทำงานแล้วเท่านั้น ไปไว้ใน database อีกก้อนนึง

เรามาดูขั้นตอนการทำ archiving กันครับ

  1. สร้าง database ก้อนใหม่ใน MS SQL Server (ต้องอยู่ใน instance เดียวกันกับ K2) ในตัวอย่างผมตั้งชื่อว่า K2Archive01-CreateArchivingDB
  2. เข้า K2 workspace ไปที่เมนู Management Console -> [K2 Server Name]  -> Workflow Server -> Archiving02-ArchivingMenu
  3. ในส่วนของ Archive Database ให้กด Select แล้วเลือก database ที่เราสร้างไปในข้อที่ 103-SelectDB
  4. เลือกวันที่ From Date และ To Date (ตรงนี้แนะนำให้เก็บของปีปัจจุบันไว้ครับ เช่น เลือกตั้งแต่ 01/01/2014 – 31/12/2015)
  5. กด Archive แล้วรอจนขึ้นว่า Archiving completed successfully  ระยะเวลานั้นจะขึ้นอยู่กับปริมาณข้อมูลครับ บางที่ถ้าข้อมูลเยอะ อาจะต้องใช้เวลาเป็นชั่วโมง

หลังจากทำการ Archiving เสร็จสิ้น ลองเข้ามาตรวจสอบในหน้า Process Overview ดู ก็จะพบว่าปริมาณงานในหน้ารายงานนี้จะลดลงไป รวมข้อขนาดก้อนของ database ก็ลดลงด้วยเช่นกัน

04-Completed

Process ที่ถูก archive ไปแล้วจะไม่สามารถดูรายงานได้  เพราะฉะนั้นจึงแนะนำให้เลือกช่วงเวลาย้อนหลังไปหน่อย เพื่อย้ายงานที่เก่าที่ไม่ต้องการดูรายงานหรือไม่ต้อง audit แล้วเท่านั้น อย่างไรก็ตามเราสามารถที่จะนำข้อมูลที่ archive ไปแล้ว มา restore กลับคืนใน database ของ K2 ได้ โดยใช้หน้าจอเมนูเดียวกันครับ

ส่วนของการทำ Archiving ก็จบลงเพียงเท่านี้ครับ หวังว่าจะมีประโยชน์ต่อการทำ enhance performance นะครับ ต่อไปถ้ามีโอกาสจะนำเทคนิคการ tuning performance ข้ออื่น ๆ มานำเสนออีกครับ ส่วนวันนี้…สวัสดีครับ 🙂

[K2 SmartForms] – Performance Improvement

สวัสดีครับ พอดีช่วงนี้มีโอกาสไปทำ performance improvement ให้ลูกค้าที่หนึ่ง เลยถือโอกาสมาเล่าส่วนที่น่าสนใจให้ฟังกัน ก่อนจะอ่านบทความนี้ ควรจะอ่าน link ตามด้านล่างนี้ก่อน

หลังจากอ่านตาม link ด้านบนแล้ว เราก็จะทราบว่า ถ้าเป็นการ load data ตอนเปิด form ทั่วๆ ไป ควรจะใช้เป็น asynchronous ทั้งหมด ยกเว้นในกรณีต้องการใช้ข้อมูลที่เรา load มาก่อนหน้านี้ทำงาน ถึงจะต้องไปใช้ sequential ที่เป็น then แทน

ส่วนที่น่าสนใจคือ ใน version หลังๆ ของ K2 event ตอน load form จะมี Initializing และ Initialized โดย Initializing จะทำงานตอนเปิด form ส่วน Initialized จะทำงานหลัง Initializing อีกที จากบทความ http://www.datalytyx.com/how-to-improve-k2-smartforms-performance/ แนะนำว่า ถ้ามีการ load data ต่างๆ เช่น ดึงข้อมูลเข้า dropdownlist ให้ไปทำที่ Initialized ส่วน Initializing ใช้สำหรับ set property ต่างๆ และ action ใน Initializing ควรจะทำเป็น asynchronous ทั้งหมด

 

ส่วนถัดมาที่เราสามารถทำได้คือ layer ที่เป็น IIS แล้ว ซึ่งที่เคยลองจะมีตามด้านล่าง

  • ตอน set up K2 ถ้าตาม default เราจะไม่ค่อยแยก application pool ของ designer site กับ runtime site ออกจากกัน ให้ลองแยกออกมาดู เพราะเราจะปรับ Maximum Worker Process เพิ่มขึ้น (ค่า default เป็น 1) โดยจะปรับเป็นเท่าไหร่นั้น ต้องดู resource ของเครื่องด้วย เพราะการปรับส่วนนี้จะทำให้กิน memory เพิ่มขึ้น

Maximum Worker Processes

  • ปิด IIS Logging ของ runtime site เพื่อลดเวลาในการทำงานของ IIS

 

เท่าที่ลองดู การ tuning ในส่วนของ rule ของ K2 จะเห็นผลเยอะกว่าที่ tune ในส่วน IIS ดังนั้นควรจะ focus ในการ improve performance ของส่วน rule ใน K2 ก่อน ซึ่งใน blog นี้จะไม่ได้พูดถึงมาก เพราะสามารถหาอ่านได้ใน link ที่แจ้งไปตอนต้นครับ แต่อย่างไรก็ดีต้องไม่ลืมว่า การออกแบบหน้าจอ และ behavior ในการทำงานเป็นสิ่งสำคัญในการที่ form จะมี performance ที่ดีหรือไม่ดีครับ แล้วพบกันใหม่ครั้งหน้านะครับ