확장 가능한 알림 시스템을 설계하는 방법은 무엇입니까? [닫은]


32

알림 시스템 관리자를 작성해야합니다.

내 요구 사항은 다음과 같습니다.

완전히 다른 플랫폼에서 알림을 보낼 수 있어야합니다 (예를 들어 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추가 할 수 있는 객체가 있다고 생각합니다 .NotificationHandlerNotificationHandler

또한 EventManager플러그 가능한 동작을 허용 하기 위해 를 사용할 수 있습니다 .

의견이나 아이디어가 있습니까?

시간을 내 주셔서 감사합니다.

참고 : PHP에서 일하는 데 익숙하며 아마도 내가 선택한 언어 일 것입니다.


편집 (morphunreal의 답변에 따라)

  • 초당 보내는 메시지 수 (현재 / 초기 수준 정의, 시스템을 다시 디자인하기 전에 처리해야하는 최대 수준 정의)
  • 시스템에 어떤 하드웨어 제약 조건이 있습니까 (시스템에서 사용 가능한 메모리, CPU 등)
  • 하드웨어 확장 (예 : 서버 추가, 클라우드 컴퓨팅 등)

  • 어떤 언어 / 시스템이 알림을 생성합니까?

프로그래밍 방식으로 알림을 작성하지만 UI에서 생성하는 것은 본인의 책임입니다.

  • 생성자가 메시지 수신자를 알고 있습니까 (?) 또는 다른 방법으로 제공됩니까 (예 : 특정 경보 유형에 대한 비즈니스 규칙은 특정 수신자에게 전달됨)

특정 수신자, 수신자 그룹 (예 : 태그 시스템 사용) 또는 전체 플랫폼에 대한 알림을 작성할 수 있어야합니다.

  • CC / BCC / 영수증 추가를위한 비즈니스 규칙이 있습니까?

예. 이것은 실제로 플랫폼에 따라 다르며 읽기 또는 참조가 모든 플랫폼에서 사용 가능한 것은 아닙니다.

  • 생성자가 보내는 메시지 유형 (예 : SMS / 이메일)을 알고 있거나 수신자를 기반으로합니까?

그러나 수신자를 기반으로하지만 수신자는 플랫폼과 관련이 있으며 플랫폼은 데이터를 처리하는 방법이 다르므로 UI는 이미지, 사운드 또는 무언가를 설정할 수 있도록 플랫폼에 따라 다를 수 있습니다.

  • 생성기가 전송 / 수신 / 읽고있는 메시지를 확인해야합니까 (비동기 vs 동기 전송)

시스템에 오류가 발생하기 쉬우나 서버가 도달 할 수없는 경우 추가 프로세스를 위해 알림을 다시 큐에 넣어야하지만 알림이 잘못되었거나 플랫폼 제공 업체가 정의한대로 다시 요청하지 말고 알림을 받아야합니다.

  • 메시지 소스 / 수신자 히스토리를 저장해야하는 요구 사항이 있습니까 (얼마나 오래 걸립니까?)

예, 통계와 보고서를 작성하고 싶을 것입니다. * 알림 끝점 정의


  • 메시지를 보내는 데 어떤 서비스가 사용됩니까? 일부는 고전적인 REST 웹 서비스이고 다른 일부는 이국적인 프로토콜이며 실제로 공급자에게 달려 있습니다.

  • 어떤 피드백 / 확인이 제공됩니까 (동기화 / 비 동기화)

일부는 동기식이며 오류로 응답하지만 다른 일부는 나중에 오류를 확인하기 위해 당겨야합니다.

  • 새로운 종점을 추가 할 가능성이 있는가 [그렇더라도 추상화해야 하는가]

예, 실제로 앱이 커지고 있으며 새로운 공급자를 추가하고 싶을 수도 있지만 매년 1 ~ 2의 비율입니다.


22
Walter, gnat, gbjbaanb, Robert Harvey, thorsten müller는 게으른 사람들 인 것 같습니다. 나는 "모호하고, 모호하고, 불완전하거나, 지나치게 광범위하거나, 수사적"이라는 주장 중 하나 때문에이 질문이 종결 된 이유를 보지 못했다. 디자인 질문은 많은 것을 포함하기 때문에 간단한 질문이 될 수 없습니다. 저는이 웹 사이트의 수준에 따라 복잡한 결정을 실제 전문가와 논의 할 수있었습니다.
Trent

질문하지만 질문하지 마십시오! :) 그래, 가끔 나도 개조의 정신을 추측하지 못한다.
Mr.

공감대와 견해는이 질문이 얼마나 관련성이 있는지 보여줍니다.
NoobEditor

