Làm thế nào để thiết kế một hệ thống thông báo có thể mở rộng? [đóng cửa]


32

Tôi cần phải viết một người quản lý hệ thống thông báo.

Đây là yêu cầu của tôi:

Tôi cần có thể gửi Thông báo trên các nền tảng khác nhau, có thể hoàn toàn khác nhau (ví dụ, tôi cần có thể gửi SMS hoặc E-mail).

Đôi khi thông báo có thể giống nhau cho tất cả người nhận cho một nền tảng nhất định, nhưng đôi khi nó có thể là thông báo cho mỗi người nhận (hoặc một vài) cho mỗi nền tảng.

Mỗi thông báo có thể chứa tải trọng cụ thể của nền tảng (ví dụ MMS có thể chứa âm thanh hoặc hình ảnh).

Hệ thống cần phải có khả năng mở rộng , tôi cần có thể gửi một lượng thông báo rất lớn mà không bị sập ứng dụng hoặc máy chủ.

Đó là một quá trình gồm hai bước, đầu tiên khách hàng có thể nhập tin nhắn và chọn một nền tảng để gửi đến và (các) thông báo sẽ được tạo để được xử lý theo thời gian thực sau đó.

Sau đó, hệ thống cần gửi thông báo cho nhà cung cấp nền tảng.


Hiện tại, tôi đã kết thúc với một số nhưng tôi không biết nó sẽ có khả năng mở rộng như thế nào hoặc nếu nó là một thiết kế tốt.

Tôi đã mặc dù các đối tượng sau đây (bằng ngôn ngữ giả):

một Notificationđối tượng chung :

class Notification {
    String                 $message;
    Payload                $payload;
    Collection<Recipient>  $recipients;
}

Vấn đề với các đối tượng sau là nếu tôi có 1.000.000 người nhận thì sao? Ngay cả khi Recipientđối tượng rất nhỏ, nó sẽ chiếm quá nhiều bộ nhớ.

Tôi cũng có thể tạo một Thông báo cho mỗi người nhận, nhưng một số nhà cung cấp nền tảng yêu cầu tôi gửi theo đợt, nghĩa là tôi cần xác định một Thông báo với một số Người nhận.

Mỗi thông báo được tạo có thể được lưu trữ trong một bộ lưu trữ liên tục như DB hoặc Redis.

Nó sẽ là một điều tốt để tổng hợp này sau này để đảm bảo nó có thể mở rộng?

Bước thứ hai, tôi cần xử lý thông báo này.

Nhưng làm thế nào tôi có thể phân biệt thông báo cho nhà cung cấp nền tảng phù hợp?

Tôi có nên sử dụng một đối tượng như MMSNotificationmở rộng một abstract Notification? hoặc một cái gì đó như thế Notification.setType('MMS')nào?

Để cho phép xử lý nhiều thông báo cùng một lúc, tôi nghĩ rằng một hệ thống xếp hàng nhắn tin như RabbitMQ có thể là công cụ phù hợp. Là nó?

Nó sẽ cho phép tôi xếp hàng rất nhiều thông báo và có một số nhân viên bật thông báo và xử lý chúng. Nhưng nếu tôi cần hàng loạt người nhận như đã thấy ở trên thì sao?

Sau đó, tôi tưởng tượng một NotificationProcessorđối tượng mà tôi có thể thêm NotificationHandlertừng đối tượng NotificationHandlersẽ chịu trách nhiệm kết nối nhà cung cấp nền tảng và thực hiện thông báo.

Tôi cũng có thể sử dụng một EventManagerđể cho phép hành vi cắm.

Bất kỳ thông tin phản hồi hoặc ý tưởng?

Cảm ơn đã cho thời gian của bạn.

Lưu ý: Tôi đã từng làm việc trong PHP và đó có thể là ngôn ngữ mà tôi chọn.


Chỉnh sửa (theo câu trả lời của morphunreal)

  • Bạn gửi bao nhiêu tin nhắn mỗi giây (Xác định mức hiện tại / mức ban đầu, xác định mức tối đa mà hệ thống sẽ xử lý trước khi được thiết kế lại)
  • Hệ thống có những hạn chế phần cứng nào (bộ nhớ, cpu, vv có sẵn cho hệ thống)
  • Làm thế nào quy mô phần cứng (nghĩa là thêm nhiều máy chủ, điện toán đám mây, v.v.)

  • Ngôn ngữ / hệ thống nào sẽ tạo thông báo?

