Tôi đang bắt đầu xây dựng một hệ thống thông báo kiểu Facebook cho trang của chúng tôi (loại trò chơi xã hội) và tôi hiện đang nghiên cứu cách tốt nhất để thiết kế hệ thống đó là gì. Tôi không quan tâm đến cách đẩy thông báo đến người dùng hoặc bất cứ điều gì tương tự (ngay cả bây giờ). Tôi đang nghiên cứu cách xây dựng hệ thống trên máy chủ (cách lưu trữ thông báo, nơi lưu trữ chúng, cách tìm nạp chúng, v.v ...).
Vì vậy, ... một số yêu cầu mà chúng tôi có:
- vào những lúc cao điểm, chúng tôi có khoảng 1k người dùng đăng nhập đồng thời (và nhiều khách nữa, nhưng họ không quan trọng ở đây vì họ sẽ không có thông báo) sẽ tạo ra nhiều sự kiện
- sẽ có nhiều loại thông báo khác nhau (người dùng A đã thêm bạn với tư cách bạn bè, người dùng B đã nhận xét về hồ sơ của bạn, người dùng C đã thích hình ảnh của bạn, người dùng D đã đánh bại bạn trên trò chơi X, ...)
- hầu hết các sự kiện sẽ tạo 1 thông báo cho 1 người dùng (người dùng X thích hình ảnh của bạn), nhưng sẽ có trường hợp một sự kiện sẽ tạo ra nhiều thông báo (ví dụ như sinh nhật của người dùng Y)
- thông báo nên được nhóm lại với nhau; ví dụ: bốn người dùng khác nhau thích một số hình ảnh, chủ sở hữu của hình ảnh đó sẽ nhận được một thông báo cho biết bốn người dùng đã thích hình ảnh đó chứ không phải bốn thông báo riêng biệt (giống như FB vậy)
OK, điều tôi nghĩ là tôi nên tạo ra một số hàng đợi nơi tôi sẽ lưu trữ các sự kiện khi chúng xảy ra. Sau đó, tôi sẽ có một công việc nền ( gearman ?) Sẽ xem xét hàng đợi đó và tạo thông báo dựa trên những sự kiện đó. Công việc này sau đó sẽ lưu trữ thông báo trong cơ sở dữ liệu cho mỗi người dùng (vì vậy nếu một sự kiện ảnh hưởng đến 10 người dùng, sẽ có 10 thông báo riêng biệt). Sau đó, khi người dùng mở một trang với danh sách các thông báo, tôi sẽ đọc tất cả các thông báo đó cho anh ta (chúng tôi nghĩ sẽ giới hạn 100 thông báo mới nhất này) và nhóm chúng lại với nhau và cuối cùng hiển thị chúng.
Những điều tôi quan tâm với phương pháp này:
- phức tạp như địa ngục :)
- là cơ sở dữ liệu lưu trữ tốt nhất ở đây (chúng tôi đang sử dụng MySQL) hoặc tôi nên sử dụng cái gì khác (redis có vẻ cũng phù hợp)
- Tôi nên lưu trữ những gì như một thông báo? ID người dùng, ID người dùng đã khởi tạo sự kiện, loại sự kiện (để tôi có thể nhóm chúng và hiển thị văn bản phù hợp) nhưng sau đó tôi không biết cách lưu trữ dữ liệu thực tế của thông báo (ví dụ: URL & tiêu đề của hình ảnh đã thích). Tôi chỉ nên "nướng" thông tin đó khi tôi tạo thông báo hoặc tôi nên lưu ID của bản ghi (hình ảnh, hồ sơ, ...) bị ảnh hưởng và kéo thông tin ra khỏi DB khi hiển thị thông báo.
- hiệu suất sẽ ổn ở đây, ngay cả khi tôi phải xử lý 100 thông báo nhanh chóng khi hiển thị trang thông báo
- vấn đề hiệu suất có thể xảy ra đối với mọi yêu cầu vì tôi sẽ phải hiển thị số lượng thông báo chưa đọc cho người dùng (đây có thể là sự cố do tôi sẽ nhóm các thông báo cùng nhau). Điều này có thể tránh được mặc dù nếu tôi tạo chế độ xem thông báo (nơi chúng được nhóm) ở chế độ nền và không hoạt động
Vì vậy, bạn nghĩ gì về giải pháp đề xuất của tôi và mối quan tâm của tôi? Hãy bình luận nếu bạn nghĩ tôi nên đề cập đến bất cứ điều gì khác có liên quan ở đây.
Ồ, chúng tôi đang sử dụng PHP cho trang của mình, nhưng đó không phải là một yếu tố lớn ở đây tôi nghĩ.