복붙노트

[RUBY-ON-RAILS] 사회 활동 스트림을 구현하는 가장 좋은 방법은 무엇입니까? [닫은]

RUBY-ON-RAILS

사회 활동 스트림을 구현하는 가장 좋은 방법은 무엇입니까? [닫은]

나는있는 사회 활동 스트림 (페이스 북은 가장 유명한 예이다)을 구현하는 가장 좋은 방법입니다 귀하의 의견을 듣고에 관심이 있어요. 관련 문제 / 과제는 다음과 같습니다

... 좀 더, 페이스 북 ( "사용자 X, Y 및 Z는 그 사진에 댓글을"하나에 여러 개의 작업 항목을 결합, 예를 들어, 마찬가지로 당신이 세련 높은 수준에 걸릴 특히

등 이러한 시스템, 데이터 모델을 구현하는 가장 유연하고 효율적이며 강력한 접근 방식에 등 패턴, 논문, 어떤 생각이나 포인터를 감상 할 수있다.

문제의 대부분은 플랫폼에 독립적이지만, 기회는 내가 루비 온 레일즈에 이러한 시스템을 구현 끝낼 수 있습니다

해결법

  1. ==============================

    1.나는 그런 시스템을 만든 나는이 방법을했다 :

    나는 그런 시스템을 만든 나는이 방법을했다 :

    다음과 같은 열이 데이터베이스 테이블 : 아이디, userId를 입력, 데이터, 시간.

    이것은 검색 / 조회를 제한하면 사용자, 시간, 활동 유형, 피드에서 할 수 있지만, 페이스 북 형 활동 피드에이 정말 제한되지 않습니다. 그리고 테이블에 올바른 인덱스로 조회가 빠르다.

    이 디자인을 사용하면 이벤트의 각 유형 요구해야 메타 데이터할지 결정해야합니다. 예를 들어 새로운 사진에 대한 피드 활동은 다음과 같을 수 있습니다 :

    {id:1, userId:1, type:PHOTO, time:2008-10-15 12:00:00, data:{photoId:2089, photoName:A trip to the beach}}
    

    당신이 할 싶지 않기 때문에, 나는 메타 데이터 필드에 이름을 중복 것입니다, 사진의 이름을 가장 확실하게 사진을 포함하는 다른 테이블에 저장되어 있지만 당신은 그것을 볼 수있다, 나는 거기에서 이름을 검색 할 수 당신이 속도를 원하는 경우 어떤 다른 데이터베이스 테이블에 조인. 그리고 표시하기 위해, 50 다른 사용자의 (200), 다양한 이벤트, 당신은 속도를 필요로 말한다.

    그 때 나는 활동 항목의 다른 유형을 렌더링하기위한 기본 FeedActivity 클래스를 확장하는 클래스가 있습니다. 뿐만 아니라, 렌더링 코드에 내장 될 이벤트의 그룹화하면 데이터베이스에서 복잡성을 멀리 유지합니다.

  2. ==============================

    2.이 Etsy.com 자신의 활동 스트림을 구조화하는 방법을 요약 아주 좋은 표현이다. 이 특정 레일 아니에요하지만 그것은, 내가 주제에 발견 한 가장 좋은 예입니다.

    이 Etsy.com 자신의 활동 스트림을 구조화하는 방법을 요약 아주 좋은 표현이다. 이 특정 레일 아니에요하지만 그것은, 내가 주제에 발견 한 가장 좋은 예입니다.

    http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture

  3. ==============================

    3.우리는 열려있는 우리의 접근을 공급했습니다 : https://github.com/tschellenbach/Stream-Framework 그것은 현재이 문제를 해결하기위한 가장 큰 오픈 소스 라이브러리입니다.

    우리는 열려있는 우리의 접근을 공급했습니다 : https://github.com/tschellenbach/Stream-Framework 그것은 현재이 문제를 해결하기위한 가장 큰 오픈 소스 라이브러리입니다.

    스트림 프레임 워크를 구축 같은 팀은 또한 당신을 위해 복잡성을 처리하는 호스트 API를 제공합니다. getstream.io에서보세요 노드, 파이썬, 레일 및 PHP에 해당하는 고객이있다.

    또한이 높은 확장 성 게시물 봐 가지고 있었다 우리는 관련된 설계 결정의 일부를 설명합니다 : http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html

    이 튜토리얼은 레디 스를 사용하여 클립 서비스의 공급과 같은 시스템 당신에게 설치를 도움이 될 것입니다. 그것은 시작하는 것은 매우 쉽습니다.

    내가보기 엔 우리가 Feedly의 기반 기사의 일부를 읽어 보시기 바랍니다 더 피드 디자인에 대한 자세한 내용을 보려면 :

    스트림 프레임 워크가 파이썬을 기반으로하지만 루비 응용 프로그램에서 사용하기에 너무 어렵지 않을 것입니다. 당신은 단순히 서비스로 실행하고 그것의 앞에 작은 HTTP API를 부착 할 수있다. 우리는 다른 언어에서 액세스 Feedly의에 API를 추가하는 것을 고려하고있다. 지금이 순간 당신은 역할에 자신의 생각을해야합니다.

  4. ==============================

    4.이벤트 스트림의 가장 큰 문제는 가시성과 성능이다; 당신은 이벤트가 특정 사용자 만 흥미로운 것들로 표시 제한해야, 당신은 그것을 통해 분류하고 해당 이벤트는 관리가 식별하는 데 걸리는 시간을 유지해야합니다. 나는 자그마한 소셜 네트워크를 구축했습니다; 나는 데이터베이스 작업에 "이벤트"테이블을 유지, 작은 규모에서 그 발견하지만, 중간 부하 성능 문제로 얻을 수있다.

    이벤트 스트림의 가장 큰 문제는 가시성과 성능이다; 당신은 이벤트가 특정 사용자 만 흥미로운 것들로 표시 제한해야, 당신은 그것을 통해 분류하고 해당 이벤트는 관리가 식별하는 데 걸리는 시간을 유지해야합니다. 나는 자그마한 소셜 네트워크를 구축했습니다; 나는 데이터베이스 작업에 "이벤트"테이블을 유지, 작은 규모에서 그 발견하지만, 중간 부하 성능 문제로 얻을 수있다.

    메시지와 사용자의 큰 흐름으로, 그것은 이벤트가 개별 프로파일에 대한 메시지로 전송되는 메시징 시스템으로 갈 아마 가장 좋습니다. 당신은 쉽게 사람들의 이벤트 스트림을 구독하고 아주 쉽게 이전 이벤트를 볼 수 있지만, 특정 사용자에 대한 스트림을 렌더링 할 때 당신은 단순히 메시지의 작은 그룹을 렌더링하는 수 없다는이 의미합니다.

    나는 이것이 트위터의 원래 디자인이었다 나는 그들이에 끌어와 자신의 이벤트를 필터링 할 수있는 데이터베이스를 타격 한 것을 읽고 기억 flaw- 생각합니다. 이 가진 모든 건축과 (불행히도) 밈 "를 확장하지 않습니다 루비"를 낳았다 레일, 함께 할 수있는 아무것도 할 수 있습니다. 최근 개발자가 트위터와 같은 응용 프로그램이 당신의 부하가 충분히 높은 경우는, 가치 시스템의 한 부분으로 SQS를 조사 할 수있다 capabilities- 훨씬 높은 확장 성을 가질 것이기 메시징 백엔드로 아마존의 심플 큐 서비스를 사용하는 프리젠 테이션을 보았다 .

  5. ==============================

    5.별도의 소프트웨어를 사용하고자하는 경우에 나는 정확히 (neo4j 그래프 데이터 기반 위에 구축) 활동 스트림에 대한 문제를 해결 Graphity 서버를 제안한다.

    별도의 소프트웨어를 사용하고자하는 경우에 나는 정확히 (neo4j 그래프 데이터 기반 위에 구축) 활동 스트림에 대한 문제를 해결 Graphity 서버를 제안한다.

    http://www.rene-pickhardt.de/graphity-server-for-social-activity-streams-released-gplv3 : 알고리즘은 사용자가 활동 스트림을 제공하기 위해 자신의 서버를 호스팅 할 수 있도록 독립형 REST 서버로 구현 된 /

    종이 및 벤치 마크에서 나는 뉴스를 검색하기 만하면 데이터를 비정규에서 얻을만한 중복없이 검색 할 항목의 양에 선형 의존 스트림 것을 보여 주었다 :

    http://www.rene-pickhardt.de/graphity-an-efficient-graph-model-for-retrieving-the-top-k-news-feeds-for-users-in-social-networks/

    위의 링크에 당신이 스크린 캐스트 및이 방법의 벤치 마크를 찾을 수 있습니다 (즉, graphity을 보여주는 것은 초당 이상 10,000 스트림을 검색 할 수있다).

  6. ==============================

    6.나는이에있어 어디 여기,이 어제 같은 시스템을 구현하기 시작했다 ...

    나는이에있어 어디 여기,이 어제 같은 시스템을 구현하기 시작했다 ...

    나는 특성을 가진 StreamEvent 클래스를 생성 아이디, ActorId, 유형 ID, 날짜, ObjectId가 추가 세부 사항 키 / 값 쌍의 해시 테이블. 이것은 StreamEvent 테이블 (ID, ActorId, 유형 ID, 날짜, ObjectId가)와 StreamEventDetails 테이블 (StreamEventId, DetailKey, DetailValue)에 의해 데이터베이스에 표시됩니다.

    주체 - 동사 - 개체 이벤트가 캡처 (나중에 쿼리) 수의 ActorId, 유형 ID와 ObjectId가 허용. 각 동작은 몇 StreamEvent 인스턴스가 생성되고이 발생할 수 있습니다.

    나는 그 사건의 StreamEvent의 각 유형, 예를 들어,에 대한 하위 클래스를 만들었습니다 LoginEvent, PictureCommentEvent. 이러한 서브 클래스 각각은 실제로 해시 테이블 / StreamEventDetail 테이블의 키 / 값 쌍으로 저장되는 등 (이벤트를 위해 필요한대로) 등 PictureId, 섬네일, CommenText 같은 더 특정 컨텍스트 특성을 갖는다.

    데이터베이스에서 다시 이러한 이벤트를 당길 때 나는 공장합니다 (유형 ID 기준) 방법 올바른 StreamEvent 클래스를 만들 수를 사용합니다.

    StreamEvent 각각의 서브 클래스가 전달 StreamContext 클래스에 기초하여 화면에 이벤트를 출력하는 렌더링 (콘텍스트로 StreamContext) 메소드를 갖는다. StreamContext 클래스는 옵션보기의 상황에 기초하여 설정 될 수 있습니다. 당신은 홈페이지 목록에 예를 들어 페이스 북에서 뉴스 피드를 보는 경우 fullnames (자신의 프로필 링크), 각 작업에 관련된 모든 사람의 친구의 피드를 보는 반면, 당신은 단지 자신의 이름을 참조 (하지만 다른 배우의 전체 이름) .

    나는 집계 피드 (페이스 북 홈) 아직 구현하지 않은하지만 난 '음, 당신이 흥미를 찾을 수있는'알고리즘의 어떤 종류를 기반으로 채워집니다 필드 사용자 아이디, StreamEventId이있는 AggregateFeed 테이블을 만듭니다 상상한다.

    모든 의견은 대규모 감상 할 수있다.

  7. ==============================

    7.

    // one entry per actual event
    events {
      id, timestamp, type, data
    }
    
    // one entry per event, per feed containing that event
    events_feeds {
      event_id, feed_id
    }
    

    이벤트가 생성 될 때, 그것은에 나타나는 피드 결정하고 events_feeds에 사람들을 추가 할 수 있습니다. 피드를 얻으려면, events_feeds 선택 타임 스탬프, 이벤트에 조인 순서. 필터링 및 집계는 그 쿼리의 결과를 수행 할 수 있습니다. 이 모델을 사용하면 별도의 작업으로 생성 후 이벤트 속성을 변경할 수 있습니다.

  8. ==============================

    8.당신은 당신이 레일에서 구현하는 거라고 결정했다면, 아마 당신은 유용한 플러그인 다음을 찾을 수 있습니다 :

    당신은 당신이 레일에서 구현하는 거라고 결정했다면, 아마 당신은 유용한 플러그인 다음을 찾을 수 있습니다 :

    ActivityStreams : http://github.com/face/activity_streams/tree/master

    다른 건 몰라도, 당신은 데이터 모델뿐만 아니라 밀고 활동을 당겨 위해 제공되는 API의 측면에서 모두 구현 보는거야.

  9. ==============================

    9.주어진 활동 스트림에 표시되는 모든 데이터를 포함하는 비정규 테이블 - 나는 헤이먼의 그것과 유사한 접근 방식을 가지고 있었다. 그것은 제한된 활동과 함께 작은 사이트에 대한 벌금을 작동합니다.

    주어진 활동 스트림에 표시되는 모든 데이터를 포함하는 비정규 테이블 - 나는 헤이먼의 그것과 유사한 접근 방식을 가지고 있었다. 그것은 제한된 활동과 함께 작은 사이트에 대한 벌금을 작동합니다.

    위에서 언급 한 바와 같이,이 사이트가 성장함에 따라 얼굴 확장 성 문제로 보인다. 개인적으로, 나는 지금 스케일링 문제에 대해 걱정하고 있지 않다. 나는 나중에 걱정 것이다.

    나는 그것이 훌륭한 콘텐츠의 톤을 가지고 당신이, 자신의 엔지니어링 블로그를 읽을 것을 권장합니다 그래서 페이스 북은 분명히 스케일링의 훌륭한 일을했다 -> http://www.facebook.com/notes.php?id=9445547199

    제가 위에서 언급 한 비정규 테이블보다 더 나은 솔루션으로 찾고있다. 나는이 달성의 발견 또 다른 방법은 하나의 행으로 주어진 활동 스트림에있을 것입니다 모든 콘텐츠를 응축하는 것입니다. 그것은 XML, JSON, 또는 응용 프로그램에서 읽을 수있는 몇 가지 직렬화 형식으로 저장 될 수있다. 업데이트 과정이 너무 간단 할 것입니다. 활동시, (아마도 아마존 SQS 또는 뭔가 다른 사용) 큐에 새로운 활동을 배치하고 지속적으로 다음 항목에 대한 큐를 폴링. 항목, 구문 분석, 데이터베이스에 저장된 적절한 공급 객체에 그 내용을 것을 잡아.

    이 방법에 대한 좋은 것은 당신이 단지 특정 피드가 아니라 일련의 테이블을 잡는 것보다, 요청 될 때마다 단일 데이터베이스 테이블을 읽을 필요가있다. 또한, 당신이 목록을 업데이트 할 때마다 가장 오래된 활동 항목에 떨어져 팝업 될 수 있으므로 활동의 유한 목록을 유지할 수 있습니다.

    도움이 되었기를 바랍니다! :)

  10. ==============================

    10.이러한 활동 스트림 약 2 railscasts이 있습니다 :

    이러한 활동 스트림 약 2 railscasts이 있습니다 :

    이러한 솔루션은 귀하의 모든 요구 사항을 포함 해달라고하지만, 그것은 당신에게 몇 가지 아이디어를 제공해야합니다.

  11. ==============================

    11.나는 소리 접촉의 접근 방식은 흥미 롭다 생각한다 : 그들은 Google 금융의 주식 차트처럼 많이 보이는 형식으로 전체 타임 라인을 제공합니다.

    나는 소리 접촉의 접근 방식은 흥미 롭다 생각한다 : 그들은 Google 금융의 주식 차트처럼 많이 보이는 형식으로 전체 타임 라인을 제공합니다.

    그것은 소셜 네트워킹 네트워크가 작동하는 방식을 볼 수 닝 보는 가치가있을 수 있습니다. 개발자 페이지는 특히 도움이 보인다.

  12. ==============================

    12.나는 몇 달 전에이 문제를 해결,하지만 난 내 구현이 너무 기본적인 생각합니다. 나는 다음과 같은 모델을 만들어 :

    나는 몇 달 전에이 문제를 해결,하지만 난 내 구현이 너무 기본적인 생각합니다. 나는 다음과 같은 모델을 만들어 :

    HISTORY_TYPE
    
    ID           - The id of the history type
    NAME         - The name (type of the history)
    DESCRIPTION  - A description
    
    HISTORY_MESSAGES
    
    ID
    HISTORY_TYPE - A message of history belongs to a history type
    MESSAGE      - The message to print, I put variables to be replaced by the actual values
    
    HISTORY_ACTIVITY
    
    ID
    MESSAGE_ID    - The message ID to use
    VALUES        - The data to use
    

    MESSAGE_ID_1 => "User %{user} created a new entry"
    ACTIVITY_ID_1 => MESSAGE_ID = 1, VALUES = {user: "Rodrigo"}
    
  13. ==============================

    13.활동을 구현하는 사회 피드, 마이크로 블로깅을 가능하게 스트림 및 협업은 여러 응용 프로그램에 제공 한 후, 나는 기본 기능은 매우 일반적이며, 당신은 API를 통해 활용하는 것을 외부 서비스로 전환 될 수 있다는 것을 깨달았다. 프로덕션 응용 프로그램에 스트림을 구축 할 경우 이동하는 가장 좋은 방법이 될 수있는 검증 된 서비스를 활용, 독특한 또는 깊이 복잡한 요구 사항이 없습니다. 나는 확실히 관계형 데이터베이스의 상단에 자신의 간단한 솔루션을 압연을 통해 생산 응용 프로그램이 추천 할 것입니다.

    활동을 구현하는 사회 피드, 마이크로 블로깅을 가능하게 스트림 및 협업은 여러 응용 프로그램에 제공 한 후, 나는 기본 기능은 매우 일반적이며, 당신은 API를 통해 활용하는 것을 외부 서비스로 전환 될 수 있다는 것을 깨달았다. 프로덕션 응용 프로그램에 스트림을 구축 할 경우 이동하는 가장 좋은 방법이 될 수있는 검증 된 서비스를 활용, 독특한 또는 깊이 복잡한 요구 사항이 없습니다. 나는 확실히 관계형 데이터베이스의 상단에 자신의 간단한 솔루션을 압연을 통해 생산 응용 프로그램이 추천 할 것입니다.

    우리 회사 Collabinate는 (http://www.collabinate.com)이 실현 밖으로 성장하고, 우리는 그것을 달성하기 위해 그래프 데이터베이스의 상단에 확장 성, 고성능 활동 스트림 엔진을 구현했습니다. 우리는 실제로 엔진을 구축하기 (여기에 대한 답변을 제공 @RenePickhardt의 초기 작품에서 적응)이 Graphity 알고리즘의 변형을 이용했다.

    당신이 엔진을 직접 호스트 또는 전문 기능을 필요로 할 경우가있는 거 환영을 살펴보고, 그래서 핵심 코드는 비상업적 인 목적으로 오픈 소스는 사실이다.

  14. from https://stackoverflow.com/questions/202198/whats-the-best-manner-of-implementing-a-social-activity-stream by cc-by-sa and MIT license