Thiết kế kiến trúc hệ thống hàng tỷ tin nhắn - Phần 3

Nội dung bài viết

Bài viết này sẽ phân tích và tóm tắt các điểm kiến thức cần nắm vững để triển khai hệ thống tin nhắn với hàng triệu tin nhắn. Nếu người mới thì có thể sẽ hơi khó một chút vì có thiên về kỹ thuật ví dụ như thiết kế database. Nếu là người cũ thì bạn có thể so sánh với thiết kế của bạn để đưa ra một giải pháp hoàn thiện hơn. Nếu như bạn muốn tìm hiểu ngay từ đâu thì bạn có thể tìm đọc lại những bài viết liên quan.

Bài viết liên quan

Socket.io là gì? Chịu tải bao nhiêu và vì sao tôi chọn socket.io?

Triển khai xây dựng project socket.io, express và heroku - KÈM SOURCE

Thiết kế kiến trúc hệ thống hàng tỷ tin nhắn (Bài này)

Thiết kế database truy xuất hàng triệu dữ liệu

Thuật ngữ dùng chung hệ thống tin nhắn

1 - Người dùng: Người sử dụng hệ thống.

2 - Tin nhắn: Dùng để chỉ nội dung giao tiếp giữa người dùng với nhau (tin nhắn sẽ có các dạng sau: tin nhắn văn bản, biểu tượng cảm xúc, tin nhắn hình ảnh, tin nhắn video, tin nhắn tập tin, v.v. ).

3 - Hội thoại: thường đề cập đến liên kết được thiết lập giữa hai người dùng do trò chuyện.

4 - Nhóm: thường đề cập đến liên kết được thiết lập giữa nhiều người dùng do trò chuyện.

5 - Thiết bị đầu cuối: đề cập đến máy mà người dùng sử dụng hệ thống tin nhắn ( thường là Android, iOS, Web, v.v. ).

6 - Chưa đọc : Đề cập đến số lượng tin nhắn mà người dùng chưa đọc.

7 - Trạng thái người dùng: đề cập đến việc người dùng hiện đang trực tuyến, ngoại tuyến hay bị tạm ngừng.

8 - Chuỗi mối quan hệ: đề cập đến mối quan hệ giữa người dùng và người dùng, thường là mối quan hệ bạn bè một chiều, mối quan hệ bạn bè hai chiều, mối quan hệ theo dõi, v.v.

9 - Trò chuyện đơn: trò chuyện một đối một.

10 - Trò chuyện nhóm: trò chuyện với nhiều người.

Hai kiến trúc hệ thống tin nhắn phổ biến

Hiện tại theo bản thân người viết theo dõi nhiều bản tin công nghệ thì có hai luồng thiết kết phổ biến nhất, đương nhiên sẽ có nhiều cách khác nhưng không đề cập trong bài viết này. Thì đó là hai cách triển khai hệ thống tin nhắn là khuếch đại đọc tin, và khuếch đại ghi tin. Bài này sẽ phân tích cho anh em nắm kỹ hơn, vì tôi có triển khai hệ thống này rồi, đương nhiên trước khi triển khai tôi có tham khảo nhiều đồng đội cũng như opensource trên internet.

Hy vọng giúp được nhiều cho anh em định hình mô hình kiến trúc trước khi thiết kế cho mình hay cho dự án của doanh nghiệp.

Khuếch đại đọc

Push message mongodb

Như trong hình trên ta thấy: A sẽ có một box với mỗi người và mỗi nhóm. Ví dụ A chat với B thì A và B là một box chỉ ghi 1 lần, tương tự cho A và C, và A và Group1. Trường hợp A cần kiểm tra tin nhắn mới thì có kiếm tra tất cả các box mà mình có trong đó.

Về mặt triển khai logic trong database thì A nếu muốn gửi một message cho B thì chỉ cần ghi vào box A-B mà thôi, tương tự B cũng vậy. Ví dụ trong Mongosb như sau:

