Entwerfen von "Social-Feed" in DynamoDB

8

Diese Frage könnte für jede dokumentenbasierte NoSQL-Datenbank relevant sein.

Ich mache ein interessantes soziales Netzwerk und entschied mich aufgrund der Skalierbarkeit und der No-Pain-Administrationsfaktoren für DynamoDB. Es gibt nur zwei Hauptelemente in der Datenbank: Benutzer und Beiträge .

Voraussetzung für häufige Abfragen sind sehr einfach:

  • Home-Feed (Feed von Personen, denen ich folge)
  • Mein / Benutzer-Feed (mein Feed oder ein bestimmter Nutzer-Feed)
  • Liste der Benutzer I / Benutzer gefolgt
  • Liste der Follower

Hier ist ein Datenbankschema, das ich bis jetzt gefunden habe (Legende: __thisIsHashKey und _thisIsRangeKey ):

%Vor%

Wie Sie sehen, habe ich meinen gesamten Post direkt in der Timeline-Sammlung gespeichert. Auf diese Weise kann ich nach Posts suchen, die Datum und Benutzername verwenden (Hash- und Bereichsschlüssel). Alles scheint in Ordnung, aber hier ist das Problem :

Ich kann die User-Timeline nicht in einem Schritt abfragen. Dies wird eine der gefragtesten Abfragen nach System sein, und ich kann keinen effizienten Weg dafür bieten. Bitte helfen Sie. Danke.

    
totocaster 19.01.2013, 11:29
quelle

2 Antworten

1

Ich würde die Titan Graph Datenbank ( Ссылка ) und Neo4j ( Ссылка ).

Ich weiß, dass Titan behauptet, mit großen Datenmengen ziemlich gut skaliert zu werden.

Letztendlich denke ich, dass Ihr Modell gut zu einer Grafik passt. Benutzer und Posts wären Knoten, und Sie können sie dann beliebig über Kanten verbinden. Ein Benutzer (Knoten) ist ein Freund (eine Kante) eines anderen Benutzers (Knotens).

Ein Benutzer (Knoten) hat viele Beiträge (Knoten) in seiner Zeitleiste. Dann können Sie interessante Traversale über das Diagramm ausführen.

    
ryan1234 01.03.2013 06:06
quelle
0

Ich arbeite täglich mit News-Feeds. (Autor von Stream-Framework und gegründetes getstream.io)

Die häufigsten Lösungen, die ich sehe, sind:

  • Cassandra (Instagram)
  • Redis (teuer, aber einfach)
  • MongoDB
  • DynamoDB
  • RocksDB (Linkedin)

Die meisten Leute benutzen entweder einen Fanout beim Schreiben oder einen Fanout beim Lesen. Dies macht es einfacher, eine funktionierende Lösung zu bauen, aber es kann schnell teuer werden. Ihre beste Wette ist es, eine Kombination dieser beiden Ansätze zu verwenden. In den meisten Fällen wird ein Fanout-Vorgang ausgeführt, bei sehr populären Feeds bleiben sie jedoch im Speicher.

Stream-Framework ist Open Source und unterstützt Cassandra / Redis & amp; Python

getstream.io ist eine gehostete Lösung, die auf Go & amp; Rocksdb.

Wenn Sie mit der Verwendung von DynamoDB fertig sind, stellen Sie sicher, dass Sie den richtigen Partitionsschlüssel eingerichtet haben: Ссылка

Beachten Sie auch, dass eine auf Redis oder DynamoDB basierende Lösung ziemlich schnell teuer wird. Sie erhalten die niedrigsten Kosten pro Benutzer, indem Sie Cassandra oder RocksDB nutzen.

    
Thierry 13.12.2017 23:43
quelle