ฉันเห็นสิ่งนี้ค่อนข้างมากใน New Relic เช่นกัน
จากสิ่งที่ฉันเห็นมีสาเหตุที่แตกต่างกันเล็กน้อยฉันไม่มีความเข้าใจที่สมบูรณ์เกี่ยวกับปัญหานี้ แต่มันเป็นสิ่งที่ฉันได้ดูเมื่อเร็ว ๆ นี้ นี่คือสิ่งที่ฉันค้นพบ
การประชุมใน Magento, Locking และ New Relic
ทุกการกระทำของตัวควบคุมใน Magento ใช้เซสชันไม่ว่าจะต้องการหรือไม่ก็ตาม เซสชันถูกสร้างอินสแตนซ์ที่กระตือรือร้นในMage_Core_Controller_Varien_Action :: preDispatch
หากคุณเปิดใช้งานการล็อคเซสชันหมายความว่าช่วงเวลาของคำขอถูกล็อคเซสชันจนกว่าคำขอจะเสร็จสมบูรณ์ ฉันยังไม่พบรหัสที่เปิดตัวการล็อคเซสชัน แต่ฉันค่อนข้างแน่ใจว่ามันอยู่ในนั้น
ท้ายที่สุดนี้หมายความว่าหากคุณเรียกใช้การร้องขอพร้อมกันหลายครั้งไปยังการกระทำของตัวควบคุม Magento จากที่เดียวโดยใช้เซสชั่นเดียวกันคุณจะต้องรอคำขอบางส่วนเพื่อให้เสร็จสมบูรณ์และปลดล็อคเซสชันเพื่อดำเนินการต่อ ฉันมักจะเห็นว่านี่เป็นธุรกรรมที่ช้าสำหรับของที่ระลึกใหม่ติดอยู่ที่Mage_Core_Model_Session_Abstract_Varien::start
ประมาณ 30 วินาที (การล็อคเซสชันของฉันหมดเวลาที่ฉันคิด)
รายงานใหม่ของที่ระลึกนี้มีข้อเสียหลายอย่างที่ฉันเห็น
- ชะลอเวลาตอบกลับโดยเฉลี่ยโดยรวมเนื่องจากคำขอเหล่านี้ช้ากว่าที่ควรจะเป็น
- New Relic บันทึกตัวอย่างของการทำธุรกรรมที่ช้าที่สุดหากฉันมีปัญหาคอขวดในการทำงานซึ่งใช้เวลานาน 20 วินาที New Relic จะไม่รายงานสิ่งเหล่านั้นโดยอัตโนมัติหาก URL เดียวกันถูกรบกวนด้วยการหมดเวลาล็อคเซสชัน การหมดเวลากำลังซ่อนข้อมูลที่เป็นประโยชน์
สาเหตุ
ฉันเคยเห็นสาเหตุบางประการของเรื่องนี้ไม่ใช่รายการที่ชัดเจนไม่ว่าด้วยวิธีใด
บอท
ซอฟต์แวร์รวบรวมข้อมูลเช่น Baidu และ Yandex เป็นสิ่งที่หยาบคายและทำลายเว็บไซต์ พวกเขากำลังถูกเรียกใช้จากที่เดียวซึ่งส่งคำขอจำนวนมากโดยใช้เซสชันเดียวกันและเพิ่มกลไกการล็อคเซสชันดังนั้นจึงแสดงธุรกรรมที่ช้าใน New Relic
Ajax เรียกร้องให้ดำเนินการกับตัวควบคุม Magento
ด้วยเว็บไซต์ที่เคลือบเงาข้อมูลเฉพาะลูกค้าจะต้องโหลดอย่างระมัดระวังบางเว็บไซต์จัดการสิ่งนี้โดยใช้ Ajax โทรไปที่แบ็กเอนด์ Magento เพื่อรับข้อมูลที่ต้องการ ฉันเคยเห็นบางเว็บไซต์ที่ใช้ Ajax โทรไปที่แบ็กเอนด์เพื่อรับข้อมูลเฉพาะผลิตภัณฑ์เช่นจำนวนเงินที่เหลืออยู่ในสต็อกเมื่อรายการถูกขาย
หากหน้าใดหน้าหนึ่งเรียกใช้ ajax หลายครั้งเพื่อเรียกใช้แบ็กเอนด์เมื่อโหลดหน้ามันอาจทำให้เกิดการเรียกใช้กลไกการล็อคเซสชัน อาแจ็กซ์ยิ่งโทรกลับไปที่แบ็กเอนด์วีโอไอพียิ่งคุณมีโอกาสได้ล็อค
น้ำยาเคลือบเงา ESI
เช่นเดียวกับข้างต้นจริงๆยกเว้นแทนที่จะใช้ ajax call มันใช้ Edge Side รวมซึ่งดูเหมือนจะเป็นการโทรใหม่ไปที่แบ็กเอนด์
แผนของฉัน
ฉันยังไม่ได้ทำสิ่งนี้เลยดังนั้นมันจึงยังเป็นทฤษฎีล้วนๆ แต่มันเป็นสิ่งที่ฉันอยากทำในอีกไม่กี่เดือนข้างหน้า
ผมนำปัญหานี้ขึ้นในระหว่างการประชุม Mage ไททันส์สหราชอาณาจักร 2016 และ Fabrizio Branca ชี้ให้ฉันต่อโมดูลต่อไปนี้: https://github.com/AOEpeople/Aoe_BlackHoleSession
ตามการแสดงออกปกติโมดูลจะป้องกันบอทจากการสร้างเซสชันจริงสิ่งนี้ควรมีประโยชน์ที่จะไม่มีการล็อคเซสชันและทรัพยากรเซสชันของคุณจะไม่ถูกทำลายโดยบอทหยาบคาย บอตไม่ควรทำให้เสียการอ่านของที่ระลึกใหม่อีกต่อไป
สำหรับการโทร ajax / ESI เพื่อรับข้อมูลลูกค้าในหน้าแคชไม่มีอะไรที่คุณสามารถทำได้ที่ฉันเห็น คุณต้องเข้าถึงเซสชันเพื่อดึงข้อมูลเฉพาะลูกค้า
อย่างไรก็ตามสำหรับการโทร ajax / ESI เพื่อรับข้อมูลเฉพาะแคตตาล็อก (เช่นสินค้ามีจำนวน จำกัด ) ฉันไม่เห็นความต้องการเซสชันใด ๆ ที่จะมีอยู่ในคำขอนั้นเลย แผนการในอนาคตของฉันคือการทดลองขยายส่วนขยายไปยังAoe_BlackHoleSession
โมดูลเพื่อให้ฉันสามารถปิดการร้องขอไปยัง URL ที่ระบุว่าไม่มีการใช้งานเซสชัน
ฉันไม่ค่อยคุ้นเคยกับ internals ของ ESI ดังนั้นน่าเศร้าที่ฉันไม่มีความคิดเห็นมากเกินไป
ทางเลือกอื่น
ในระหว่างการประชุม Fabrizio Branca กล่าวว่าเขาสามารถปิดการใช้งานการล็อคเซสชันได้อย่างสมบูรณ์โดยไม่มีผลกระทบใด ๆ ทดสอบความเสี่ยงของคุณเอง