2012-12-21 3 views
4

저는 현재 일하고있는 회사의 소규모 내부 소셜 미디어 플랫폼을 작성 중입니다. 40,000 명 이상의 사용자 기본적으로 Facebook이나 Google+와 비슷하지만 기능은 적습니다.알림 시스템 (이메일, 소셜 미디어)

이 플랫폼에는 전자 메일 알림 시스템 (온라인 사용자를위한 Ajax 알림 옆)도 있습니다.

여기 내 문제가 있습니다. 단순히 크기 조정이 아닙니다.

보내는 전자 메일 알림을 모두 보유한 mySQL 테이블이 있습니다. 따라서 누군가가 그룹에 이야기를 쓰자 마자 시스템은 자동으로 해당 테이블에 한 줄을 삽입하고 email_send 함수 (cronjob)가 해당 메일을 사용자에게 보냅니다 (사용자는 인스턴트, 매일 또는 매주 알림 메일 중에서 선택할 수 있음)

그룹이 회원 수가 적 으면 지금까지는 너무 좋아요.

하지만 이제 5k + 회원이있는 그룹을 이미지화합니다. 사용자가 해당 그룹에 스토리를 게시하면 알림 테이블에 5,000 회의 SQL 삽입이 트리거됩니다.

어떻게 해결할 수 있습니까? 나는 백그라운드에서 새로운 스토리/코멘트/물건을 검색하고 백그라운드에서 email_send 함수를 트리거하는 서버의 배경 작업자를 생각했습니다. 이 스케일이 더 좋을까요? 아니면 이것에 대한 표준 방법이 있습니까? 나는 단지 잘못된 방향으로 생각하고 있습니까?

올바른 방향으로 모든 포인트가 꽤 많이 주시면 감사하겠습니다, 당신과 메리 크리스마스 :)

// 마커스 감사드립니다.

+0

woah man, 다른 뭔가가 필요합니다! 이 작동하지 않습니다! 한 번에 한 줄씩 5000 행! –

+0

그래, 그게 내가 정확히 알아 낸거야 :)하지만, 나를 비난하고, 나는 단지 정확한 해결책을 볼 수있는 장님 일 뿐이다. –

답변

3

전자 메일을 보내 정상적인 웹 요청/응답 흐름을 늦춰서는 안됩니다. 데이터를 대기열에 덤프하고 백그라운드 작업으로 그 작업을 선택하게하면 cron 권한으로 이미이 작업을 수행하는 것처럼 들립니다.

저속의 원인은 삽입 물입니까? 그런 다음 데이터를 표준화하고 전자 메일 대기열 테이블에 groupID를 삽입하기 만하면됩니다. 해당 groupID는 X 사용자와 해당 전자 메일 주소가 포함 된 그룹과 연관됩니다. 그럼 당신은 대신 5000 이 같은 매우 빠르게 아마도 뭔가의 1 개 기록 ... 삽입됩니다

notificationTable 
rowID | emailID | groupID | status 

groupTable 
groupID | groupName 

userTable 
userID | userName | emailAddress | groupID 

당신은 해고 할 수 있도록 다음 메시징 시스템을 도입 할 수 더욱 그것을 가지고 싶은 경우

간단한 (빠른) 메시지를 끄고 하나 이상의 리스너 (하나 이상의 개별 서버에서)가 하나 이상의 채널에서 메시지를 기다리는 경우.

+0

정확히. 알림 테이블에 삽입하면 5k + 회원 그룹에서 새 스토리를 게시하는 프로세스가 느려집니다. 게시 할 때 3-5 초 지연되는 것과 같습니다. 나는 통보 테이블을 전혀 가지지 않는 것 같은 것을 생각했다. - 이야기를 통해 달리고있는 cron job처럼, 그것은 이미이 이야기에 대한 이메일을 촉발했는지 여부를 점검한다. 이것은 내가 이미 자리에있는 이벤트 테이블을 사용하여 수행 할 수 있습니다 (스토리의 경우). 그러나 필자가 글쓰기를 시작하기 전에 동일한 이슈에 직면 한 다른 사람들의 생각을하는 것이 좋을 것이다. –

+0

오, 당신은 당신의 대답을 업데이트했습니다 - 당신을 올바른 방향으로 생각하게 만든 당신 이었기 때문에 +1하고 해결했습니다 - 고마워요! (어떻게 내가 그것을 해결했는지 나 자신의 대답과 함께 아래를 보라) –

0

좋아, 내 문제에 다음 (수) 솔루션을 함께했다 : 나는 이미

  • 테이블 "이벤트을":

rowID (event_id)| story_id | initiator | group_id

  • 새 테이블을 만듭니다 "not_notified":

rowID | event_id

은 곧 사람으로 시스템이 지금 "not_notified"테이블에 한 줄을 삽입합니다 어떤 새로운 이야기/코멘트를 게시합니다.

몇 분마다 cron 작업이 실행되며 (속도가 문제가 발생하면 다른 전용 서버에서 실행될 수 있음) "not_notified"테이블을 선택합니다. 단순히 모든 레코드 세트를 반복하고 각 event_id를 찾고, 이야기를 가져오고, 알림을받을 사용자의 알림 설정을 확인하고 사용자에게 전자 메일 알림을 보냅니다. 마지막으로 스크립트는 "not_notified"의 행을 삭제합니다.

아마 심지어 "not_notified"테이블이 필요하지 않습니다

- 그것뿐만 아니라 이벤트 테이블에 간단한 "새로운"필드 수행하지만, 그 테이블의 항목의 이미지 수백만 수 ...

생각?