{
    id: 'A-B',
    msgId: 1,
    content: 1,
    time: 123234234
},
{
    id: 'A-C',
    msgId: 2,
    content: 2,
    time: 123234234
},
{
    id: 'A-B-C-D', //Group1
    msgId: 3,
    content: 3,
    time: 123234234
}
...

Ưu điểm của cách này hay đúng ra là sự khuếch tán đọc:

1) Thao tác viết (tin nhắn) rất nhẹ, dù là trò chuyện đơn hay trò chuyện nhóm, bạn chỉ cần ghi vào hộp thư tương ứng một lần.

2) Mỗi hộp thư đương nhiên là lịch sử trò chuyện của hai người, có thể thuận tiện xem lịch sử trò chuyện và tìm kiếm lịch sử trò chuyện.

Nhược điểm của việc khuếch tán đọc: Thao tác đọc ( đọc thông báo ) rất nặng, trong các dịch vụ phức tạp như check tin nhắn mới là phải đọc rất nhiều box.

Notes: Đọc thôi, đừng nghĩ nhiều. Tôi sẽ nói rõ phần demo. Yên tâm.

Khuếch tán ghi

pull message mongodb

Như trong hình trên: Trong khuếch tán ghi, mọi người chỉ đọc tin nhắn từ hộp thư của họ. Nhưng khác với mô hình trên kia như sau:

1) Trò chuyện 1-1 (đơn): Khi A chat cho B, thì tin nhắn này sẽ được ghi hai lần, 1 vào box A, và 1 vào box B. Tương tự cho B, C.. nếu muốn xem lịch sử trò chuyện của hai người thỉ có thể chỉ cẩn đọc lại box của mỗi cá nhân mà thôi.

2) Trò chuyện 1 - N (nhóm): Khi A chat cho Group1 có (A, B, C, D) thì ngoài việc insert vào box A thì còn phải insert vào Box B, C, và D. Nghĩa là 5 lần ghi. Đồng thời muốn đọc lại lịch sử tin nhắn đôi khi phải viết một kịch bản khác? Có thể thấy rằng sự gia tăng khả năng ghi sẽ phóng đại rất nhiều thao tác ghi cho các cuộc trò chuyện nhóm.

Ưu điểm của khuếch tán ghi

1) Thao tác đọc rất nhẹ; 2) Đồng bộ hóa nhiều đầu cuối của tin nhắn có thể được thực hiện dễ dàng.

Nhược điểm của việc viết khuếch tán: Thao tác viết rất nặng, đặc biệt là đối với các cuộc trò chuyện nhóm ( bởi vì nếu có nhiều thành viên trong nhóm, một nguồn tin nhắn phải được khuếch tán và viết dưới dạng tin nhắn đích "số lượng thành viên-1", điều này rất đáng sợ ).

Tôi cũng lấy mongodb làm ví dụ cho trường hợp này:

{
    id: 1,
    to: 'A',
    from: 'B'
    msgId: 1,
    content: 1,
    time: 123234234
},
{
    id: 2
    to: 'B',
    from: 'A'
       msgId: 1,
    content: 1,
    time: 123234234
},

...

Tóm lại

Dù sao đi nữa bạn của tôi nên nhớ rằng. 1 tin nhắn được gửi ra có thể được đọc 100 lần. Ví dụ trong nhóm có 100 người thì A chat mgs1 thì 99 còn lại sẽ get về 99 lần. Nghĩa là tỷ lệ đọc và ghi : 100 - 1. Nên nhớ là vậy, từ đó bạn sẽ biết bạn nên đi theo mô hình kiến trúc nào.

Trong hệ thống Nguồn cấp dữ liệu bạn có thể hiểu:

1) Sự khuếch tán ghi còn được gọi là: Push, Fan-out hoặc Write-fanout;

2) Sự khuếch tán đọc còn được gọi là: Pull, Fan-in hoặc Read-fanout.

Ở những bài sau tôi sẽ nói đến kiến trúc trò truyện trực tuyến và ngoại tuyến hay còn gọi là online và ooffline như thế nào.

Happy coding!!!

Có thể bạn đã bị missing