Wednesday, March 09, 2005

ทดลอง Jboss-TreeCache

ใครที่เคยเขียน Web Application ที่ Scale ใหญ่หน่อย
คงจะรู้ว่าการ implement Application Cache นั้นจะช่วย
ให้ชีวิตยืนยาวขึ้นเล็กน้อย (ไม่เครียดกับปัญหา server ตอบสนองช้า)

ปกติผมจะใช้ OSCache
ซึ่งเท่าที่ใช้มาก็ ok ดี (ยกเว้นว่ามีปัญหา
อยู่ที่จุดการ implement monitor ที่จะใช้จับ
statistic การใช้ cache)

แต่มี opensource cache อยู่ตัวหนึ่งที่ผมสนใจอยากรู้
นั่นก็คือ Jboss TreeCache
สิ่งที่แตกต่างออกไปใน jboss-treecache ก็คือ
1. เป็น cache ที่มีลักณณะเป็น tree
cache โดยทั่วไปจะมีลักษณะเป็น HashTable คือ มี key แล้วก็ value
การเข้าถึง cache จะใช้คำสั่ง

put (Object key, Object value)
get (Object key)


ส่วน jboss-treeCache จะใช้คำสั่งในลักษณะ

put (String treePath, Object key, Object value)

get (String treePath, Object key)


ดูๆ ก็เหมือนไม่มีอะไรพิเศษ เพราะจริงๆแล้ว
เราสามารถตั้งชื่อ key ให้มีลักษณะกลุ่ม tree ได้เหมือนกัน
เช่น
put ("erp.po.Order." + order.getId(), order)
เมื่อเทียบกับ
put ("/erp/po/Order", order.getId(), order);
ก็ไม่ได้ให้ความรู้สึกแตกต่างกัันมากนัก

แต่ความแตกต่างๆจริงๆ จะไปอยู่ที่การ implement aspect
intercept ใน Jboss-treeCacheAOP
ซึ่งขอยกยอดคำอธิบายไปอยู่ข้างท้ายสุด

2. support Transaction scope
การแก้ไขข้อมูลใน cache ร่วมอยู่ใน transaction ด้วย
ถ้า rollback , ก็จะเกิด undo ใน cache ด้วย

ตัว Jboss-treeCache แยก package ออกเป็น 2 ส่วนหลัำกๆคือ
  • treeCache
  • treeCacheAOP (extend จาก treeCache)
ตัวที่น่าสนใจก็คือ ตัว AOP
เนื่องจาก concept ของการ cache ที่เราสามารถเลือก
option ให้ทำการ slide Object ที่ put ลงไปออกเป็น
node ย่อยๆ เช่นสมมติเรามี

class Person
private Long id;
private String name;
private Address addr;

class Address
private String line1;
private String line2;


ถ้าเรา Config ให้ Class Person ให้เป็น aop-enabled
แล้วเราสั่ง put Person Object ลงใน cache
ตัว treeCache จะทำการแยกส่วน object ออกเป็น
node ย่อยๆ (แทนที่จะเก็บ object Person ลงไปตรงๆ)
มีลักษณะเป็น tree ตามนี้

+Node Person
-Node id
-Node name
+Node addr
Node line1
Node line2

ที่นี้ข้อดีของการทำอย่างนี้คืออะไร
ในกรณีที่ Environment ที่เป็น Cluster
ถ้าเราสั่ง

person.getAddr().setLine1("bah");

ถ้าเป็น cache ทั่วๆไป ก็จะต้องมีการ replicate
object Persion ทั้งก้อนออกไป
แต่ถ้าเป็น treeCacheAOP จะมีการ replicate
ออกไปเฉพาะส่วน line1 เท่านั้น (ทำเฉพาะ node ที่เปลี่ยนแปลง)
ซึ่งถ้าเป็นเช่นนี้ traffic ของการ replicate ก็จะมีขนาดเล็ก
ทำให้ไม่เกิดปัญหา bottleneck
หรือ lag ที่เกิดจากการ serialize object ขนาดใหญ่

เท่าที่ลอง set server ขึ้นมา 2 server
เพื่อทดสอบ treeCache (แบบไม่ใช่ AOP)
replication feature ดู
ก็ไ่ม่พบความยุ่งยากอะไร ใช้ตรงๆดังนี้

ตอน initialize

tree = new TreeCache();
tree.setClusterName("test");
tree.setCacheMode(TreeCache.REPL_ASYNC); // replicate แบบ Async
tree.startService();

มันจะ set ค่า default ของ JGroup ให้เอง
เวลาใช้ก็แค่

getTreeCache().put("pok", getKey(), getValue());


ข้อเสียอีกอย่างของ treeCache ก็คือ
ถ้าเราใช้นอก server jboss
dependency ของ library มันจะเป็นหางว่าวเลย
ต้องเพิ่ม jar ลงไปไม่น้อยกว่า 8 ตัว

ข้อมูลเพิ่มเติม
  • TreeCache
  • TreeCacheAOP
  • ส่วนใครที่คิดจะใช้ ให้ดู todo ให้ดีเสียก่อน มี bug ร้ายแรงอยู่ตัว

Related link from Roti

No comments: