ผมเจอปัญหา 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 ให้แก่ระบบเสียมากกว่า ไม่น่าจะคุ้มเท่าไหร่ครับ
พึ่งได้มารู้จัก memcached :-)
ดีัจังเลยคับ ผมก็ไม่เคยเจอปัญหา นี้
มีประโยชน์มากเลยคับ อยากให้คนไทยใช้ memcached กันเยอะๆ