การแคชที่ชั้นธุรกิจเทียบกับการแคชที่ชั้นข้อมูล


35

ฉันมักจะทำงานในโครงการที่ทำแคชบน DAL โดยทั่วไปเมื่อคุณกำลังจะโทรไปยังฐานข้อมูลนั้นจะตรวจสอบว่าข้อมูลมีอยู่ในแคชแล้วหรือไม่และถ้าเป็นเช่นนั้นก็ไม่ได้ทำการโทรและ ส่งคืนข้อมูลนั้นแทน

ฉันเพิ่งอ่านเกี่ยวกับการแคชที่ชั้นธุรกิจดังนั้นโดยทั่วไปแล้วการแคชวัตถุธุรกิจทั้งหมด ข้อดีอย่างหนึ่งที่ฉันเห็นได้ทันทีคือเวลาตอบสนองที่ดีกว่ามาก

เมื่อไหร่ที่คุณจะชอบอีกอันหนึ่ง? และการแคชที่ชั้นธุรกิจเป็นเรื่องธรรมดาหรือไม่


ประสิทธิภาพของแอปพลิเคชั่นของคุณมีความสำคัญหรือไม่ที่การแคชในเลเยอร์ธุรกิจนั้นมีความจำเป็นมากกว่าหลีกเลี่ยงความชัดเจนของการเรียกเพิ่มเติมไปยังที่เก็บหรือเลเยอร์ DAL?
JDT

1
ไม่มันไม่ได้และหลังจากอ่านคำตอบฉันคิดว่าฉันจะติดกับแคชใน DAL ไชโย
เอ็มม่า

คุณควรพิจารณาแคชเหนือเลเยอร์ธุรกิจของคุณและคิดเกี่ยวกับการปรับขนาด
AK_

คำตอบ:


29

นี่อาจกว้างเกินไปสำหรับคำตอบที่ชัดเจน โดยส่วนตัวแล้วฉันรู้สึกว่า data access layer เป็นสถานที่ที่ดีกว่าสำหรับการแคชเพียงเพราะมันควรจะง่ายมาก - บันทึกเข้าและออกและนั่นคือมัน

ชั้นธุรกิจดำเนินการกฎระเบียบเพิ่มเติมจำนวนมากของความซับซ้อนสูงขึ้นเพื่อให้มันดีกว่าถ้ามันไม่ได้นอกจากนี้ยังมีการจัดการต่อวัตถุกังวลความพร้อมใช้งานนอกเหนือไปจากความกังวลเกี่ยวกับความสอดคล้องหลายวัตถุในระดับเดียวกัน (หรือแม้กระทั่งวิธีการเดียวกัน) - ที่จะ เป็นการละเมิด SRP ที่โจ่งแจ้ง

(แน่นอนฉันเพียงแค่เข้าใจอย่างถ่องแท้หลังจากที่ชั้นเรียนบริการของฉันมีความซับซ้อนที่ไม่สามารถจัดการได้เมื่อพวกเขาพยายามทำแคชและการกำหนดค่าพร้อมกันไม่มีครูที่ดีไปกว่าประสบการณ์ แต่ราคาแน่นอนสูงชัน)


ทำไมการแคชต้องซับซ้อน? มันสามารถทำได้กับ AOP และบันทึกย่อสองสามรายการ มันยังคงเป็นการละเมิด SRP หรือไม่? ทำไมมันไม่เมื่อเสร็จใน DAL IMHE ฉันไม่เคยเห็นคลาสบริการ "ซับซ้อนเกินไป" ถูกแคช เป็นอิสระจากความซับซ้อนของบริการสามารถมองเห็นเป็นกล่องดำและผลของมันจะถูกเก็บไว้
user1075613

24

การเข้าถึงข้อมูลและการคงอยู่ของเลเยอร์ / พื้นที่จัดเก็บข้อมูลเป็นที่ที่ไม่อาจต้านทานได้สำหรับการแคช พวกเขากำลังทำ I / Os ทำให้สะดวกในการใส่แคช ฉัน daresay ที่เกือบทุก DAL หรือชั้นความเพียรพยายามที่จะครบกำหนดตามที่ได้รับฟังก์ชั่นแคช - ถ้ามันไม่ได้ออกแบบมาตั้งแต่เริ่มต้น

