Hintergrund

Wir werden wahrscheinlich BigQuery verwenden, um unsere zu speichern unveränderliche Geschäftsereignisse, damit wir sie später auf andere Dienste übertragen können. Ich denke, dass ein Ansatz darin besteht, jedes Ereignis im Wesentlichen nur als Blob (mit einigen Metadaten) zu speichern. Um sie einfach wiederzugeben, wäre es natürlich schön, eine globale Reihenfolge unserer Ereignisse beizubehalten und jedes Ereignis in BigQuery an derselben Tabelle zu speichern. Wir haben wahrscheinlich ungefähr 10 Ereignisse pro Sekunde (was bei weitem nicht der Grenze von 100000 Nachrichten pro Sekunde entspricht).

Frage:

  1. Wäre es in Ordnung, einfach alle Ereignisse in derselben Tabelle beizubehalten?
  2. Wäre es vielleicht besser, Nachrichten in verschiedenen Tabellen zu speichern (möglicherweise basierend auf Ereignistyp, Thema oder Datum)?
  3. Wenn (2), ist es möglich, mehrere nach Zeit sortierte Tabellen zu verknüpfen / zu scannen, damit Ereignisse in derselben Reihenfolge wiedergegeben werden können?
0
Johan 3 Jän. 2016 im 17:23

2 Antworten

Beste Antwort

Wenn Sie das primäre Verwendungsszenario verwenden, um Ereignisse zu speichern und dann zu beantworten, gibt es keinen Grund, verschiedene Ereignistypen in verschiedene Tabellen aufzuteilen. Zumal jedes Ereignis ein undurchsichtiger Fleck ist. Wenn Sie sie alle in derselben Tabelle belassen, haben Sie nur einen geringen Vorteil darin, dass Sie Analysen nach Ereignistypen und anderen Metadaten durchführen können. Das Sharding nach Tagen ist sinnvoll, insbesondere wenn Sie sich die neuesten Daten ansehen. Auf diese Weise können Sie die Kosten für die BigQuery-Abfrage niedrig halten.

Aber ich war besorgt über Ihre Forderung, Ereignisse in der richtigen Reihenfolge zu beantworten. In BigQuery gibt es keinen Clustered-Index. Jedes Mal, wenn Sie auf Ihre Ereignisse antworten müssen, müssen Sie in Ihrer Abfrage den Befehl "ORDER BY-Zeitstempel" verwenden, der nur auf relativ kleine Datenmengen (mehrere zehn Megabyte) skaliert werden kann. Sie werden also viele Ereignisse wiederholen wollen - dieses Design funktioniert nicht für Sie.

1
Mosha Pasumansky 3 Jän. 2016 im 17:54

Ich bevorzuge es, eine Tabelle basierend auf dem Ereignistyp zu erstellen und die Zeit in der Ereignistabelle zu speichern. Sie können Tabellen mithilfe einer Beziehung verbinden (Primär-, Fremdschlüssel verwenden). Da sie auf Zeitbasis gespeichert sind, können Sie sie auch wiedergeben.

Punkte, an die Sie denken müssen:

  1. Unveränderliche Geschäftsereignisse geben Ihnen Parallelität. Sobald ein Ereignis akzeptiert und festgeschrieben wurde, wird es unveränderlich und kann überall kopiert werden.
  2. Die einzige Möglichkeit, ein Ereignis rückgängig zu machen, besteht darin, ein Ausgleichsereignis wie eine negative Transaktion in der Buchhaltung hinzuzufügen.

Hoffe, es ist nützlich für Sie.

1
Anburaj_N 3 Jän. 2016 im 14:47