Đối với một giải pháp thu hoạch như thế này, tôi muốn giới thiệu một cách tiếp cận nhiều giai đoạn. Redis giỏi giao tiếp thời gian thực . Redis được thiết kế như một kho lưu trữ khóa / giá trị trong bộ nhớ và thừa hưởng một số lợi ích rất tốt của việc trở thành một cơ sở dữ liệu bộ nhớ:các hoạt động danh sách O (1). Miễn là có RAM để sử dụng trên máy chủ, Redis sẽ không làm chậm việc đẩy đến cuối danh sách của bạn, điều này rất tốt khi bạn cần chèn các mục với tốc độ cực cao như vậy. Thật không may, Redis không thể hoạt động với các tập dữ liệu lớn hơn dung lượng RAM bạn có (nó chỉ ghi vào đĩa, việc đọc là để khởi động lại máy chủ hoặc trong trường hợp hệ thống gặp sự cố) và việc mở rộng quy mô phải do bạn thực hiện và ứng dụng của bạn . (Một cách phổ biến là rải các khóa trên nhiều máy chủ, được thực hiện bởi một số trình điều khiển Redis, đặc biệt là những trình điều khiển dành cho Ruby on Rails.) Redis cũng có hỗ trợ gửi thông báo đăng ký / xuất bản đơn giản, đôi khi có thể hữu ích.
Trong kịch bản này, Redis là "giai đoạn một." Đối với từng loại sự kiện cụ thể, bạn tạo một danh sách trong Redis với một tên duy nhất; ví dụ:chúng tôi có "trang đã xem" và "liên kết được nhấp." Để đơn giản, chúng tôi muốn đảm bảo dữ liệu trong mỗi danh sách có cấu trúc giống nhau; liên kết được nhấp có thể có mã người dùng, tên liên kết và URL, trong khi trang được xem có thể chỉ có mã người dùng và URL. Mối quan tâm đầu tiên của bạn là chỉ nhận ra thực tế là nó đã xảy ra và bất cứ điều gì hoàn toàn cần thiết dữ liệu bạn cần được đẩy.
Tiếp theo, chúng tôi có một số công nhân xử lý đơn giản lấy thông tin được chèn điên cuồng này khỏi tay của Redis, bằng cách yêu cầu nó lấy một mục ở cuối danh sách và giao nó. Nhân viên có thể thực hiện bất kỳ điều chỉnh / chống trùng lặp / tra cứu ID nào cần thiết để lưu trữ dữ liệu đúng cách và chuyển dữ liệu đó đến nơi lưu trữ lâu dài hơn. Hãy kích hoạt càng nhiều nhân viên này nếu bạn cần để giữ cho bộ nhớ của Redis có thể tải được. Bạn có thể viết các worker trong bất kỳ thứ gì bạn muốn (Node.js, C #, Java, ...) miễn là nó có trình điều khiển Redis (hầu hết các ngôn ngữ web hiện nay đều có) và một trình điều khiển để lưu trữ mong muốn của bạn (SQL, Mongo, v.v. )
MongoDB rất tốt trong việc lưu trữ tài liệu . Không giống như Redis, nó có thể xử lý các cơ sở dữ liệu lớn hơn RAM và nó hỗ trợ sharding / replication riêng. Một lợi thế của MongoDB so với các tùy chọn dựa trên SQL là bạn không phải có một lược đồ xác định trước, bạn có thể tự do thay đổi cách dữ liệu được lưu trữ theo cách bạn muốn bất cứ lúc nào.
Tuy nhiên, tôi sẽ đề xuất Redis hoặc Mongo cho giai đoạn "bước một" là giữ dữ liệu để xử lý và sử dụng thiết lập SQL truyền thống (có lẽ là Postgres hoặc MSSQL) để lưu trữ dữ liệu sau xử lý. Theo dõi hành vi của khách hàng nghe có vẻ giống như dữ liệu quan hệ đối với tôi, vì bạn có thể muốn chuyển sang phần "Cho tôi biết những người xem trang này" hoặc "Người này đã xem bao nhiêu trang vào ngày cụ thể này" hoặc "Tổng cộng ngày nào có nhiều người xem nhất? ". Thậm chí có thể có nhiều phép nối hoặc truy vấn phức tạp hơn cho các mục đích phân tích mà bạn đưa ra và các giải pháp SQL thuần thục có thể thực hiện rất nhiều việc lọc này cho bạn; NoSQL (cụ thể là Mongo hoặc Redis) không thể thực hiện các phép nối hoặc các truy vấn phức tạp trên các bộ dữ liệu khác nhau.