Hệ thống thông báo mạng xã hội


10

Lý lịch

Tôi đang làm việc trên một ứng dụng cho một khách hàng bao gồm một số tính năng mạng xã hội. Ban đầu tôi đã phát triển front-end di động, nhưng hoàn cảnh cũng khiến tôi phụ trách phát triển back end.

Là một nền tảng chung, hệ thống của chúng tôi cho phép người dùng theo dõi những người dùng khác và nhận thông báo về những người họ đang theo dõi, như bạn mong đợi từ một mạng xã hội. Một cảnh báo là chỉ có một tập hợp con nhỏ (nhiều nhất là vài trăm) người dùng sẽ được theo dõi, với mong muốn rằng hầu hết các cơ sở người dùng sẽ theo dõi ít ​​nhất một trong số những cá nhân này.

Về phía UI, chúng tôi sẽ có một nút thông báo với một số trên đó và nhấp vào nút sẽ đưa bạn đến màn hình thông báo.

Vấn đề

Tôi đã nghiên cứu các chiến lược để thực hiện thông báo và hầu hết các tài nguyên mà tôi đã tìm thấy để tạo một hoặc nhiều bảng thông báo trong cơ sở dữ liệu. (Một ví dụ tôi thích là câu trả lời được chấp nhận ở đây: /programming/9735578/building-a-notification-system ).

Điều khiến tôi thất vọng là hầu hết các chiến lược dựa trên cơ sở dữ liệu cho các thông báo đều yêu cầu chèn một hàng cho mỗi thông báo cho mỗi người theo dõi. Vì vậy, nếu một nghìn người đang theo dõi Sally, chúng tôi sẽ chèn một nghìn hàng vào bảng tương ứng. Là khả năng mở rộng? Điều gì xảy ra nếu chúng ta đến điểm mà hàng chục hoặc hàng trăm ngàn người dùng đang theo dõi Sally và cô ấy đang tạo ra vài chục bài đăng mỗi ngày?

Ý tưởng ban đầu của tôi là xử lý mọi thứ bằng các truy vấn: số trên nút thông báo sẽ có được bằng cách yêu cầu số hàng trên nội dung được đăng gần đây hơn lần trước bạn truy cập màn hình thông báo, trong khi thông báo riêng lẻ sẽ được tạo từ các truy vấn chi tiết hơn khi bạn truy cập màn hình thông báo. Cách tiếp cận này sẽ không yêu cầu ghi hoặc lưu trữ thêm, nhưng không linh hoạt và có thể sẽ làm hỏng máy chủ khá khó khăn.

THIẾT LẬP

Phần cuối (được thiết lập bởi nhà phát triển trước) sử dụng CodeIgniter sở dữ liệu MySQL . Nó hiện đang chạy trên một tài khoản lưu trữ chia sẻ GoDaddy xảo quyệt, nhưng tôi cho rằng (hy vọng?) Điều này sẽ được nâng cấp trước khi chúng tôi đi vào sản xuất và gói lưu trữ sẽ được tăng quy mô với sự tăng trưởng của người dùng.

Hiện tại mặt trước duy nhất của chúng tôi là một ứng dụng di động, nhưng chúng tôi cũng có kế hoạch xây dựng một trang web sau này. Tôi không quan tâm tại thời điểm này với việc nhận được các bản cập nhật đẩy thời gian thực từ máy chủ về các thông báo.

ĐỊA CHỈ

Tôi không chuyên về phụ trợ và tôi ở trên đầu trong bộ phận đó. Khách hàng biết điều đó và tôi đã cố gắng hết sức để giải thích phạm vi của một dự án có tính chất này, nhưng họ đã nói rõ rằng tại thời điểm này, họ sẽ không tin tưởng bất kỳ ai khác làm việc trong dự án. Chúng tôi có thể có một tháng làm việc nữa trước khi chúng tôi có thể bắt đầu thêm người kiểm tra và tôi có thể nhận được bất kỳ loại số liệu hiệu suất nào. Tôi thực sự không thể ước tính có bao nhiêu người dùng chúng tôi có thể có hoặc phần cứng nào chúng tôi có thể có trong 5 năm tới, nhưng tôi nghĩ rằng khách hàng đang hy vọng cho hàng trăm ngàn người dùng trở lên.

