2009-08-22 38 views
35

Tôi đang làm việc trên một trang web sẽ sử dụng các tính năng của mạng xã hội (như facebook chẳng hạn).Mẫu thiết kế: hệ thống thông báo

Tôi muốn triển khai hệ thống thông báo hiển thị nội dung như "X đã thêm bạn làm bạn", "Y mời bạn tham dự", "Z đã thực hiện câu đố mới nhất" ... và tôi không biết cách làm.

Tôi tự hỏi là những gì các giải pháp tốt nhất:

  • Giải pháp 1, hay còn gọi là "khai thác gỗ".

Bảng "thông báo" chuyên dụng. Tôi thêm hàng trong bảng này mọi thứ làm tăng một thông báo happend (bạn thêm, quizz trả lời, vv). Bảng "thông báo" có các trường có chứa thông tin khác nhau, theo loại thông báo nào được thêm vào bảng.

Tốt: dễ dàng mã, tách biệt giữa tính năng thông báo và tính năng "bình thường", không quá nhiều tài nguyên khi tôi cần đọc bảng.

Bad: Bảng thông báo sẽ phát triển rất lớn (tôi nghĩ tôi sẽ thêm 10k hàng/ngày trong bảng), thông tin "trùng lặp": thông tin trong bảng thông báo có thể tìm thấy trong tất cả các bảng khác sử dụng ngày/danh sách/so sánh bất kỳ.

  • Giải pháp 2, còn gọi là "tìm khắp mọi nơi".

Mỗi lần tôi cần hiển thị danh sách thông báo hoặc hiển thị có bao nhiêu thông báo mới, tôi nhìn vào tất cả các bảng có liên quan, so sánh ngày/v.v để biết điều gì mới xảy ra kể từ lần cuối cùng người dùng kiểm tra thông báo.

Tốt: Không phải bảng quá lớn so với giải pháp 1, không có "dự phòng" của thông tin.

Bad: Tôi sợ vì số lượng người dùng (~ 1k +), nó làm cho máy chủ phát nổ vì nó là tài nguyên/tốn thời gian, khó mã hóa/duy trì.

Bạn có thể cho tôi biết suy nghĩ của bạn tốt hơn và lý do tại sao hay bạn có giải pháp mà tôi không tưởng tượng được không?

Cảm ơn =)


Edit: Hãy nói rằng tôi sử dụng một thiết kế DB thực sự cơ bản: Người dùng có bạn bè, có thể làm trắc nghiệm nào. 1 bảng cho danh sách người dùng, danh sách câu hỏi, 1 bảng câu đố < -> quan hệ người dùng, 1 người dùng bảng < -> người dùng cho tình bạn. Mỗi khi người dùng truy cập tiểu sử của riêng mình, anh ấy có thể xem điều gì đã xảy ra: câu đố mới < -> quan hệ người dùng, người dùng mới < -> quan hệ người dùng, v.v. Bạn sẽ thiết kế thông báo như thế nào?

Trả lời

20

Tạo hàng đợi hệ thống, mỗi thư được thêm vào hàng đợi này có danh sách "người tiêu dùng" và nội dung. Máy bơm thông điệp chính xử lý từng thông điệp và gửi thông điệp đến tất cả người tiêu dùng.

Cho phép nói 2 người kết bạn với nhau. Bạn thêm một thông điệp vào hàng đợi hệ thống chính là A là bạn với B và người tiêu dùng đều là A và B. Khi thông điệp "pump" (bộ xử lý) của bạn thấy thông điệp này, nó thêm nó vào hàng đợi của A và hàng đợi của B. bây giờ người dùng A và người dùng B có một thông điệp mới rằng họ là bạn bè. Đổi lại, mỗi người dùng có một bộ xử lý tin nhắn, vì vậy khi nó nhìn thấy một thông báo gọi là "Tôi là bạn với [ai đó]", nó xử lý việc này như thêm một mục mới vào "bức tường" hiển thị cho bạn bè của A "A là bạn với B ", vv.

Điều này quá đơn giản nhưng hy vọng cho thấy hàng đợi thông báo có thể được sử dụng như thế nào (hệ thống rất giống được sử dụng làm khung cửa sổ giao diện người dùng), do đó đã có ví dụ hiện tại và có rất nhiều hàng đợi tin nhắn được đồng bộ hóa các mẫu bạn có thể sử dụng.

Phần còn lại phụ thuộc vào bạn thiết kế.

