Câu hỏi này là về thực hành tốt nhất trong kiến trúc.
Kiến trúc hiện tại của chúng tôi
Tôi có một lớp PHP truy cập MySQL cho thông tin người dùng. Hãy gọi nó là User
. User
được truy cập nhiều lần, vì vậy chúng tôi đã triển khai các lớp bộ nhớ đệm để giảm tải.
Lớp đầu tiên là cái mà chúng ta gọi là bộ đệm "theo yêu cầu". Sau khi dữ liệu được lấy từ MySQL, chúng tôi lưu trữ dữ liệu trong một thuộc tính riêng tư của User
. Mọi yêu cầu tiếp theo cho dữ liệu sẽ trả về thuộc tính thay vì yêu cầu lại dữ liệu từ MySQL.
Vì yêu cầu web tồn tại và chết trên cơ sở theo yêu cầu, bộ đệm này chỉ ngăn ứng dụng truy cập MySQL nhiều lần trong một yêu cầu.
Lớp thứ hai của chúng tôi là Memcached. Khi tài sản riêng trống, trước tiên chúng tôi kiểm tra Memcached cho dữ liệu. Nếu Memcached trống, chúng tôi truy vấn MySQL để lấy dữ liệu, cập nhật Memcached và cập nhật thuộc tính riêng tư của User
.
Câu hỏi
Ứng dụng của chúng tôi là một trò chơi và đôi khi bắt buộc phải cập nhật một số dữ liệu nhất có thể. Trong khoảng năm phút, yêu cầu đọc dữ liệu người dùng có thể xảy ra 10 hoặc 11 lần; sau đó một bản cập nhật có thể xảy ra. Các yêu cầu đọc tiếp theo cần phải được cập nhật hoặc cơ chế trò chơi thất bại.
Vì vậy, những gì chúng tôi đã làm là triển khai một đoạn mã được thực thi khi cập nhật cơ sở dữ liệu xảy ra. Mã này đặt khóa trong Memcached với dữ liệu được cập nhật, vì vậy tất cả các yêu cầu tiếp theo đối với Memcached đều được cập nhật.
Điều này có tối ưu không? Có bất kỳ mối quan tâm về hiệu suất hoặc "vấn đề" nào khác mà chúng ta nên biết khi cố gắng duy trì một loại "bộ đệm sống" như thế này không?