Roots
คือ objects ที่เราต้องการให้ทุก node ที่เข้ามา join cluster
มองเห็นเป็น object เดียวกันหมด
สิ่งที่เกิดขึ้นเมื่อเรา define root object ก็คือ
ตอนที่ class loader กำลังเริ่ม load class
จะมีการ add Advice (AOP) แบบนี้เข้าไป
Object around() : get(@Root * *.*) {
String name = thisJoinPointStaticPart.getSignature().toLongString();
return ClusterManager.getOrCreateRoot(name);
}
ซึ่งพฤติกรรมของมันก็คือ เมื่อมีการพยายามที่จะ get ค่า จาก field ที่เป็น root
around advice ก็จะ intercept การ access นั้น
แล้ว delegate ต่อไปยัง ClusterManager แทน
ซึ่ง ClusterManager ก็จะทำการ connect ไปยัง Terracotta Server
เพื่อขอค่า instance ของ root object นั้นมา
ที่ฝั่ง server เมื่อได้รับ request ก็จะทำการตรวจสอบว่า
ใน repository ของตัวเองมี root object ตามชื่อนั้นหรือไม่
ถ้าไม่มี ก็จะทำการสร้างขึ้นมาใหม่ให้ แต่ถ้ามีก็จะทำการส่ง Object นั้นกลับมา
จะเห็นได้ว่า Terracotta Server จะเป็น Node หลักที่มี Data เก็บไว้ในเครื่องตัวเอง
ส่วน Virtual machine อื่นๆ ที่ join เข้าไป ก็จะมี replicate set ของ Data นั้นๆ
object ที่จะกำหนดให้เป็น Root จะเป็น Object ใดๆ ก็ได้
ไม่จำกัดว่าต้องเป็น Serializable
กลไกที่ Terracotta ใช้ replicate changed จะมีลักษณะเป็น fine grained
นั่นคือ replicate เฉพาะส่วนที่เปลี่ยนแปลง ไม่ได้ทำหมดทั้งก้อน
จากตัวอย่างเมื่อวาน ถ้าเราลองเปิด admin UI ของ Terracotta ดู
จะเห็นว่าเรามี root object ที่ชื่อ bid.Bidding.bid
Virtual Heap
เมื่อมีการ define Root Object ก็ต้องมีการ replicate object นั้น ไปให้ทุก Virtual machine ที่ต้องการใช้
วิธีการที่ Terracota ใช้ก็คือการ มีการกำหนดพื้นที่สำหรับเก็บข้อมูลบนแต่ละ Virtaul machine ขึ้นมา
ซึ่งเรียกว่า Virtual Heap
การเก็บข้อมูลใน Virtual Heap จะใช้หลักเดียวกับ cache ก็ืคือ
พื้นที่เก็บมีจำกัด ข้อมูลไหนที่ไม่ค่อยได้ใช้ จะต้องถูก flush ออก เพื่อเปิดทางให้กับข้อมูลที่ถูกใช้บ่อยๆแทน
เวลาที่ Node ของเรา เริ่ม join เข้า cluster
Terracota จะยังไม่ copy ข้อมูลจาก server มาทันที
แต่จะรอให้มีการ access object นั้นก่อน จึงจะ copy ข้อมูลมาใส่ไว้ใน Virtual Heap ให้
(ทำในลักษณะ fine grained นั่นคือ เฉพาะ field ที่เกิดการ access จริงๆ)
No comments:
Post a Comment