ปัญหาคือความตั้งใจ เลเยอร์ DAL และการคงอยู่จัดการกับโครงสร้างที่ค่อนข้างต่ำเช่นระเบียนตารางแถวและบล็อก พวกเขาไม่เห็น "ธุรกิจ" หรือวัตถุเลเยอร์ของแอปพลิเคชันหรือมีความเข้าใจอย่างถ่องแท้เกี่ยวกับวิธีการใช้งานในระดับที่สูงขึ้น เมื่อพวกเขาเห็นจำนวนหนึ่งแถวหรือหนึ่งโหลที่อ่านหรือเขียนไม่ชัดเจนว่าเป็นตัวแทนของพวกเขา "ขณะนี้บัญชี Jones ที่เรากำลังวิเคราะห์" ไม่ได้ดูแตกต่างจาก "ข้อมูลอ้างอิงอัตราภาษีพื้นฐานบางอย่างที่แอปต้องการเพียงครั้งเดียวและจะไม่อ้างอิงอีก" ในชั้นนี้ข้อมูลคือข้อมูลคือข้อมูล

การแคชที่ DAL / ชั้นความเสี่ยงยังคงมีข้อมูลอ้างอิงภาษี“ เย็น” อยู่ที่นั่นโดยไม่มีการครอบครองแคช 12.2MB และแทนที่ข้อมูลบัญชีบางส่วนที่ในความเป็นจริงจะใช้อย่างเข้มข้นในเวลาเพียงไม่กี่นาที แม้แต่ที่ดีที่สุดผู้จัดการแคชมีการซื้อขายที่มีความรู้ไม่เพียงพอของระดับที่สูงขึ้นโครงสร้างข้อมูลและการเชื่อมต่อและความเข้าใจน้อยเป็นสิ่งที่การดำเนินงานที่กำลังจะมาในเร็ว ๆ นี้เพื่อให้พวกเขาถอยกลับไปยังขั้นตอนวิธีการ guesstimation

ในทางตรงกันข้ามการแคชของแอพพลิเคชั่นหรือชั้นธุรกิจนั้นไม่ค่อยมีระเบียบ มันต้องมีการแทรกการดำเนินการจัดการแคชหรือคำแนะนำในช่วงกลางของตรรกะทางธุรกิจอื่น ๆ ซึ่งทำให้รหัสธุรกิจที่ซับซ้อนมากขึ้น แต่ข้อเสียคือ: มีความรู้เพิ่มเติมเกี่ยวกับวิธีการจัดโครงสร้างข้อมูลระดับมหภาคและการดำเนินงานที่กำลังจะเกิดขึ้นมันมีโอกาสที่ดีกว่าในการประมาณค่าแคช ("ผู้มีญาณทิพย์" หรือ "Bélády Min") ให้เหมาะสมที่สุด

การใส่ความรับผิดชอบในการจัดการแคชลงในรหัสธุรกิจ / แอพพลิเคชั่นนั้นสมเหตุสมผลหรือไม่นั้นเป็นการเรียกวิจารณญาณและจะแตกต่างกันไปตามแอพพลิเคชั่น ในหลาย ๆ กรณีในขณะที่ทราบว่าเลเยอร์ DAL / การคงอยู่จะไม่ได้รับ "สมบูรณ์แบบ" การแลกเปลี่ยนคือพวกเขาสามารถทำงานได้ค่อนข้างดีพวกเขาทำได้ในเชิงสถาปัตยกรรม "สะอาด" และทดสอบได้มากกว่า และการจับในระดับต่ำจะช่วยหลีกเลี่ยงการเพิ่มความซับซ้อนของรหัสธุรกิจ / แอพ

ความซับซ้อนที่ต่ำกว่าจะช่วยให้ความถูกต้องและความน่าเชื่อถือสูงขึ้นและใช้เวลาในการออกสู่ตลาดเร็วขึ้น ซึ่งมักถือว่าเป็นการค้าที่ยอดเยี่ยม - แคชที่สมบูรณ์แบบน้อยลง แต่มีคุณภาพดีกว่าและรหัสธุรกิจที่ตรงเวลามากขึ้น


ขอบคุณสำหรับการตอบกลับ. หลังจากอ่านคำตอบของคุณและของผู้อื่นฉันคิดว่าฉันไม่จำเป็นต้องแคชในเลเยอร์ธุรกิจ มันจะเพิ่มความซับซ้อนโดยรวมของผลิตภัณฑ์
เอ็มม่า

