5

Tôi đang thiết kế một hệ thống cần phân tích số lượng lớn các giao dịch người dùng và tạo ra các biện pháp tổng hợp (chẳng hạn như xu hướng và vv). Hệ thống sẽ hoạt động nhanh, mạnh mẽ và có thể mở rộng. Hệ thống dựa trên java (trên Linux).Thiết kế hệ thống xử lý phân tích thời gian thực

Dữ liệu đến từ hệ thống tạo tệp nhật ký (dựa trên CSV) của giao dịch người dùng. Hệ thống tạo tệp mỗi phút và mỗi tệp chứa giao dịch của những người dùng khác nhau (được sắp xếp theo thời gian), mỗi tệp có thể chứa hàng nghìn người dùng.

Một cấu trúc dữ liệu mẫu cho một tập tin CSV:

10: 30: 01, sử dụng 1 ...
10: 30: 01, sử dụng 1 ...
10:30:02 , người dùng 78, ...
10: 30: 02, người dùng 2, ...
10: 30: 03, người dùng 1, ...
10: 30: 04, người dùng 2, ...
. . .

Hệ thống tôi đang lập kế hoạch sẽ xử lý các tệp và thực hiện một số phân tích trong thời gian thực. Nó phải thu thập đầu vào, gửi nó đến một số thuật toán và các hệ thống khác và lưu trữ kết quả tính toán trong cơ sở dữ liệu. Cơ sở dữ liệu không chứa các bản ghi đầu vào thực tế mà chỉ phân tích tổng hợp cấp cao về các giao dịch. Ví dụ: xu hướng và v.v.

Thuật toán đầu tiên tôi định sử dụng yêu cầu hoạt động tốt nhất ít nhất 10 bản ghi người dùng, nếu không tìm được 10 bản ghi sau 5 phút, nên sử dụng dữ liệu sẵn có.

Tôi muốn sử dụng Storm để thực hiện, nhưng tôi muốn rời khỏi cuộc thảo luận này ở cấp thiết kế nhiều nhất có thể.

Một danh sách các thành phần hệ thống:

  1. Một nhiệm vụ theo dõi các tập tin đến từng phút.

  2. Tác vụ đọc tệp, phân tích cú pháp và cung cấp tệp cho các thành phần và thuật toán hệ thống khác.

  3. Một thành phần để đệm 10 bản ghi cho người dùng (không quá 5 phút), khi 10 bản ghi được thu thập hoặc 5 phút trôi qua, đã đến lúc gửi dữ liệu đến thuật toán để xử lý tiếp. Do yêu cầu là cung cấp ít nhất 10 bản ghi cho thuật toán, tôi đã nghĩ đến việc sử dụng Nhóm trường Storm (nghĩa là cùng một nhiệm vụ được gọi cho cùng một người dùng) và theo dõi bộ sưu tập 10 hồ sơ của người dùng bên trong nhiệm vụ. lên kế hoạch để có một số nhiệm vụ này, mỗi nhiệm vụ xử lý một phần của người dùng.

  4. Có các thành phần khác hoạt động trên một giao dịch duy nhất, vì chúng tôi dự định tạo các tác vụ khác nhận được mỗi giao dịch khi nó được phân tích cú pháp (song song với các tác vụ khác).

Tôi cần bạn trợ giúp # 3.

Thực tiễn tốt nhất để thiết kế thành phần như vậy là gì? Rõ ràng là nó cần duy trì dữ liệu cho 10 bản ghi cho mỗi người dùng. Bản đồ giá trị khóa có thể hữu ích, liệu bản đồ có được quản lý tốt hơn trong bản thân nhiệm vụ hoặc sử dụng bộ nhớ cache được phân phối hay không? Ví dụ Redis một cửa hàng giá trị khóa (Tôi chưa từng sử dụng nó trước đây).

Cảm ơn sự giúp đỡ của bạn

Trả lời

5

Tôi đã làm việc với redis khá một chút. Vì vậy, tôi sẽ nhận xét về suy nghĩ của bạn sử dụng redis

