För en skördelösning som denna skulle jag rekommendera en flerstegsmetod. Redis är bra på realtidskommunikation . Redis är designad som ett nyckel-/värdelager i minnet och ärver några mycket trevliga fördelar med att vara en minnesdatabas:O(1) listoperationer. Så länge det finns RAM att använda på en server, kommer Redis inte att sakta ner tryckningen till slutet av dina listor, vilket är bra när du behöver infoga objekt i en sådan extrem takt. Tyvärr kan Redis inte arbeta med datauppsättningar som är större än mängden RAM-minne du har (det skriver bara till disk, läsning är för att starta om servern eller i händelse av en systemkrasch) och skalningen måste göras av du och din ansökan . (Ett vanligt sätt är att sprida nycklar över flera servrar, vilket implementeras av vissa Redis-drivrutiner, särskilt de för Ruby on Rails.) Redis har också stöd för enkla publicerings-/prenumerationsmeddelanden, vilket kan vara användbart ibland också.
I det här scenariot är Redis "steg ett." För varje specifik typ av händelse skapar du en lista i Redis med ett unikt namn; till exempel har vi "visad sida" och "klickad länk." För enkelhetens skull vill vi se till att data i varje lista har samma struktur; klickad länk kan ha en användartoken, länknamn och URL, medan sidan som visas bara kan ha användartoken och URL. Din första oro är bara att få det faktum att det hände och vad som än är absolut nödvändigt data du behöver pushas.
Därefter har vi några enkla bearbetningsarbetare som tar denna frenetiskt infogade information ur Redis händer, genom att be den ta bort ett föremål från slutet av listan och lämna över det. Arbetaren kan göra alla justeringar/deduplicering/ID-sökningar som behövs för att korrekt arkivera data och lämna över den till en mer permanent lagringsplats. Sätt igång så många av dessa arbetare som du behöver för att hålla Redis minnesbelastning uthärdlig. Du kan skriva arbetarna i vad du vill (Node.js, C#, Java, ...) så länge den har en Redis-drivrutin (de flesta webbspråk gör det nu) och en för önskad lagring (SQL, Mongo, etc. )
MongoDB är bra på dokumentlagring . Till skillnad från Redis kan den hantera databaser som är större än RAM och den stöder sönderdelning/replikering på egen hand. En fördel med MongoDB framför SQL-baserade alternativ är att du inte behöver ha ett förutbestämt schema, du är fri att ändra hur data lagras hur du vill när som helst.
Jag skulle dock föreslå Redis eller Mongo för "steg ett"-fasen att hålla data för bearbetning och använda en traditionell SQL-inställning (Postgres eller MSSQL, kanske) för att lagra efterbehandlad data. Att spåra klientbeteende låter som relationsdata för mig, eftersom du kanske vill välja "Visa mig alla som tittar på den här sidan" eller "Hur många sidor såg den här personen den här givna dagen" eller "Vilken dag hade flest tittare totalt? ". Det kan finnas ännu mer komplexa kopplingar eller frågor för analytiska syften du kommer på, och mogna SQL-lösningar kan göra mycket av denna filtrering åt dig; NoSQL (specifikt Mongo eller Redis) kan inte göra kopplingar eller komplexa frågor över olika uppsättningar data.