Đối với tất cả những điều sau đây giả định sau đây:tính toán thuộc tính hệ quả với một hệ thống xếp hàng
- ray v3.0
- ruby v1.9
- resque
Chúng tôi có 3 mô hình:
- Sản phẩm belongs_to: sku, belongs_to: loại
- Sku has_many: sản phẩm, belongs_to: loại
- Thể loại has_many: sản phẩm, has_many: dòng sản phẩm
Khi chúng tôi cập nhật các sản phẩm (giả sử chúng ta vô hiệu hóa nó) chúng ta cần phải có một số điều xảy ra với sku và thể loại có liên quan. Điều này cũng đúng cho khi sku được cập nhật.
thích hợp cách để đạt được điều này là có after_save
trên mỗi mô hình kích hoạt sự kiện cập nhật của các mô hình khác.
dụ:
products.each(&:disable!)
# after_save triggers self.sku.products_updated
# and self.category.products_updated (self is product)
Bây giờ nếu chúng ta có 5000 sản phẩm chúng tôi đang ở trong một điều trị. Các thể loại tương tự có thể nhận được cập nhật hàng trăm lần và hog cơ sở dữ liệu trong khi làm như vậy.
Chúng tôi cũng có một hệ thống xếp hàng đẹp, vì vậy cách thức cập nhật sản phẩm thực tế hơn sẽ là products.each(&:queue_disable!)
mà chỉ đơn giản là tung 5000 nhiệm vụ mới vào hàng đợi đang hoạt động. Tuy nhiên, vấn đề về cập nhật danh mục 5000 vẫn tồn tại.
Có cách nào để tránh tất cả các cập nhật đó trên db không?
Làm cách nào để có thể nối tất cả danh mục.products_updated cho từng danh mục trong hàng đợi?
Tại sao bạn phải cập nhật danh mục khi sản phẩm bị thay đổi? Nó là một truy cập một mức giá trung bình hoặc những gì? Nếu vậy, hãy bỏ bộ đệm truy cập và tính toán nó khi cần hoặc sử dụng http://redis.io/. –