# 3 có 3 yêu cầu

  1. đệm cho mỗi người dùng

  2. đệm cho 10 Nhiệm vụ

  3. nên Hết Hạn mỗi 5 phút

1. Bộ đệm P er Người dùng: Redis chỉ là một cửa hàng giá trị quan trọng. Mặc dù nó hỗ trợ nhiều loại datatypes, chúng luôn là giá trị được ánh xạ tới khóa STRING. Vì vậy, bạn nên quyết định làm thế nào để xác định một người dùng duy nhất trong trường hợp bạn cần có cho mỗi bộ đệm người dùng. Bởi vì Trong redis bạn sẽ không bao giờ nhận được một lỗi khi bạn ghi đè lên một giá trị mới quan trọng. Một giải pháp có thể kiểm tra sự tồn tại trước khi viết.

2. Bộ đệm cho 10 tác vụ: Bạn rõ ràng có thể triển khai queue bằng redis. Nhưng hạn chế kích thước của nó là trái với bạn. Ví dụ: Sử dụng LPUSHLTRIM hoặc Sử dụng LLEN để kiểm tra độ dài và quyết định có kích hoạt quy trình của bạn hay không. Khóa được liên kết với hàng đợi này phải là mã bạn quyết định trong phần 1.

3. Bộ đệm hết hạn sau 5 phút: Đây là nhiệm vụ khó khăn nhất. Trong redis mỗi khóa không phân biệt kiểu dữ liệu cơ bản mà nó có giá trị, có thể có một expiry. Nhưng quá trình hết hạn là im lặng. Bạn sẽ không nhận được thông báo khi hết hạn của bất kỳ khóa nào. Vì vậy, bạn sẽ âm thầm mất bộ đệm của bạn nếu bạn sử dụng tài sản này. Một công việc xung quanh cho việc này là, có một chỉ mục. Có nghĩa là, chỉ mục sẽ ánh xạ một dấu thời gian cho các khóa, tất cả những gì cần phải hết hạn tại giá trị dấu thời gian đó. Sau đó, ở chế độ nền, bạn có thể đọc chỉ mục mỗi phút và xóa thủ công [sau khi đọc] ra khỏi redis và gọi quy trình mong muốn của bạn với dữ liệu đệm. Để có chỉ mục như vậy, bạn có thể xem Sorted Sets. Trong đó dấu thời gian sẽ là score của bạn và đặt member sẽ là các phím [khóa duy nhất cho mỗi người dùng đã quyết định trong phần 1 sẽ ánh xạ tới hàng đợi] mà bạn muốn xóa tại dấu thời gian đó. Bạn có thể làm zrangebyscore để đọc tất cả các thành viên bộ với quy định timestamp

toàn thể:

Sử dụng Danh sách Redis để thực hiện một hàng đợi.

Sử dụng LLEN để đảm bảo bạn không vượt quá giới hạn 10.

Bất cứ khi nào bạn tạo danh sách mới, hãy nhập mục lục vào [Chỉ mục được sắp xếp] với Điểm là Current Timestamp + 5 min và Giá trị làm khóa của danh sách.

Khi LLEN đạt đến 10, hãy nhớ đọc rồi xóa khóa khỏi chỉ mục [bộ đã sắp xếp] và từ db [xóa danh sách khóa->]. Sau đó kích hoạt quá trình của bạn với dữ liệu.

Cứ mỗi một phút, tạo dấu thời gian hiện tại, đọc chỉ mục và cho mọi khóa, đọc dữ liệu, sau đó xóa khóa khỏi db và kích hoạt quá trình của bạn.

Đây có thể là cách của tôi để triển khai. Có thể có một số cách khác tốt hơn để mô hình hóa dữ liệu của bạn trong redis

0

Đối với yêu cầu của bạn 1 & 2: [Apache máng hoặc Kafka]

Đối với yêu cầu của bạn # 3: [Esper bolt bên Storm. Trong Redis để hoàn thành việc này, bạn sẽ phải viết lại Esper Logic.]

Các vấn đề liên quan