1
ปัญหาหนึ่งของโมเดล "เลเยอร์" คือกลไกการแคชที่มีประสิทธิภาพมักต้องใช้ข้อมูลที่ไม่มีในเลเยอร์เดียว อย่างไรก็ตามคุณคิดอย่างไรกับการที่ชั้นธุรกิจผ่าน "คำแนะนำ" ไปยังชั้นข้อมูลเกี่ยวกับ "แผน" โดยรวม ชั้นข้อมูลสามารถเพิกเฉยคำแนะนำดังกล่าวได้ในขั้นต้น แต่หากพบปัญหาคอขวดตรรกะบางอย่างที่สามารถเพิ่มซึ่งเมื่อได้รับคำแนะนำบางอย่างจะเปลี่ยนกลยุทธ์การแคชในลักษณะเฉพาะของธุรกิจ
supercat

1
จุดสุดยอด @supercat ฉันจะพูดถึงกลยุทธ์ที่มีนัย / pragma แต่คำตอบนั้นนานแล้ว แต่คุณพูดถูก เลเยอร์ธุรกิจบอกเป็นนัย ๆ ถึงเลเยอร์ที่ต่ำลงเกี่ยวกับวิธีจัดลำดับความสำคัญของแคชหรือ "อะไรที่ควรหมุด" เป็นวิธีที่ใช้กันทั่วไป / มีประโยชน์ในการรับแคชในระดับที่สูงขึ้นโดยไม่ต้องสร้างรหัสธุรกิจให้ทำได้ทั้งหมด ลำดับชั้น
Jonathan Eunice

@JanathanEunice: สิ่งที่ดีเกี่ยวกับคำใบ้คือรหัสไม่จำเป็นต้องทำอะไรมากกับพวกเขาในตอนแรก ระบบจำนวนมากมีปัญหาคอขวดอย่างเห็นได้ชัดบางอย่างที่ครอบงำประสิทธิภาพของพวกเขา แต่มันอาจเป็นเรื่องยากที่จะคาดเดาว่าระบบใดจะไม่ดีพอที่จะสำคัญ การเพิ่มตรรกะการแคชจำนวนเล็กน้อยในจุดวิกฤติไม่กี่จุดอาจดีกว่าการใช้ตรรกะแคชจำนวนมากในสถานที่ที่ไม่สำคัญ
supercat

1
เผง โดยเฉพาะอย่างยิ่งถ้าคุณมีแคชระดับต่ำ "ค่อนข้างดี" อยู่ที่ชั้นการคงอยู่ / การเข้าถึง คุณอาจต้องการข้อมูลการจัดลำดับความสำคัญเพิ่มเล็กน้อยจาก "ดีมาก" ถึง "ดีมาก"
Jonathan Eunice

15

การแคชกับ DAL นั้นตรงไปตรงมาและเรียบง่าย

DAL ของคุณเป็นชั้นการเข้าถึงข้อมูลส่วนกลางซึ่งหมายความว่าการเข้าถึงข้อมูลใด ๆ และทั้งหมดสามารถควบคุมผ่านชั้นเรียนที่นั่น เนื่องจากทั้งการอ่านและการคงอยู่ของเลเยอร์เหล่านั้นทำให้ง่ายต่อการล้างหรืออัปเดตรายการแคชเมื่อมีการเปลี่ยนแปลงเกิดขึ้น

การแคชในธุรกิจมีความยืดหยุ่น

การแคชในธุรกิจช่วยให้นักพัฒนามีความยืดหยุ่นในการพิจารณาว่าการใช้วัตถุอย่างเป็นรูปธรรมจะได้ประโยชน์จากการแคชหรือไม่ ขึ้นอยู่กับโครงสร้างของแอพพลิเคชั่นแบ็คเอนด์เซอร์วิสหรือกระบวนการอัตโนมัติอาจเปลี่ยนแปลงข้อมูลที่ถูกแคชไว้ในส่วนอื่น ๆ ด้วยการแคชในธุรกิจผู้พัฒนาสามารถกำหนดว่าวัตถุทางธุรกิจบางอย่างจะมีข้อมูลที่เป็นไปได้และประสิทธิภาพที่เพิ่มขึ้นหรือมีสถานะทางธุรกิจที่ทันสมัยที่สุดโดยเสียค่าใช้จ่ายด้านประสิทธิภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.