나는 우리의 페이지 (소셜 게임 타입)를위한 페이스 북 스타일 알림 시스템을 구축하기 시작했고 이제 그러한 시스템을 디자인하는 가장 좋은 방법이 무엇인지 연구하고있다. 사용자에게 알림을 보내는 방법에 관심이 없습니다 (현재조차도). 서버에 시스템을 구축하는 방법 (알림 저장 방법, 저장 위치, 가져 오는 방법 등)을 연구 중입니다.
그래서 ... 우리가 가지고있는 몇 가지 요구 사항 :
- 성수기에는 약 1k 명의 동시 로그인 한 사용자 (및 더 많은 게스트가 있지만 알림을받지 않으므로 여기에서는 중요하지 않음)가 많은 이벤트를 생성합니다.
- 다른 유형의 알림이있을 것입니다 (사용자 A는 친구로 당신을 추가했습니다. 사용자 B는 프로필에 댓글을 달았습니다. 사용자 C는 이미지를 좋아했습니다. 사용자 D는 게임 X에서 당신을 때렸습니다 ...)
- 대부분의 이벤트는 1 명의 사용자에 대해 1 개의 알림을 생성하지만 (사용자 X는 이미지를 좋아했습니다), 하나의 이벤트가 많은 알림을 생성하는 경우가 있습니다 (예 : 사용자 Y의 생일)
- 알림은 함께 그룹화해야합니다. 예를 들어 일부 이미지와 같은 4 명의 다른 사용자가 해당 이미지의 소유자에게 4 개의 사용자가 이미지를 좋아하고 4 개의 별도의 알림이 아니라는 것을 나타내는 하나의 알림을 받아야합니다 (FB처럼)
내가 생각했던 것은 이벤트가 발생할 때 이벤트를 저장하는 일종의 큐를 만들어야한다는 것입니다. 그런 다음 배경 작업을 할 것입니다 ( gearman 해당 대기열을보고 해당 이벤트를 기반으로 알림을 생성 ?)이 있습니다. 그런 다음이 작업은 각 사용자에 대해 데이터베이스에 알림을 저장합니다 (따라서 이벤트가 10 명의 사용자에게 영향을주는 경우 10 개의 개별 알림이 있음). 그런 다음 사용자가 알림 목록이있는 페이지를 열면 그에 대한 모든 알림을 읽고 (100 개의 최신 알림으로 제한하려고 생각하는 경우) 그룹화 한 다음 마지막으로 표시합니다.
이 접근법에 관심이있는 것들 :
- 지옥처럼 복잡한 :)
- 데이터베이스가 여기에 가장 좋은 스토리지입니까 (MySQL을 사용하고 있습니다) 또는 다른 것을 사용해야합니까 (redis도 적합합니다)
- 알림으로 무엇을 저장해야하나요? 사용자 ID, 이벤트를 시작한 사용자 ID, 이벤트 유형 (이벤트를 그룹화하고 적절한 텍스트를 표시 할 수 있도록)이지만 알림의 실제 데이터를 저장하는 방법을 모릅니다 (예 : 이미지의 URL 및 제목). 좋아했다). 알림을 생성 할 때 해당 정보를 "베이킹"해야하거나 영향을받는 레코드의 ID (이미지, 프로필 등)를 저장하고 알림을 표시 할 때 DB에서 정보를 가져와야합니다.
- 알림 페이지를 표시 할 때 즉석에서 100 개의 알림을 처리해야하더라도 여기서 성능은 양호해야합니다.
- 읽지 않은 알림 수를 사용자에게 표시해야하기 때문에 모든 요청에서 가능한 성능 문제 (알림을 그룹화하기 때문에 자체적으로 문제가 될 수 있음). 백그라운드에서 알림보기 (그룹화 된 위치)를 즉시 생성하지 않고 생성하면 피할 수 있습니다.
제안 된 솔루션과 우려 사항에 대해 어떻게 생각하십니까? 여기에 관련된 다른 언급이 필요하다고 생각되면 의견을 말하십시오.
아, 우리는 페이지에 PHP를 사용하고 있지만, 여기서 큰 요소는 아닙니다.