ผมเจอปัญหา unexpected response NOT FOUND บ้าง DELETED บ้างเวลาใช้ memcached กับ Rails โดยปัญหาเกิดค่อนข้างจะดูเหมือน random เพราะเกิดไม่ซ้ำที่กันทีเดียว เป็นปัญหาที่งงอยู่เหมือนกันว่ามันมาจากไหน จับจุดไม่ถูกครับ

แต่วันนี้ผมเจอแล้วครับ สาเหตุเป็นเพราะว่าผมสร้าง thread ใหม่มา expire cache fragments เพื่อเพิ่มความเร็วในการ expire fragments นั่นเอง เป็น code ค้างมาจากสมัยใช้ file system caching

ปรากฎว่าถ้าในเวลาเดียวกันถ้ามีคนพยายาม access fragments ที่กำลังจะ expire นั้น memcache-client จะงงครับ แล้วส่งผลเป็น unexpected response ในที่สุด

เขียนแล้วงงๆ ใช่ไหมครับ เรียบเรียงคำพูดไม่ค่อยดี ขี้เกียจเรียงใหม่ โชว์ code ตัวอย่างดีกว่า จาก

Thread.new { @owner.posts.each {|post| expire_fragment :controller => "post", :action => "post_sample", :part => post.id.to_s } }

เหลือแค่

@owner.posts.each {|post| expire_fragment :controller => "post", :action => "post_sample", :part => post.id.to_s }

ก็เรียบร้อยแก้ปัญหาได้เพราะไม่ multithreading แล้ว แล้วก็ไม่ช้าด้วย เพราะ memcache นั้น expire item ได้รวดเร็วว่องไวครับ

ที่จริงแล้ว memcache-client มี option ให้ระบุว่าอยู่ multithreading environment ด้วย แต่ผมคิดว่าเป็นการเพิ่ม overhead ให้แก่ระบบเสียมากกว่า ไม่น่าจะคุ้มเท่าไหร่ครับ