Understanding AEM Dispatcher caching mechanics, stat files, and cache invalidation flush agents in AEM 6.5.
AEM Dispatcher, Cache và Flush Cache trong AEM 6.5 On-Premise
1. Dispatcher là gì?
Dispatcher là module của Adobe chạy trên web server như Apache HTTP Server hoặc IIS. Trong AEM 6.5 on-premise, Dispatcher thường nằm giữa CDN/load balancer và Publish instance.
Dispatcher có hai nhiệm vụ chính:
- Caching: lưu response tĩnh từ Publish xuống filesystem để giảm tải cho AEM.
- Load balancing / filtering: phân phối request đến nhiều Publish và chặn request không hợp lệ bằng
/filterrules.
Trong AMS/on-premise, phần lớn issue liên quan đến Dispatcher không nằm ở code Java mà nằm ở sự phối hợp giữa:
- AEM replication từ Author sang Publish.
- Flush agent từ Author hoặc Publish sang Dispatcher.
- Dispatcher cache rules trong
dispatcher.any. - Apache rewrite/filter/header rules.
- CDN cache nếu có layer phía trước Dispatcher.
2. Luồng request khi có cache
2.1 Cache hit
Khi file đã tồn tại trong cache và còn hợp lệ, Dispatcher trả trực tiếp từ filesystem.
2.2 Cache miss
Khi chưa có cache hoặc cache đã stale, Dispatcher gọi Publish, nhận response rồi ghi xuống cache nếu response đủ điều kiện cache.
Một response thường không được cache nếu rơi vào các trường hợp sau:
- HTTP method không phải GET/HEAD: ví dụ
POST,PUT,DELETE. - URL có query string: mặc định Dispatcher không cache request có
?param=value, trừ khi cấu hình/ignoreUrlParamsphù hợp. - Response có header chống cache: ví dụ
Cache-Control: no-cache,no-store,private. - Path không match
/rulestrong/cache. - Request bị chặn bởi
/filter. - Response status không phù hợp: ví dụ
500,403, tùy cấu hình có thể không cache hoặc bị cache sai nếu rule không chặt.
3. Dispatcher cache lưu ở đâu?
Dispatcher lưu cache dưới dạng file thật trên filesystem của web server.
Ví dụ request:
Có thể được lưu thành:
Asset DAM:
Có thể được lưu thành:
Cấu hình liên quan trong dispatcher.any:
Các section quan trọng:
4. .stat file và cơ chế invalidation
Dispatcher không nhất thiết xóa toàn bộ file cache mỗi lần flush. Với HTML, cơ chế phổ biến là chạm vào .stat file để đánh dấu cache cũ là stale.
Khi có flush cho /content/wknd/us/en, Dispatcher cập nhật timestamp của .stat file ở cấp tương ứng. Request tiếp theo so sánh timestamp của file cache với .stat file:
- Cache file mới hơn
.stat: cache còn hợp lệ. - Cache file cũ hơn
.stat: cache stale, Dispatcher gọi Publish để lấy bản mới.
4.1 statfileslevel
/statfileslevel quyết định Dispatcher tạo .stat file sâu tới mức nào.
Ví dụ:
Với path /content/wknd/us/en.html, Dispatcher có thể xét .stat ở các cấp đầu như:
Ý nghĩa vận hành:
- Level thấp: flush rộng hơn, ít stale content hơn nhưng cache bị invalidate nhiều hơn.
- Level cao: flush hẹp hơn, giữ cache tốt hơn nhưng dễ stale nếu cấu hình flush không chính xác.
Khuyến nghị thực tế:
- Với site nhỏ hoặc ít traffic:
statfileslevelthấp dễ vận hành hơn. - Với nhiều site/multitenant: cần cân bằng để tránh flush một site làm mất cache của site khác.
- Không thay đổi
statfilesleveltrên production nếu chưa test impact cache hit ratio.
5. Flush cache hoạt động như thế nào?
Flush cache là quá trình gửi request đặc biệt đến Dispatcher để invalidate cache khi content thay đổi.
Có hai mô hình phổ biến:
- Author flush agent: Author activate content và gửi flush request đến Dispatcher.
- Publish flush agent: Publish nhận replication rồi tự gửi flush đến Dispatcher gần nó.
Trong AEM 6.5 on-premise, mô hình được chọn phụ thuộc kiến trúc mạng và tiêu chuẩn vận hành. Với nhiều môi trường AMS, flush từ Author đến Dispatcher hoặc từ Publish đến Dispatcher đều có thể gặp; cần kiểm tra thực tế trong /etc/replication/agents.author và /etc/replication/agents.publish.
5.1 Luồng activate + flush
5.2 Flush request headers
Flush agent thường gửi request đến endpoint:
Headers quan trọng:
Ví dụ test thủ công từ server được allow:
Nếu test từ máy cá nhân, request có thể bị chặn bởi /allowedClients, firewall hoặc network ACL. Khi debug production, nên test từ Author/Publish host hoặc jumpbox được phép.
6. Khác nhau giữa delete cache và invalidate cache
Dispatcher có hai kiểu xử lý chính:
Điểm dễ nhầm:
- Flush thành công không có nghĩa file
.htmlbiến mất khỏi cache folder. - File vẫn còn trên disk nhưng bị xem là stale nếu timestamp cũ hơn
.stat. - Người mới debug thường kiểm tra thấy file còn tồn tại rồi kết luận flush fail; kết luận này chưa chắc đúng.
Cách kiểm tra đúng:
So sánh Modify timestamp của file cache và .stat liên quan.
7. Các issue thường gặp liên quan đến Dispatcher cache
7.1 User thấy content cũ sau khi activate
Triệu chứng
- Author đã activate page thành công.
- Publish mở trực tiếp thấy content mới.
- Qua Dispatcher/CDN vẫn thấy content cũ.
Nguyên nhân thường gặp
Flow debug nhanh
7.2 Một page mới activate nhưng Dispatcher trả 404
Triệu chứng
- Page mới tạo đã activate.
- Publish direct trả 200.
- Dispatcher trả 404 hoặc vẫn trả 404 cũ.
Nguyên nhân thường gặp
- 404 bị cache: Dispatcher hoặc CDN cache response 404.
- Parent path chưa được invalidate: listing/navigation/header cache vẫn cũ.
- Rewrite rule sai: extensionless URL map sai sang path không tồn tại.
- Filter rule chặn path mới:
/filterchưa allow URL pattern. - Permission trên Publish: anonymous không đọc được path mới.
Checklist
- Gọi trực tiếp Publish bằng cùng Host header nếu có virtual host mapping.
- Kiểm tra Dispatcher access/error log cho status thật.
- Kiểm tra file cache có tồn tại dạng 404 hay không.
- Purge path cụ thể và parent navigation page.
- Kiểm tra
/filtervà Apache rewrite. - Kiểm tra ACL anonymous trên Publish.
7.3 Asset đã update nhưng browser vẫn thấy ảnh cũ
Nguyên nhân thường gặp
- DAM asset binary được cache ở Dispatcher hoặc CDN.
- Browser cache còn giữ asset do
Cache-Control: max-agedài. - Asset URL không đổi sau khi replace binary.
- Rendition cache chưa được clear.
- Flush chỉ invalidate page HTML, không invalidate DAM path.
Hướng xử lý
- Dùng versioned URL hoặc fingerprint nếu asset thuộc clientlib/build artifact.
- Với DAM asset authored, đảm bảo activation/flush cover
/content/dam/.... - Kiểm tra CDN TTL và purge DAM path.
- Kiểm tra response headers:
Các header cần chú ý:
7.4 Cache miss quá nhiều, Publish bị tải cao
Triệu chứng
- Dispatcher hit ratio thấp.
- Publish CPU/thread tăng cao.
- Access log có nhiều request đi vào Publish.
Nguyên nhân thường gặp
/ignoreUrlParams
Ví dụ chỉ bỏ qua tracking params an toàn:
Không nên allow toàn bộ query params nếu site có search, filter, pagination hoặc API trả response khác nhau theo query.
7.5 Personalized content bị cache nhầm
Triệu chứng
- User A thấy thông tin của User B.
- Header/login state bị sai.
- Component phụ thuộc cookie/session nhưng HTML page bị cache.
Nguyên nhân
Page HTML có dynamic component nhưng vẫn được cache như static page.
Hướng xử lý
- Tách dynamic fragment bằng Sling Dynamic Include (SDI).
- Set
Dispatcher: no-cachecho response thực sự không được cache. - Đảm bảo auth pages không match cache allow rules.
- Không render thông tin user-specific trực tiếp vào page cacheable.
8. Flush agent configuration checklist
Trong AEM 6.5, kiểm tra flush agent tại:
Checklist cấu hình:
Log cần xem:
Trên Dispatcher/web server:
9. Dispatcher logs và cách đọc
Dispatcher log là nguồn quan trọng nhất khi xử lý cache issue.
Các pattern cần tìm:
Khi debug, cần phân biệt:
Nếu không có Dispatcher log chi tiết, tăng log level tạm thời trong maintenance window. Không bật debug quá lâu trên production vì log có thể tăng rất nhanh.
10. Quy trình debug production an toàn
Bước 1: Xác định layer trả content cũ
Test theo thứ tự:
Dùng curl -I để xem header:
Nếu có thể, bypass CDN bằng host mapping nội bộ:
Bước 2: So sánh response headers
Header nên kiểm tra:
Bước 3: Kiểm tra replication và flush
- Page activation có success không?
- Publish direct đã có content mới chưa?
- Flush agent queue có stuck không?
- Dispatcher access log có nhận request
/dispatcher/invalidate.cachekhông? - Status của flush request là
200,403,404hay500?
Bước 4: Kiểm tra cache filesystem
So sánh timestamp:
Bước 5: Xác định có CDN/browser cache không
Nếu Dispatcher direct đã đúng nhưng public URL vẫn sai, issue nằm ở CDN hoặc browser cache.
Hướng xử lý:
- Purge CDN path.
- Giảm TTL cho HTML.
- Đảm bảo HTML không bị cache quá lâu ở browser.
- Dùng cache-busting cho static assets.
11. Cấu hình khuyến nghị cho AEM 6.5 on-premise
11.1 Chỉ cache content an toàn
Không cache các endpoint động:
11.2 Chặn query params không rõ mục đích
Chỉ ignore tracking params đã biết. Không ignore q, search, page, sort, filter nếu response thay đổi theo chúng.
11.3 Không cache authenticated response
Nếu request có login token hoặc session cookie, cần bypass cache theo thiết kế.
Các cookie cần chú ý trong AEM:
11.4 Flush đủ các Dispatcher node
Với topology nhiều Dispatcher:
Nếu chỉ flush một node, user đi qua load balancer có thể lúc thấy content mới, lúc thấy content cũ.
12. Runbook xử lý sự cố thường gặp
Case A: Activate xong vẫn thấy content cũ
- Mở Publish direct để xác nhận content đã replicate.
- Kiểm tra replication queue.
- Kiểm tra flush agent queue.
- Tìm request
/dispatcher/invalidate.cachetrong Apache access log. - Nếu không có request: issue nằm ở AEM flush agent/network.
- Nếu có
403: kiểm tra/allowedClientshoặc auth. - Nếu có
200: kiểm tra.stattimestamp vàstatfileslevel. - Nếu Dispatcher direct đúng nhưng public URL sai: purge CDN.
Case B: Một số user thấy đúng, một số user thấy sai
- Kiểm tra có nhiều Dispatcher/CDN edge không.
- So sánh response header
Age,Via,X-Cache. - Test từng Dispatcher node nếu có thể.
- Purge tất cả cache layer liên quan.
- Kiểm tra load balancer sticky route hoặc origin routing.
Case C: Flush làm site chậm sau mỗi publish
- Xem flush path có quá rộng không.
- Kiểm tra
statfileslevel. - Kiểm tra content activation có trigger nhiều flush liên tục không.
- Giới hạn batch activation hoặc schedule publish ngoài peak hour.
- Tối ưu cache rule để asset/clientlibs không bị invalidate không cần thiết.
Case D: Page có query params không cache được
- Xác định query param có ảnh hưởng response không.
- Nếu chỉ tracking: thêm vào
/ignoreUrlParamsallow list. - Nếu ảnh hưởng response: không ignore, hoặc thiết kế URL/path cacheable hơn.
- Kiểm tra CDN có normalize query params không.
13. Checklist trước khi thay đổi Dispatcher config
Trước khi deploy thay đổi Dispatcher config production:
- Backup config hiện tại.
- Validate syntax Dispatcher/Apache.
- Test trên lower environment có topology gần production.
- Test các nhóm URL: HTML, DAM, clientlibs, JSON model, servlet, vanity URL.
- Test activate + flush.
- Test rollback plan.
- Theo dõi hit ratio, Publish CPU, 4xx/5xx sau deploy.
Các command thường dùng trên Apache HTTPD:
Với Dispatcher SDK hoặc containerized setup, dùng command validate tương ứng theo chuẩn project.
14. Mental model cho AMS engineer
Khi gặp issue cache, luôn hỏi theo thứ tự:
- Content đã đến Publish chưa? Nếu chưa, đó là replication issue.
- Dispatcher đã nhận flush chưa? Nếu chưa, đó là flush agent/network issue.
- Flush có làm cache stale đúng path không? Nếu chưa, đó là invalidate/statfileslevel issue.
- Request tiếp theo có đi qua Dispatcher cache không? Nếu không, đó là cacheability/rules/header issue.
- Có layer nào phía trước Dispatcher còn cache không? Nếu có, đó là CDN/browser cache issue.