문제

저는 NGO를 위한 영감을 주는 사이트에서 일할 예정이며, "Michael 추천"과 같은 이벤트를 통해 Facebook과 같은 이벤트 스트림을 구현하려고 합니다. 사과 파이”, “John이 댓글을 달았습니다. 초코 케이크”, “카라멜 퍼지 8시간 전에 Alice가 게시했습니다.” 등이 있습니다.

문제는 이러한 이벤트가 관심 기반이므로 누군가는 캐러멜과 체리에만 관심이 있고 사과 파이나 초콜릿 케이크를 보지 않아야 한다는 것입니다.이에 대한 많은 순열이 있으며 사용자의 개인화된 이벤트 스트림을 즉석에서 생성하는 것은 다소 비용이 많이 드는 데이터베이스 쿼리를 의미합니다.

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

이벤트에 대해 수백 명의 사용자의 선호도를 비교하는 데 필요한 작업은 상당하므로 작업을 트리거하는 POST 요청의 일부로 수행할 수 없으므로 한 번에 많은 작업을 수행해야 합니다. 다른 과정.지금 보고 있는 중 기어맨 이 작업에 대한 제안은 매우 환영합니다.

나는 나를 위해 내 일을 해줄 사람을 찾고 있는 것이 아니지만, 이런 종류의 건물을 만들어 본 경험이 있는 사람이 있다면 당신의 생각을 듣고 싶습니다.

도움이 되었습니까?

해결책

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

이벤트가 생성되는 것보다 더 자주 볼 수 있다는 가정하자면, 누군가가 뉴스 스트림을 요청할 때마다 이벤트가 발생할 때 이벤트가 발생할 때 이벤트의 잠재적 시청자를 계산하는 것이 합리적입니다.

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

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

내 간단한 해결책은 내 자신의 사용을 굴리는 것이 었습니다 Beanstalkd 그리고 내 자신의 PHP 스크립트.

다른 팁

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>

당신이 온통 지수가 있다고 가정하면 나에게 매우 무겁지 않은 것 같습니다.

이것은 적절한 색인으로 해결될 수 있는 것처럼 들립니다.데이터베이스가 이를 처리할 수 있다는 가정을 바탕으로 솔루션을 구축하겠지만, 데이터베이스 앞에 서비스를 배치하고 모든 클라이언트가 이 지점을 거치도록 합니다.작업 속도가 너무 느려지면 이 계층에 다양한 유형의 캐싱을 도입할 수 있습니다.대부분의 성능 결정과 마찬가지로 이를 바로 수행하려고 시도하는 것은 아마도 좋은 생각이 아닐 것입니다.

Facebook은 이런 종류의 일을하기 위해 자체 데이터베이스를 개발하고 공개적으로 공개했습니다. 볼만한 가치가 있습니다.

를 보셨나요? 활동 기준 치수?다음은 프로젝트 페이지에서 발췌한 내용입니다.

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

가까운 시일 내에 이런 일을 해야 하기 때문에 어떻게 생각하시는지 궁금합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top