Stackoverflow có một hệ thống huy hiệu tiện lợi. Một điều tôi nhận thấy là huy hiệu không được trao ngay lập tức, nhưng đôi khi dường như có một số loại chậm trễ sau khi tôi đáp ứng các tiêu chí. Tôi đã nhận thấy điều này trên một số trang web khác có huy hiệu.Tại sao các trang web như stackoverflow với phù hiệu sử dụng một số loại công việc bị trì hoãn để xác định khi nào nên trao một huy hiệu mới?
Có lẽ điều này là do họ đang sử dụng công việc bị trì hoãn quét theo định kỳ để xem có bất kỳ huy hiệu mới nào cần được trao tặng hay không. Tôi thấy cách tiếp cận này cũng được đề xuất ở đây:
How to implement badges?
Tuy nhiên, tôi không thực sự hiểu tại sao việc triển khai của tôi chỉ đơn giản là có hệ thống sau khi thực hiện một hành động có liên quan, ví dụ một bình luận mới được đăng, một hàm checkAwardBadge được gọi, sẽ kiểm tra xem người dùng có đáp ứng các tiêu chí cho một huy hiệu nhận xét mới hay không. Speedwise, tôi đã nghĩ rằng tất cả các thống kê người dùng có liên quan sẽ được lưu trữ trong Submodel của User, như UserStats để thay vì phải đếm số lượng bình luận mỗi lần, nó sẽ chỉ là một truy vấn đơn giản.
Điều đó khiến tôi thấy rằng hệ thống mà tôi ưa thích phải nhanh và dễ hiểu. Có những nhược điểm tôi đang thiếu ở đây về lý do tại sao nó cần thiết để làm phức tạp những thứ với công việc bị trì hoãn?
Để làm rõ: Tôi dự định có một lớp trừu tượng Thành tích, với mỗi Thành tựu thực tế là việc thực hiện Thành tích. Mỗi Thành tựu sẽ có chức năng checkAwardBadge, có thể được gọi từ bộ điều khiển hoặc thậm chí là công việc bị trì hoãn nếu tôi chọn chọn tuyến đường đó hoặc bất kỳ lúc nào để kiểm tra xem người dùng đã giành được một huy hiệu nào đó hay chưa. Vì vậy, mã thành tích tất cả sẽ được tập trung.
(1) và (2) hình phạt về hiệu suất sẽ rất nhỏ. Chỉ một truy vấn hàng đơn giản cho cơ sở dữ liệu, tiếp theo là một số logic đơn giản như (X> 30) (3) Bạn có thể giải thích tại sao điều này không quy mô (4) Thực ra nó sẽ như thế. Tôi dự định tạo ra một lớp Achivements, với mỗi Thành tựu một lớp con. Sau đó, tôi chỉ cần thêm một dòng vào mã bộ điều khiển trong hầu hết các trường hợp để thực hiện cuộc gọi đến checkAwardBadge trên huy hiệu có liên quan. –
(3) Ví dụ: Giả sử bạn có một hành động như xóa nhận xét, không kích hoạt bất kỳ Huy hiệu nào, nhưng sau đó bạn cần trao huy hiệu khi người dùng xóa nhận xét, bạn phải quay lại để tìm tất cả mã xóa một chú thích và thêm cuộc gọi vào checkAwardBadge. Hãy tưởng tượng nó trong các tình huống phức tạp hơn. –
Nó không mở rộng quy mô, bởi vì khi bạn có hơn 100.000 người dùng và 10.000.000 hành động, bạn phải tăng cơ sở dữ liệu sau mỗi hành động của mỗi người dùng để truy vấn. Thay vào đó, nếu bạn tải công việc xuống chuỗi công việc (chờ nó), thì điều đó có thể chạy trong nền và cập nhật định kỳ mọi huy hiệu của người dùng. Nó có thể được thông minh bởi, nói, quét chỉ các hoạt động được tạo ra kể từ khi chủ đề mới nhất chạy, vv – BryanH