Tôi tự chịu trách nhiệm tạo thông báo theo chương trình nhưng được xây dựng từ UI.

  • Người tạo có biết người nhận tin nhắn (?) Hay họ được cung cấp bởi một số phương tiện khác (nghĩa là quy tắc kinh doanh cho một số loại cảnh báo nhất định đi đến người nhận nhất định)

Có thể tạo thông báo cho một người nhận cụ thể, một nhóm người nhận (ví dụ: sử dụng hệ thống thẻ) hoặc cho toàn bộ nền tảng.

  • Có quy tắc kinh doanh nào để thêm biên lai CC / BCC / Đọc không

Vâng. Lưu ý rằng đây thực sự là nền tảng cụ thể và đọc hoặc cc không có sẵn trên tất cả các nền tảng.

  • Trình tạo có biết loại tin nhắn mà nó gửi không (ví dụ: SMS / email) hoặc nó dựa trên người nhận

Tuy nhiên, nó dựa trên người nhận, vì người nhận có liên quan đến nền tảng và các nền tảng có cách xử lý dữ liệu khác nhau, UI có thể là nền tảng cụ thể để cho phép thiết lập hình ảnh, âm thanh hoặc thứ gì đó.

  • Trình tạo có yêu cầu xác nhận tin nhắn được gửi / nhận / đọc (không đồng bộ so với gửi đồng bộ)

Vâng, hệ thống sẽ dễ bị lỗi nhưng chúng tôi muốn xử lý lỗi để xác định một bộ quy tắc, ví dụ: nếu máy chủ không thể truy cập được, thông báo sẽ được yêu cầu xử lý thêm, nhưng nếu thông báo không chính xác (hoặc đã bị sai được định nghĩa là bởi nhà cung cấp nền tảng) nó không nên được yêu cầu mà được thông báo.

  • Có yêu cầu lưu trữ lịch sử nguồn / người nhận tin nhắn (trong bao lâu?)

Có, chúng tôi có thể muốn thực hiện một số thống kê và báo cáo. * Xác định điểm kết thúc thông báo


  • Những dịch vụ nào đang được sử dụng để gửi tin nhắn? Phụ thuộc, một số là dịch vụ web REST cổ điển, một số khác là một giao thức kỳ lạ, nó thực sự phụ thuộc vào nhà cung cấp.

  • Phản hồi / xác nhận nào được cung cấp (đồng bộ / không đồng bộ)

Phụ thuộc, một số là đồng bộ và trả lời có lỗi trong khi một số khác cần được kéo sau đó để kiểm tra lỗi.

  • Có khả năng thêm điểm cuối mới [ngay cả khi có, thậm chí có cần phải được trừu tượng hóa không]

Vâng, thực sự, ứng dụng của chúng tôi đang phát triển và chúng tôi có thể muốn có thể thêm nhà cung cấp mới, nhưng đó là tỷ lệ của 1 hoặc 2 mỗi năm.


22
Walter, gnat, gbjbaanb, Robert Harvey, thorsten müller dường như là những người lười biếng; Tôi không thấy bất kỳ lý do nào mà câu hỏi này đã bị đóng vì một trong những lý lẽ sau: "mơ hồ, mơ hồ, không đầy đủ, quá rộng, hoặc hùng biện". Một câu hỏi thiết kế không thể là một câu hỏi đơn giản vì nó liên quan đến rất nhiều thứ, mặc dù mức độ của trang web này cho phép quyết định phức tạp như vậy được thảo luận với chuyên gia thực sự.
Trent

Đặt câu hỏi nhưng đừng đặt câu hỏi! :) Vâng, đôi khi tôi quá thất bại trong việc hiểu tâm lý của các mod.
Mrchief

upvote và lượt xem cho thấy câu hỏi này có liên quan đến mức nào .... nếu chỉ người điều hành mới hiểu được !!!
NoobEditor

Sử dụng RabbitMQ là cách tiếp cận phù hợp cho vấn đề này. Tôi đã được hỏi vấn đề rất giống nhau trong một cuộc phỏng vấn công ty LỚN của tôi và tôi đang vật lộn với mô hình nhà xuất bản / người đăng ký chịu lỗi tốt nhất. Cuối cùng, tôi được trả lời đúng. ThỏMQ. Có vẻ như họ đã giải quyết vấn đề bằng cách sử dụng nó. Mong rằng sẽ giúp !!!
AkD

Câu trả lời:


16

Bắt đầu bằng cách tách ra các yêu cầu chức năng và phi chức năng của bạn, và cẩn thận xác định chúng. Rất dễ dàng để thiết kế quá mức một hệ thống dựa trên các yêu cầu mơ hồ.

