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ư MMSNotification
mở 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 NotificationHandler
từng đối tượng NotificationHandler
sẽ 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.