2009-12-06 1 views
5

저는 NGO를위한 영감 사이트에서 일할 것입니다. "Michael recommended apple pie", "John은 초콜릿에 댓글을 달았습니다."와 같은 이벤트를 통해 일종의 Facebook-esque 이벤트 스트림을 구현하려고합니다. 케이크 ","카라멜 등 "앨리스에 의해 1 시간 전 게시 퍼지,맞춤 이벤트 스트림을 구현하는 방법은 무엇입니까?

것은 사람 만 캐러멜, 체리 관심이와 애플 파이를 참조해서는 안 이러한 이벤트가 관심 기반이라는 것이다 또는 초콜릿 케이크. 이것에 대한 많은 순열이 있으며 사용자의 맞춤 이벤트 스트림을 즉시 생성하는 것은 다소 비싼 데이터베이스 쿼리를 의미합니다.

내 사고는 액션 이벤트가 발생할 때마다 일종의 백그라운드 처리를 수행하여 수신 사용자와 게시 된 이벤트 (아마도 간단한 SQL JOIN 테이블) 사이의 관계를 미리 생성하는 것이 었습니다.

이벤트에 대해 수백 명의 사용자의 환경 설정을 평가하는 데 필요한 작업은 상당 할 것이므로 작업을 트리거하는 POST 요청의 일부로 수행 할 수 없으므로 많은 작업을 수행해야합니다. 다른 과정에서의 작업. 현재이 작업을 위해 Gearman을보고 있습니다.하지만 제안은 매우 열려 있습니다.

나는 나를 위해 일하는 사람을 찾고 있지 않지만, 이런 일을하는 데 이전에 경험이있는 사람이 있다면, 나는 당신의 생각을 듣고 싶습니다.

+0

각주로, 우리는 [Drupal] (http://drupal.org/), PHP 및 MySQL 위에이 모든 것을 구축하고 있습니다. 그러나이 작업은 드루팔 (Drupal)과 관련이 없기 때문에 우리는 문제의 아웃. 따라서 이러한 종류의 스트림에 대한 경험이 있다면 다음을 공유하십시오. – mikl

답변

2

소셜 네트워킹 사이트에서 뉴스 스트림을 제작 한 경험이 많았습니다. 여러 가지 유형의 이벤트와 여러 수준의 관심 (또는 개인 정보 설정 또는 사용자 권한)이있을 때 쿼리가 매우 복잡해질 수 있습니다. .

이벤트가 생성되는 것보다 더 자주 본다고 가정 할 때 누군가가 뉴스 스트림을 요청할 때가 아니라 비정규 화를 수행하고 이벤트가 발생할 때 잠재적 인 시청자를 계산하는 것이 이치에 맞습니다.

이 이벤트 객체 (제작자와 관련 있음)를 간단한 메시지 객체 (독자, 뉴스 스트림에서 볼 수있는 사람들과 관련 있음)로 변환하는 백그라운드 프로세스를 실행하는 것이 좋습니다. 결국 이벤트 당 많은 메시지로 끝날 수 있지만 프런트 엔드로의 요청이 훨씬 빨라지고 작업을 백그라운드 프로세스로 오프로드합니다.

Gearman을 사용하지는 않았지만 앱의 환경을 백그라운드 프로세스에로드하고 대기열을 통해 처리 할 이벤트를 수신 할 수있는 일종의 것이라면 좋은 생각 일 수 있습니다.

내 간단한 해결책은 beanstalkd과 내 자신의 PHP 스크립트를 사용하여 내 자신을 롤업하는 것이 었습니다.

+0

제안을 주셔서 감사합니다. Beanstalk를 살펴 보겠습니다 :) – mikl

1

은 DB가 어떻게 구성되어 있는지 (더 우리에게 얘기를 할 수 있습니다) 모르겠어요,하지만 뭔가 확실한

SELECT events.* FROM events, event_tags, user_tags 
    WHERE event_tags.event_id = events.id 
     AND event_tags.tag_id = user_tags.tag_id 
     AND user_tags.user_id = <$user_id> 

처럼 당신이 모든을 통해 인덱스를 가지고 가정, 나에게 매우 무거운하지 않는 것 place

+0

그래, 이벤트를 직접 쿼리 할 수 ​​있으면 좋겠지 만 태그, 키워드, 작성자, 권장 사항, 주석 및 사용 패턴을 고려할 때 고려해야 할 사항의 양을 감안할 때 향후 변경 사항에 대해 유연성을 유지하면서 효율적인 색인을 작성할 수는 없을 것이라고 생각합니다. 나는 틀린 입증되고 싶다. – mikl

1

이것은 적절한 색인으로 해결할 수있는 것처럼 들립니다. 데이터베이스가 처리 할 수 ​​있다는 가정하에 솔루션을 구축 하겠지만 데이터베이스 앞에 서비스를 배치하고 모든 클라이언트가이 지점을 통과하도록하십시오. 일이 너무 느리게 시작되면이 레이어에 다양한 유형의 캐싱을 도입 할 수 있습니다. 대부분의 퍼포먼스 결정과 마찬가지로, 바로 앞에서 시도하는 것은 좋은 생각이 아닙니다.

+0

고려해야 할 데이터의 복잡성과 양 (Stereofrog에 대한 나의 답변 참조)을 감안할 때, 15-30 개의 JOIN을 수행 할 필요없이 그러한 인덱스가 어떻게 생성되는지 실제로 볼 수는 없습니다 ... MySQL이 가능하다는 가정하에 많은 질문을 처리하기 위해 내 의견으로는 문제를 간절히 원할 것입니다. :) – mikl

1

페이스 북은 이런 종류의 일을하고 오픈 소스를 만들 자신의 데이터베이스를 개발했습니다. 그것에 대해 많이 알지는 못하지만, worth a look일지도 모릅니다.

+0

제 생각에 카산드라는 주로 스트림 데이터의 저장 메커니즘이며, 생성에 관련된 모든 것이 아닙니다. – mikl

1

Activity 모듈을 보았습니까? 프로젝트 페이지에서 발췌 한 내용은 다음과 같습니다.

... 사람들이 사이트에서하는 일을 추적하고 이러한 활동의 ​​미니 피드를 블록, 특수 테이블 및 RSS를 통해 제공합니다. 이 모듈은 다른 모듈이 모듈과 통합 될 수 있도록 확장 가능합니다. 생성 된 메시지는 관리 인터페이스를 통해 사용자 정의 할 수 있으며 상황에 따라 다릅니다.

반쯤 가까운 미래에 이런 일을해야하기 때문에 내가 어떻게 될지 궁금해 할 것입니다.

+0

아니요,하지만 제가 확인해 드리겠습니다. 감사합니다 :) – mikl