알림 시스템 관리자를 작성해야합니다.
내 요구 사항은 다음과 같습니다.
완전히 다른 플랫폼에서 알림을 보낼 수 있어야합니다 (예를 들어 SMS 또는 전자 메일을 보낼 수 있어야 함).
때때로 알림은 특정 플랫폼의 모든 수신자에게 동일 할 수 있지만 때로는 플랫폼 당 수신자 (또는 여러 명) 당 알림 일 수 있습니다.
각 알림에는 플랫폼 별 페이로드가 포함될 수 있습니다 (예 : MMS에 사운드 또는 이미지가 포함될 수 있음).
시스템은 확장 가능 해야하며 응용 프로그램이나 서버를 손상시키지 않고 매우 많은 양의 알림을 보낼 수 있어야합니다.
2 단계 프로세스입니다. 먼저 고객이 메시지를 입력하고 보낼 플랫폼을 선택할 수 있으며 나중에 실시간으로 처리되도록 알림을 작성해야합니다.
그런 다음 시스템은 알림을 플랫폼 공급자에게 보내야합니다.
지금까지, 나는 일부로 끝내지 만 그것이 얼마나 확장 가능한지 또는 좋은 디자인인지는 알지 못합니다.
나는 다음 객체 (의사 언어)를 사용했습니다.
일반적인 Notification
객체 :
class Notification {
String $message;
Payload $payload;
Collection<Recipient> $recipients;
}
다음 개체의 문제는 수신자가 1.000.000 명인 경우 어떻게됩니까? Recipient
개체가 매우 작 더라도 너무 많은 메모리가 필요합니다.
받는 사람당 하나의 알림을 만들 수도 있지만 일부 플랫폼 공급자는이를 일괄로 보내야하므로 여러받는 사람이있는 알림 하나를 정의해야합니다.
생성 된 각 알림은 DB 또는 Redis와 같은 영구 스토리지에 저장 될 수 있습니다.
나중에 확장 가능하도록하기 위해 이것을 집계하는 것이 좋을까요?
두 번째 단계에서는이 알림을 처리해야합니다.
그러나 올바른 플랫폼 제공 업체와 알림을 어떻게 구별 할 수 있습니까?
MMSNotification
확장 과 같은 객체를 사용해야합니까 abstract Notification
? 아니면 같은 Notification.setType('MMS')
?
동시에 많은 알림을 처리 할 수 있도록 RabbitMQ와 같은 메시징 큐 시스템이 올바른 도구라고 생각합니다. 그렇습니까?
그것은 많은 알림을 대기열에 넣고 여러 작업자가 알림을 팝업하고 처리하도록 할 수 있습니다. 그러나 위와 같이 수신자를 배치해야하는 경우 어떻게해야합니까?
그런 다음 플랫폼 공급자를 연결하고 알림을 수행하기 위해 각각 을 NotificationProcessor
추가 할 수 있는 객체가 있다고 생각합니다 .NotificationHandler
NotificationHandler
또한 EventManager
플러그 가능한 동작을 허용 하기 위해 를 사용할 수 있습니다 .
의견이나 아이디어가 있습니까?
시간을 내 주셔서 감사합니다.
참고 : PHP에서 일하는 데 익숙하며 아마도 내가 선택한 언어 일 것입니다.
편집 (morphunreal의 답변에 따라)
- 초당 보내는 메시지 수 (현재 / 초기 수준 정의, 시스템을 다시 디자인하기 전에 처리해야하는 최대 수준 정의)
- 시스템에 어떤 하드웨어 제약 조건이 있습니까 (시스템에서 사용 가능한 메모리, CPU 등)
- 하드웨어 확장 (예 : 서버 추가, 클라우드 컴퓨팅 등)
- 어떤 언어 / 시스템이 알림을 생성합니까?
프로그래밍 방식으로 알림을 작성하지만 UI에서 생성하는 것은 본인의 책임입니다.
- 생성자가 메시지 수신자를 알고 있습니까 (?) 또는 다른 방법으로 제공됩니까 (예 : 특정 경보 유형에 대한 비즈니스 규칙은 특정 수신자에게 전달됨)
특정 수신자, 수신자 그룹 (예 : 태그 시스템 사용) 또는 전체 플랫폼에 대한 알림을 작성할 수 있어야합니다.
- CC / BCC / 영수증 추가를위한 비즈니스 규칙이 있습니까?
예. 이것은 실제로 플랫폼에 따라 다르며 읽기 또는 참조가 모든 플랫폼에서 사용 가능한 것은 아닙니다.
- 생성자가 보내는 메시지 유형 (예 : SMS / 이메일)을 알고 있거나 수신자를 기반으로합니까?
그러나 수신자를 기반으로하지만 수신자는 플랫폼과 관련이 있으며 플랫폼은 데이터를 처리하는 방법이 다르므로 UI는 이미지, 사운드 또는 무언가를 설정할 수 있도록 플랫폼에 따라 다를 수 있습니다.
- 생성기가 전송 / 수신 / 읽고있는 메시지를 확인해야합니까 (비동기 vs 동기 전송)
시스템에 오류가 발생하기 쉬우나 서버가 도달 할 수없는 경우 추가 프로세스를 위해 알림을 다시 큐에 넣어야하지만 알림이 잘못되었거나 플랫폼 제공 업체가 정의한대로 다시 요청하지 말고 알림을 받아야합니다.
- 메시지 소스 / 수신자 히스토리를 저장해야하는 요구 사항이 있습니까 (얼마나 오래 걸립니까?)
예, 통계와 보고서를 작성하고 싶을 것입니다. * 알림 끝점 정의
메시지를 보내는 데 어떤 서비스가 사용됩니까? 일부는 고전적인 REST 웹 서비스이고 다른 일부는 이국적인 프로토콜이며 실제로 공급자에게 달려 있습니다.
어떤 피드백 / 확인이 제공됩니까 (동기화 / 비 동기화)
일부는 동기식이며 오류로 응답하지만 다른 일부는 나중에 오류를 확인하기 위해 당겨야합니다.
- 새로운 종점을 추가 할 가능성이 있는가 [그렇더라도 추상화해야 하는가]
예, 실제로 앱이 커지고 있으며 새로운 공급자를 추가하고 싶을 수도 있지만 매년 1 ~ 2의 비율입니다.