+0

Đó là giải pháp tôi thích. Nhưng tôi tự hỏi liệu bảng "xếp hàng" có chứa thông báo của mọi người sẽ không quá lớn sau một thời gian? Hãy nói rằng tôi có 2k người dùng, có 5 thông báo/ngày (đó là khoảng những gì sẽ happend), đó là 10k/ngày hàng mới trong bảng này. Bạn nghĩ sao ? –

+1

Bạn có thể có hàng đợi "đại lý miễn phí", được gán cho người dùng có thư đang chờ xử lý và sau khi tất cả thư bị mất, hàng đợi có thể đi vào hàng đợi miễn phí để người dùng khác sử dụng. Điều này cũng có thể kiểm soát tốc độ bạn tạo bản cập nhật, hồ bơi hạn chế hữu ích và giám sát thông báo trung bình trên mỗi hàng đợi hoặc thư trong hàng chờ đợi có thể cho bạn biết khi nào bạn cần mở rộng hệ thống theo chiều ngang. – AlexC

+1

Mm, bạn có thể giải thích nó một cách chính xác. Giữa nhanh mà tôi không phải người Mỹ cũng không phải tiếng Anh, và thực tế là tôi hút vào dev (^^), tôi đã không bắt được tất cả những gì bạn nói. thanks =) –

14

Thực sự điều này nằm dưới làm cách nào để thiết kế xe hơi? loại danh mục câu hỏi ...

Việc triển khai phụ thuộc vào thiết kế, nơi nó sẽ đi vào tương lai và môi trường bạn sẽ thực hiện. Bạn có thể chọn triển khai thực hiện twitter, hệ thống cơ sở dữ liệu XML, cơ sở dữ liệu quan hệ, Hadoop và tấn người khác .

Kiến thức tốt về công nghệ web, trải nghiệm, thử và sai là cách duy nhất bạn có thể thiết kế bất kỳ tính năng nào chắc chắn rằng bạn đang thực hiện nó là đúng (ish).

Nhu cầu hiệu suất của bạn là gì? Mức lưu lượng truy cập? Yêu cầu người sử dụng? Bạn có muốn phân phối sau này (thông qua webhook chẳng hạn?).

Câu hỏi của bạn cần cụ thể hơn.

Cá nhân tôi sẽ có bảng "loại thông báo" hoạt động như một enum ... và sau đó là người dùng <> bảng thông báo xử lý mối quan hệ giữa thông báo và người dùng.

Với một số mã hóa tốt, bạn có thể ghép nối người dùng <> bảng thông báo trên nhiều máy chủ và khóa trên userid hoặc tương tự ... và sao chép bảng loại trên mỗi nút đó cho bộ nhớ cache/tham chiếu cục bộ. Một cái gì đó như thế.

+0

Tôi mặc dù tôi sẽ làm điều gì đó tương tự. Cảm ơn bạn, không biết về Hadoop. –

+4

Clement đang yêu cầu một mẫu thông báo chung mà tôi tìm thấy một câu hỏi hợp lý. – apotonick

0

Tôi khuyên bạn nên sử dụng thông báo đơn giản. Không có loại thông báo hoặc cái gì khác.

Notifications
-ID
-message
-href (Link để đi khi người dùng nhấp chuột vào thông báo)
-receiverUser
-date

Ví dụ sử dụng: John (34) thích một bức ảnh của Mary (47). (Chúng tôi đang gửi thông báo đến Mary)

INSERT INTO Notifications(message,href,receiverUser, date) VALUES ('John liked your photo', 'link of the photo', 47, 01.11.2014) 
+2

Điều gì xảy ra nếu hầu hết các thông báo đều giống nhau? Nó sẽ không dễ dàng hơn để có một bảng với tất cả các thông báo có thể có, sau đó sử dụng một FK để nó trong bảng thông báo của bạn? Bằng cách đó bạn sẽ không lặp lại chuỗi "Bạn hiện là bạn bè với " hàng triệu lần trong cơ sở dữ liệu của bạn. –

1

Bây giờ, một máy chủ ngày như Amazon hosting đang cung cấp khung thông báo. Vì vậy, nếu bạn sử dụng thông báo amazon bạn có thể không cần phải lo lắng về cấu trúc bảng.

Hy vọng điều này sẽ giúp những người khác tìm kiếm các giải pháp tương tự.

Các vấn đề liên quan