2012-04-08 17 views
0

Ich erstelle ein Server-Back-End für ein mobiles soziales Netzwerk mit Windows Azure.Denormalisierung von Chatnachrichten in Azure-Tabellen

Ich habe diese drei Einheiten:

  1. Benutzer - Stored in SQL Azure
  2. Threads (Art der Beziehungen zwischen 2 Benutzer, die dann in der Lage sind, sich gegenseitig Nachrichten senden) - Stored in SQL zu
  3. Nachrichten - Stored in Azure Tabellen

Wie speichere ich Nachrichten in Azure Tabellen von Thread-ID partitioniert erwarte ich eine gute Leistung beim Chatten (Senden/Lesen von Nachrichten an/von Threads).

Aber ich muss auch in der Lage sein, Benutzern eine Liste der neuesten Threads zur Verfügung zu stellen (recent = enthält die neueste Nachricht). Mit anderen Worten muss ich Threads bis zum letzten Nachrichtendatum beim Anzeigen bestellen.

Scannen viele verschiedene Tabellenpartitionen und die Suche nach den Nachrichten wird offensichtlich Leistung Killer sein, so muss ich irgendwie Daten zu anderen Tabellenpartitionen denormalisieren, um die neuesten Threads effizient abrufen zu können.

Was basierend auf Ihrer Erfahrung ist die beste Strategie?

Antwort

0

Edit: nach weiterem Denken, hier ist ein besserer Vorschlag (glaube ich):

hat eine Nachricht ATS-Tabelle. Diese Tabelle enthält zwei Arten von Nachrichten: Nachricht gesendet und Nachricht empfangen. Jedes Mal, wenn ein Benutzer eine Nachricht sendet, speichern Sie sie in der Tabelle als "Gesendet" und dann als "Empfangen" (oder wie immer Sie diese Typen aufrufen möchten).

Partition alle Nachrichten in der Nachrichten Tabelle folgende:

(UserId) - PartitionKey (long.Max - Timestamp.Ticks) - RowKey

Als zusätzliche Eigenschaften, die Sie ThreadId speichern kann, Unterscheidung gesendet/empfangen usw.

Wenn Sie sicherstellen möchten, dass Ihre Nachricht zweimal ohne Probleme eingefügt wird, verwenden Sie die Warteschlangen- und die Worker-Rolle.

Dieses Schema unterteilt alles durch den Benutzer. Sie können alle Nachrichten zu/von diesem Benutzer innerhalb eines Zeitbereichs und immer absteigend anzeigen.

+0

Hallo, Igorek und danke für die Antwort! Das Problem, das ich in der Lösung sehe, ist, dass jedes Mal, wenn ein Benutzer eine Nachricht in den Thread schreibt, ich SQL Azure abfragen muss, um den Zeitstempel der Konversation in der Thread-Tabelle zu aktualisieren. Was den Vorteil der Verwendung von Azure-Tabellen irgendwie ausgleicht - die Skalierbarkeit ... –

+0

Einverstanden. Ich bearbeite meine Hauptreaktion – Igorek

+0

Igorek, danke für die Aktualisierung der Antwort. Basierend darauf habe ich etwas sehr ähnliches implementiert, was gut funktioniert, also habe ich deine Antwort akzeptiert. Allerdings fand ich die Diskussion, die Sie mit FlorinDumitrescu hatten (http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/6a745a22-540a-44d5-b426-d42dd8510da5) und war verwirrt über meine vorherigen "Tabellen -mehr skalierbare "Weltanschauung. Also werde ich es googlen und schließlich eine neue Diskussion darüber starten ... –

0

Die Auswahl einer Batch-Prozesslösung ist immer ein Workaround und erinnert mich an alte Computer wie Mainframe. Es gibt nichts, das Online-/Echtzeitsystem ersetzen kann.

Wenn Sie sich für eine Batch-Lösung entscheiden, wird Ihr System nach dem Start obsolet und jede technologische Innovation in der Zukunft verhindert.

Wenn Ihre Azure-Datenbanken für Abfragen zu groß werden, empfiehlt Microsoft die Verwendung von Föderationen. Grundsätzlich bedeutet das, dass Sie Ihre Daten auf mehrere Datenbanken aufteilen und eine kompatible Zugriffslogik im Code verwenden.

Start bei dieser Demo-Anwendung, indem Sie: SQL Azure Federations Tutorial -- Entity Framework

+0

Hallo und danke für die Antwort!Wenn ich Ihre Antwort richtig verstehe, halten Sie Azure Tables grundsätzlich für veraltet und empfehlen stattdessen die Verwendung von Föderationen. –

+1

@Martin Šťáva, Azure-Tabellen sind nicht veraltet, aber vom Durchsatz her nicht sehr skalierbar. Ihr Skalierbarkeitslimit beträgt [5000 Operationen/Sekunde] (http://blogs.msdn.com/b/windowsazurestorage/archive/2010/05/10/windows-azure-storage-abstractions-and-their-scalability-targets.aspx)) während Sql Azure Federations [viel höher] gehen können (http://www.ducons.com/blog/benchmarking-throughput-and-scalability-on-sql-azure-federations). Wählen Sie Föderationen, wenn Sie die Flexibilität von Azure Sql und hohe Skalierbarkeit benötigen. Wählen Sie Tabellenspeicher, wenn Sie bei großen Datenmengen einen niedrigen Preis benötigen. –

+0

@FlorinDumitrescu, danke für deine Antwort, die ich sehr wichtig finde. Ich habe eine Diskussion gefunden, die Sie hier begonnen haben: http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/6a745a22-540a-44d5-b426-d42dd8510da5. Ich muss darauf hinweisen, dass die Tatsache, dass der azurblaue Tabellenspeicher weniger skalierbar zu sein scheint, mich ebenso überrascht wie die Skalierbarkeit, die den Hauptvorteil gegenüber dem SQL Azure darstellt. Aus diesem Grund erschien es mir naheliegend, das Messaging auf Azure Tables zu basieren. Könnten Sie möglicherweise mehr zu diesem Thema ausführen? Haben Sie von Microsoft eine Antwort auf dieses Thema erhalten? Vielen Dank! –