Một người bạn của tôi đã được hỏi về vấn đề này trong một cuộc phỏng vấn. Tôi muốn thảo luận vấn đề này tại đâyThiết kế/Người điều phối mã cho Hệ thống đăng ký xuất bản
Điều gì có thể thực hiện hiệu quả cho vấn đề này?
Một ý tưởng đơn giản mà đến với tôi là memqueue bình thường, sử dụng máy Memcache để mở rộng một số yêu cầu, với một công việc của người tiêu dùng chạy mà sẽ viết những thứ từ memcache để DB. và sau đó cho phần thứ hai, chúng tôi chỉ có thể chạy truy vấn sql để tìm danh sách người đăng ký phù hợp.
VẤN ĐỀ: -
Sự kiện được xuất bản lên hệ thống này. Mỗi sự kiện có thể được coi là chứa một số cố định (N) của các cột chuỗi được gọi là C1, C2,… CN. Mỗi sự kiện do đó có thể được truyền xung quanh như là một mảng của các chuỗi (C1 là phần tử thứ 0 trong mảng, C2 ngày 1 và vv).
Có M thuê bao - S1, ... SM
Mỗi thuê bao đăng ký một vị chỉ rõ những gì tập hợp con của các sự kiện đó là quan tâm đến mỗi vị có thể chứa:
Equality clause on columns, for example: (C1 == “US”)
Conjunctions of such clauses, example:
(C1 == “IN”) && (C2 == “home.php”)
(C1 == “IN”) && (C2 == “search.php”) && (C3 == “nytimes.com”)
(Trong ví dụ trên. , C1 là viết tắt của mã quốc gia của một sự kiện và C2 là viết tắt của trang web của trang web và C3 là mã liên kết giới thiệu.)
tức là. - mỗi vị từ là một kết hợp của một số điều kiện bình đẳng. Lưu ý rằng biến vị ngữ không nhất thiết phải có một mệnh đề bình đẳng cho tất cả các cột (ví dụ - một vị từ có thể không quan tâm đến giá trị của một số hoặc tất cả các cột). (Trong ví dụ trên: #a không quan tâm đến các cột C3,… CN).
Chúng tôi phải thiết kế và mã hóa Người điều phối có thể khớp các sự kiện đến với người đăng ký đã đăng ký. Tỷ lệ sự kiện đến là hàng triệu mỗi giây. Số lượng người đăng ký là hàng nghìn người đăng ký. Vì vậy, điều phối viên này phải rất hiệu quả. Nói một cách đơn giản:
When the system boots, all the subscribers register their predicates to the dispatcher
After this events start coming to the dispatcher
For each event, the dispatcher has to emit the id of the matching subscribers.
trong điều khoản của một đặc tả giao diện, sau đây có thể được tạm nêu ra (trong Java):
Class Dispatcher {
public Dispatcher(int N /* number of columns in each event – fixed up front */);
public void registerSubscriber(String subscriberId /* assume no conflicts */,
String predicate /* predicate for this subscriberid */);
public List<String> findMatchingIds(String[] event /* assume each event has N Strings */);
}
Ie .: Cơ sở điều phối được xây dựng, sau đó một loạt các registerSubscriber cuộc gọi được thực hiện. Sau đó, chúng ta liên tục gọi phương thức findMatchingIds() và mục đích của bài tập này là làm cho hàm này hiệu quả nhất có thể.
'Vị từ chuỗi/* vị ngữ cho người đăng ký này * /' - Không phải là biến này là 'predicate]' String? – JimmyB
Không, bạn sẽ phải phân tích cú pháp chính mình – Peter
Xin chào, câu hỏi thực sự thú vị. và hình thành những gì tôi đọc trong [Manning mahout in action] vấn đề của bạn phù hợp với Công cụ đề xuất. và tôi trích dẫn: > Công cụ khuyến nghị là máy học tập dễ nhận biết nhất ngay lập tức kỹ thuật được sử dụng hôm nay nó tương tự như những gì amazon khi chúng giới thiệu sách cho bạn. Nếu bạn thích tôi có thể gửi cho bạn những gì đã được giải pháp của mình cho một vấn đề như vậy. –