ฉันกำลังคิดถึงการอ่านและเขียนเป็นชุดในสภาพแวดล้อม RESTful และฉันคิดว่าฉันตระหนักว่าฉันมีคำถามที่กว้างขึ้นเกี่ยวกับการแคช HTTP (ด้านล่างฉันใช้เครื่องหมายจุลภาค (",") เพื่อคั่น ID เรกคอร์ดหลายรายการ แต่รายละเอียดนั้นไม่ได้เฉพาะเจาะจงสำหรับการสนทนา)
ฉันเริ่มต้นด้วยปัญหานี้:
1. Single GET
ใช้งานไม่ได้โดยการอัพเดตแบบแบตช์
GET /farms/123 # get info about Old MacDonald's Farm
PUT /farms/123,234,345 # update info on Old MacDonald's Farm and some others
GET /farms/123
เซิร์ฟเวอร์แคชที่อยู่ระหว่างไคลเอ็นต์และเซิร์ฟเวอร์ Farms ทราบได้อย่างไรว่าแคชของ /farms/123
เป็นโมฆะเมื่อเห็น PUT
จากนั้นฉันก็รู้ว่านี่ก็เป็นปัญหาเช่นกัน:
2. Batch GET
ใช้งานไม่ได้โดยการอัปเดตเดี่ยว (หรือแบทช์)
GET /farms/123,234,345 # get info about a few farms
PUT /farms/123 # update Old MacDonald's Farm
GET /farms/123,234,345
แคชรู้ได้อย่างไรว่าจะทำให้หลายฟาร์ม GET
เป็นโมฆะเมื่อเห็นว่า PUT ผ่านไป
ดังนั้นฉันจึงคิดว่าปัญหาจริงๆ อยู่ที่การดำเนินการแบบแบตช์เท่านั้น จากนั้นฉันก็ตระหนักว่าความสัมพันธ์ใดๆ ก็ตามอาจทำให้เกิดปัญหาคล้ายกันได้ สมมติว่าฟาร์มมีเจ้าของเป็นศูนย์หรือหนึ่งราย และเจ้าของสามารถมีฟาร์มเป็นศูนย์หรือหนึ่งรายได้
3. Single GET
ใช้งานไม่ได้โดยการอัปเดตเป็นบันทึกที่เกี่ยวข้อง
GET /farms/123 # get info about Old MacDonald's Farm
PUT /farmers/987 # Old MacDonald sells his farm and buys another one
GET /farms/123
แคชรู้ได้อย่างไรว่าจะทำให้ GET เดียวใช้ไม่ได้เมื่อเห็นว่า PUT ผ่านไป
แม้ว่าคุณจะเปลี่ยนโมเดลให้มี RESTful มากขึ้น แต่การใช้โมเดลความสัมพันธ์ คุณจะพบปัญหาเดียวกัน:
GET /farms/123 # get info about Old MacDonald's Farm
DELETE /farm_ownerships/456 # Old MacDonald sells his farm...
POST /farm_ownerships # and buys another one
GET /farms/123
ใน #3 ทั้งสองเวอร์ชัน GET แรกควรส่งคืนสิ่งที่ต้องการ (ใน JSON):
farm: {
id: 123,
name: "Shady Acres",
size: "60 acres",
farmer_id: 987
}
และ GET อันที่สองควรส่งคืนดังนี้:
farm: {
id: 123,
name: "Shady Acres",
size: "60 acres",
farmer_id: null
}
แต่มันทำไม่ได้! ไม่แม้ว่าคุณจะใช้ ETag
s อย่างเหมาะสมก็ตาม คุณไม่สามารถคาดหวังให้เซิร์ฟเวอร์แคชตรวจสอบเนื้อหาสำหรับ ETag
s -- เนื้อหาอาจถูกเข้ารหัสได้ และคุณไม่สามารถคาดหวังให้เซิร์ฟเวอร์แจ้งแคชว่าบันทึกควรใช้งานไม่ได้ - แคชไม่ได้ลงทะเบียนตัวเองกับเซิร์ฟเวอร์
มีส่วนหัวที่ฉันหายไปบ้างไหม? สิ่งที่ระบุแคชควรทำ HEAD
ก่อน GET
s ใด ๆ สำหรับทรัพยากรบางอย่าง ฉันคิดว่าฉันสามารถอยู่กับคำขอซ้ำซ้อนสำหรับทุกทรัพยากรได้ หากฉันสามารถบอกแคชได้ว่าทรัพยากรใดมีแนวโน้มที่จะได้รับการอัปเดตบ่อยครั้ง
แล้วปัญหาของแคชตัวหนึ่งที่ได้รับ PUT
และการรู้ว่าจะทำให้แคชนั้นใช้งานไม่ได้และอีกแคชหนึ่งไม่เห็นมันล่ะ
pathInfo
ดังนั้นจึงไม่มีปัญหา +++Invalidates-Other
เป็นสิ่งที่ฉันพยายามดิ้นรนเพื่อตั้งคำถามก่อนที่จะพบคำถามที่ยอดเยี่ยมของคุณ - person maaartinus   schedule 22.10.2016