Tôi hy vọng điều này đủ cụ thể về một vấn đề sẽ được đăng ở đây; Tôi có thể tinh chỉnh nó nếu cần. Vui lòng hỏi nếu bạn có bất kỳ câu hỏi hoặc tôi đã bỏ qua các chi tiết quan trọng.

tl; dr

  • Hệ thống thông báo dựa trên cơ sở dữ liệu có tác động tiêu cực đến khả năng mở rộng dài hạn khi tất cả người dùng chỉ theo dõi một vài trong số vài trăm người không?
  • Có cách nào để làm cho cơ sở dữ liệu thông báo được điều khiển mà không cần một hàng thông báo riêng cho mỗi thông báo cho mỗi người theo dõi không?
  • Một hệ thống thông báo hoàn toàn dựa trên truy vấn sẽ có thể mở rộng hoặc có bất kỳ lợi thế nào ngoài việc không ghi bất kỳ dữ liệu nào vào DB?
  • Tôi có lật đổ điều này quá sớm không? Tôi có nên xây dựng một cái gì đó hoạt động được không và chúng tôi có thể lo lắng về việc tối ưu hóa nó nếu nó trở thành một vấn đề, do khách hàng có ngân sách hạn chế và chúng tôi chưa biết liệu sản phẩm cuối cùng có phổ biến không?

Bạn có thể hết hạn thông báo? Ví dụ, xóa bất cứ thứ gì hơn 2 tuần tuổi. Điều đó sẽ ít nhiều cân bằng kích thước của bảng được sử dụng khi đáo hạn trang web.
GrandmasterB

Đó sẽ không phải là vấn đề, tôi quan tâm nhiều hơn đến ý nghĩa hiệu suất của việc khóa cơ sở dữ liệu ghi 50.000 mục vào bảng thông báo mỗi khi người dùng phổ biến tạo bài đăng.
user45623

Tôi đã làm việc trong một dự án với một hệ thống thông báo tương tự (nhưng nhỏ hơn). Tôi đã có một quá trình nền nhìn vào hàng đợi các bài đăng mới và xử lý các thông báo (trong trường hợp này thực sự là chèn một email vào hàng đợi thứ hai để gửi). Đó không phải là thời gian thực, nhưng nó thường xử lý mọi thứ trong vòng vài phút.
GrandmasterB

Câu trả lời:


10

Vì vậy, nếu một nghìn người đang theo dõi Sally, chúng tôi sẽ chèn một nghìn hàng vào bảng tương ứng. Là khả năng mở rộng?

Có, miễn là các bảng cơ sở dữ liệu được lập chỉ mục đúng.

Điều gì xảy ra nếu chúng ta đến điểm mà hàng chục hoặc hàng trăm ngàn người dùng đang theo dõi Sally và cô ấy đang tạo ra vài chục bài đăng mỗi ngày?

Bạn sẽ tạo ra vài chục hoặc hàng trăm ngàn bản ghi thông báo mỗi ngày cho Sally, giả sử bạn muốn theo dõi mọi thông báo liên tục. Tỷ lệ người dùng như Sally với loại lưu lượng truy cập đó luôn rất nhỏ.

Ý tưởng ban đầu của tôi là xử lý mọi thứ bằng các truy vấn: số trên nút thông báo sẽ có được bằng cách yêu cầu số hàng trên nội dung được đăng gần đây hơn lần trước bạn truy cập màn hình thông báo, trong khi thông báo riêng lẻ sẽ được tạo từ các truy vấn chi tiết hơn khi bạn truy cập màn hình thông báo.

Điều này có vẻ phức tạp không cần thiết. Nếu bạn cần số liệu thống kê chi tiết về thông báo, chỉ cần lưu trữ thông báo.

Hệ thống thông báo dựa trên cơ sở dữ liệu có tác động tiêu cực đến khả năng mở rộng dài hạn khi tất cả người dùng chỉ theo dõi một vài trong số vài trăm người không?

Đó là lý do tại sao nó hoạt động ... một số ít người luôn tạo ra phần lớn lưu lượng.