Ví dụ, các yêu cầu phi chức năng của bạn liên quan đến khả năng mở rộng là khá mơ hồ. Nó có thể giảm rất nhiều tải trọng tinh thần nếu bạn đặt con số thực tế vào hệ thống của bạn. Ví dụ,

  • Bạn gửi bao nhiêu tin nhắn mỗi giây (Xác định mức hiện tại / mức ban đầu, xác định mức tối đa mà hệ thống sẽ xử lý trước khi được thiết kế lại)
  • Hệ thống có những hạn chế phần cứng nào (bộ nhớ, cpu, vv có sẵn cho hệ thống)
  • Làm thế nào quy mô phần cứng (nghĩa là thêm nhiều máy chủ, điện toán đám mây, v.v.)

Bây giờ bạn đã có cách đó, bạn có thể thiết lập một số thử nghiệm để đảm bảo rằng thiết kế / kiến ​​trúc hệ thống có khả năng đáp ứng các yêu cầu phi chức năng của bạn.

Đối với các yêu cầu kinh doanh / chức năng của việc gửi thông báo / tin nhắn, các manh mối sau có thể giúp ích (nếu bạn cung cấp thêm thông tin tôi có thể thêm vào câu trả lời này):

Xác định nguồn thông báo

  • Ngôn ngữ / hệ thống nào sẽ tạo thông báo
  • Người tạo có biết người nhận tin nhắn (?) Hay họ được cung cấp bởi một số phương tiện khác (nghĩa là quy tắc kinh doanh cho một số loại cảnh báo nhất định đi đến người nhận nhất định)
  • Có quy tắc kinh doanh nào để thêm biên lai CC / BCC / Đọc không
  • Trình tạo có biết loại tin nhắn mà nó gửi không (ví dụ: SMS / email) hoặc nó dựa trên người nhận
  • Trình tạo có yêu cầu xác nhận tin nhắn được gửi / nhận / đọc (không đồng bộ so với gửi đồng bộ)
  • Có yêu cầu lưu trữ lịch sử nguồn / người nhận tin nhắn (trong bao lâu?)

Xác định điểm kết thúc thông báo

  • Dịch vụ nào đang được sử dụng để gửi tin nhắn
  • Phản hồi / xác nhận nào được cung cấp (đồng bộ / không đồng bộ)
  • Có khả năng thêm điểm cuối mới [ngay cả khi có, thậm chí có cần phải được trừu tượng hóa không]

Tôi ngần ngại cung cấp một ví dụ kiến ​​trúc cụ thể vì nó sẽ phụ thuộc rất nhiều vào các yếu tố liên quan; nhưng thường là các hệ thống thông báo đơn giản nhất liên quan đến một hàng đợi cơ bản, trong bộ nhớ / ứng dụng, không có SQL, đĩa hoặc cơ sở dữ liệu quan hệ. Sau đó, một quy trình riêng biệt (hoặc một số quy trình riêng biệt nếu được phân phối) có thể thăm dò hàng đợi cho các loại thông báo của họ [tức là một công việc định kỳ]; và gửi đi khi cần thiết.

Điều này cũng có thể được tăng cường bằng cách sử dụng một số kỹ thuật dựa trên đẩy (ví dụ PostgreSQL NOTIFY / LISTEN) nếu có yêu cầu gửi tin nhắn ngay lập tức.

Ưu điểm của một hàng đợi đơn giản là hệ thống tạo ra thông điệp có rất ít việc phải làm và hệ thống xử lý có thể được cân bằng dựa trên các yêu cầu về phần cứng / hiệu năng.


cảm ơn bạn rất nhiều vì câu trả lời chi tiết của bạn mà thực sự giúp tôi có một số ý tưởng rõ ràng hơn. Tôi chỉnh sửa câu trả lời của mình để trả lời các câu hỏi bạn nêu ra.
Trent

-2

Bạn đã xem xét mẫu thiết kế fly trọng cho các đối tượng thông báo của bạn? Tôi không chắc lắm về điều đó, vì tôi chưa bao giờ thực hiện mô hình, nhưng tôi nhớ nó liên quan đến việc chia sẻ một số trạng thái giữa các đối tượng bay bổng. Tôi cũng nghĩ rằng, các thành viên có nhiều dư thừa có tác động lớn hơn nếu được chia sẻ. Vì vậy, nó phụ thuộc vào việc bạn chỉ gửi một vài tin nhắn cho nhiều người hay ngược lại.

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.