RabbitMQ를 사용하는 것이이 문제에 대한 올바른 접근법입니다. 나는 BIG 회사 인터뷰 중 하나에서 매우 비슷한 문제를 겪고 있었고, 내결함성있는 최고의 게시자 / 가입자 패턴으로 어려움을 겪고있었습니다. 결국 나는 정답을 들었다. RabbitMQ. 그들이 그것을 사용하여 문제를 해결 한 것처럼 보입니다. 희망이 도움이됩니다 !!!
AkD

답변:


16

기능적 요구 사항과 비 기능적 요구 사항을 분리하고 신중하게 정의하여 시작하십시오. 모호한 요구 사항에 따라 시스템을 과도하게 설계하는 것은 매우 쉽습니다.

예를 들어, 확장 성과 관련한 비 기능적 요구 사항은 매우 모호합니다. 시스템에 실제 숫자를 넣으면 많은 정신적 부담을 덜 수 있습니다. 예를 들어

  • 초당 보내는 메시지 수 (현재 / 초기 수준 정의, 시스템을 다시 디자인하기 전에 처리해야하는 최대 수준 정의)
  • 시스템에 어떤 하드웨어 제약 조건이 있습니까 (시스템에서 사용 가능한 메모리, CPU 등)
  • 하드웨어 확장 (예 : 서버 추가, 클라우드 컴퓨팅 등)

이제 시스템 설계 / 아키텍처가 비 기능적 요구 사항을 충족 할 수 있는지 확인하기 위해 몇 가지 테스트설정할 수 있습니다 .

알림 / 메시지를 보내는 비즈니스 / 기능 요구 사항에 대해 다음과 같은 단서가 도움이 될 수 있습니다 (자세한 정보를 제공하면이 답변에 추가 할 수 있음).

알림 소스 정의

  • 알림을 생성 할 언어 / 시스템
  • 생성자가 메시지 수신자를 알고 있습니까 (?) 또는 다른 방법으로 제공됩니까 (예 : 특정 경보 유형에 대한 비즈니스 규칙은 특정 수신자에게 전달됨)
  • CC / BCC / 영수증 추가를위한 비즈니스 규칙이 있습니까?
  • 생성자가 보내는 메시지 유형 (예 : SMS / 이메일)을 알고 있거나 수신자를 기반으로합니까?
  • 생성기가 전송 / 수신 / 읽고있는 메시지를 확인해야합니까 (비동기 vs 동기 전송)
  • 메시지 소스 / 수신자 히스토리를 저장해야하는 요구 사항이 있습니까 (얼마나 오래 걸립니까?)

알림 끝점 정의

  • 메시지를 보내는 데 사용되는 서비스
  • 어떤 피드백 / 확인이 제공됩니까 (동기화 / 비 동기화)
  • 새로운 종점을 추가 할 가능성이 있는가 [그렇더라도 추상화해야 하는가]

나는 관련된 요소들에 크게 의존 할 것이기 때문에 구체적인 아키텍처 예제를 제공하는 것을 주저하고있다. 그러나 가장 단순한 메시지 시스템은 종종 메모리 / 응용 프로그램, 비 SQL, 디스크 또는 관계형 데이터베이스의 기본 큐를 포함합니다. 그런 다음 별도의 프로세스 (또는 분산 된 경우 여러 개의 개별 프로세스)가 메시지 유형 (예 : cron 작업)에 대해 큐를 폴링 할 수 있습니다. 그리고 필요에 따라 발송하십시오.

메시지를 즉시 전송해야하는 경우 일부 푸시 기반 기술 (예 : PostgreSQL NOTIFY / LISTEN)을 사용하여이 기능을 향상시킬 수도 있습니다.

단순 큐의 장점은 메시지를 생성하는 시스템이 수행해야 할 작업이 거의 없으며 하드웨어 / 성능 요구 사항에 따라 처리 시스템의 균형을 유지할 수 있다는 것입니다.


실제로 더 명확한 아이디어를 얻는 데 도움이되는 세부 답변에 대해 대단히 감사합니다. 제기 한 질문에 답변하기 위해 답변을 편집했습니다.
Trent

-2

알림 객체의 플라이급 디자인 패턴을 고려 했습니까? 패턴을 구현하지 않았기 때문에 그것에 대해 너무 확신하지는 않지만 플라이급 객체간에 상태를 공유하는 것과 관련이 있습니다. 또한 이중화가 더 많은 구성원이 공유하면 더 큰 영향을 미쳤다고 생각합니다. 따라서 많은 사람들에게 몇 가지 메시지 만 보내거나 그 반대로 보내는 경우에 달려 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.