Có cách nào để làm cho cơ sở dữ liệu thông báo được điều khiển mà không cần một hàng thông báo riêng cho mỗi thông báo cho mỗi người theo dõi không?

Có ... Đừng lưu trữ các thông báo; chỉ cần gửi email thông báo, theo kiểu cháy và quên. Hoặc, lưu trữ các thông báo trong một khoảng thời gian nhất định, sau đó loại bỏ chúng. Hoặc, loại bỏ từng thông báo sau khi nó đã được đọc.

Một hệ thống thông báo hoàn toàn dựa trên truy vấn sẽ có thể mở rộng hoặc có bất kỳ lợi thế nào ngoài việc không ghi bất kỳ dữ liệu nào vào DB?

Tôi không chắc ý của bạn là gì Nếu bạn muốn truy vấn thông báo, bạn phải lưu trữ chúng trong cơ sở dữ liệu. Nếu không, không có gì để truy vấn.

Tôi có lật đổ điều này quá sớm không?

Nói chuyện với ai đó có thể giúp bạn thiết kế một cơ sở dữ liệu được lập chỉ mục, chuẩn hóa đúng với các bảng chính xác trong đó. Tôi thấy không có lý do tại sao một cơ sở dữ liệu như vậy không thể xử lý hiệu quả các kịch bản bạn mô tả.

Một ví dụ thực tế

Theo như tôi biết, Stack Exchange lưu trữ mọi thứ liên tục , bao gồm tất cả các thông báo. Họ sử dụng công nghệ cơ sở dữ liệu tương tự MySql và một số công nghệ lưu trữ. Mặc dù phần cứng và không gian lưu trữ của họ là đáng kể, nhưng lưu lượng truy cập họ nhận được là một vấn đề tốt.


Wow, bạn đã giải quyết mọi thứ của friggin! Cảm ơn, Robert! Cơ sở dữ liệu được chuẩn hóa nhưng tôi chưa xem xét lập chỉ mục. Thật không may, tôi không thể "nói chuyện với ai đó có thể giúp tôi", vì các điều khoản rất nghiêm ngặt mà tôi không thể thảo luận chi tiết cụ thể về dự án với bất kỳ ai và khách hàng đã nhận ra rằng họ sẽ không tin bất cứ ai nhưng tôi trong dự án ... Chà, tôi sẽ có thể thực hiện một số nghiên cứu về lập chỉ mục. Cảm ơn!
user45623

1
Quy tắc chung về lập chỉ mục: mọi Khóa ngoài phải được lập chỉ mục với các bản sao có thể. Mỗi khóa chính phải được lập chỉ mục. Các trường mà bạn sẽ cần tìm kiếm hoặc áp dụng mệnh đề WHERE sẽ được lập chỉ mục; những cái đó nên ít
Robert Harvey

1
Điều này là không chính xác. Điều này KHÔNG thể mở rộng. Đối với mỗi "Sally" bạn đang tạo N hàng trong đó N là số người dùng của bạn. Điều này sẽ trở thành một vấn đề nhanh nếu bạn có bất kỳ số lượng người dùng hợp lý. 100 "Sallys" đăng 10 lần lên 10.000 người dùng là 10 triệu hàng mỗi ngày - nghe có vẻ không tốt lắm nhỉ? Những gì bạn thực sự muốn làm là đảo ngược điều này và tạo một hàng cho mỗi bài đăng "Sally" và có tất cả người dùng theo dõi Sally lấy những thứ này thay vì bản sao cá nhân của họ. Tất nhiên điều này sẽ gây ra vấn đề nếu bạn cần logic cụ thể của người dùng (ví dụ: tổng hợp) ...
Ben

1
... Giải thích "tránh một hàng trên mỗi bài đăng" ở đây rõ ràng là một người rơm vì hầu hết các hệ thống sẽ yêu cầu các bài đăng này bám xung quanh. Ngoài ra, bạn không tránh các truy vấn "vì chúng phức tạp", bạn tránh chúng vì chúng sẽ gây ra chi phí không bền vững khi hệ thống mở rộng.
Ben
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.