2010-03-08 7 views
6

Trong một dự án di sản khá lớn, tôi đã tái cấu trúc một số mô-đun lông vào các lớp Moose. Mỗi mô-đun này yêu cầu quyền truy cập cơ sở dữ liệu vào (lười) lấy các thuộc tính của nó. Vì những đối tượng này được sử dụng khá nhiều, tôi muốn giảm số lượng yêu cầu thừa, ví dụ như cho dữ liệu không thay đổi.Làm cách nào để giảm số lượng yêu cầu thừa với mod_perl đúng cách?

Bây giờ, làm cách nào để thực hiện điều đó một cách chính xác? Tôi đã có một vài lựa chọn:

  1. Thực hiện bộ nhớ đệm trong các lớp Moose của tôi qua một vai trò lưu trữ chúng trong memcached với hết 5-10 phút (có lẽ không phải là quá khó khăn, nhưng khó khăn với các thuộc tính lười biếng) cập nhật: KiokuDB có thể có thể giúp đây, phải đọc lên về thuộc tính
  2. Di chuyển đến DBIx::Class (cần phải làm anyway) và thực hiện bộ nhớ đệm trên mức này (DBIC lẽ sẽ mất hầu hết các đau đi chỉ bằng cách riêng của mình)
  3. bằng cách nào đó làm cho các đối tượng của tôi vẫn tồn tại bên trong quá trình mod_perl (không có đầu mối làm thế nào để làm điều này :()

Bạn sẽ làm điều này như thế nào và bạn nghĩ gì một cách lành mạnh? Dữ liệu bộ nhớ đệm có được ưu tiên trên đối tượng hoặc cấp ORM không?

Trả lời

0

Vì dù sao bạn cũng sẽ làm DBIC, việc thay đổi này sẽ giải quyết vấn đề. Nó sẽ làm cho ít ý nghĩa hơn để cuộn của riêng bạn và sau đó thực hiện DBIC, cho người bảo trì của bạn tạm dừng khi họ phát hiện ra rằng bạn đang sử dụng DBIC nhưng với bộ nhớ đệm trong nhà ... "vì một lý do nào đó."

Lý do duy nhất không làm điều này là (1) nếu bạn thực sự cần hiệu suất đó ngay bây giờ và bạn không có thời gian chờ đợi những thay đổi DBIC, vì tôi cho rằng sẽ khá rộng rãi. Hoặc (2), nếu bạn không chắc chắn về việc liệu bạn có thực sự chuyển sang DBIC hay không. Nếu bạn chưa điều tra nó và bạn đang làm rất nhiều SQL tùy chỉnh thay vì CRUD cơ bản, nó có thể kết thúc là một lợi tức đầu tư rất nhỏ.

1

Câu trả lời ngắn cho # 3 là: Không sử dụng 'của tôi'. Bạn có thể làm điều gì đó như:

use vars qw($object); 
# OR post perl5.6: 
# our ($object); 

# create your object if it doesn't already exist 
$object ||= create_object; 

# Maybe reload some attributes if they have expired. 
$object->check_expires; 

Các đối tượng được tạo ra bên trong trình xử lý của bạn sẽ chỉ được chia sẻ bên trong mỗi con Apache, nếu bạn tải lại dữ liệu sau mỗi 5-10 phút. Bất kỳ mô-đun và đối tượng nào chỉ đọc sẽ được tải trong tập lệnh PerlPostConfigRequire để chúng sẽ được chia sẻ trên tất cả các trẻ em.