Tôi có kịch bản người tiêu dùng sản xuất nơi người sản xuất sản xuất nhanh hơn nhiều so với người tiêu dùng có thể tiêu thụ. Nói chung, giải pháp là làm cho khối nhà sản xuất kể từ khi kịch bản sản xuất/người tiêu dùng hoạt động nhanh như thành phần chậm nhất. Điều chỉnh hoặc ngăn chặn các nhà sản xuất là không phải là một giải pháp tốt vì ứng dụng của chúng tôi cung cấp đủ thời gian để người tiêu dùng bắt kịp sau này.Triển khai "Xếp hàng đợi" của Java cho Nhà sản xuất nhanh, Người tiêu dùng chậm
Dưới đây là một sơ đồ miêu tả một "giai đoạn" đầy đủ trong ứng dụng của chúng tôi so với một kịch bản phổ biến hơn:
Our Application Common Scenario
2N +--------+--------+
|PPPPPPPP|oooooooo| P = Producer
|PPPPPPPP|oooooooo| C = Consumer
N +--------+--------+ N +--------+--------+--------+ o = Other Work
|CPCPCPCP|CCCCCCCC| |CPCPCPCP|CPCPCPCP|oooooooo| N = number of tasks
|CPCPCPCP|CCCCCCCC| |CPCPCPCP|CPCPCPCP|oooooooo|
------------------- ----------------------------
0 T/2 T 0 T/2 T 3T/2
Ý tưởng là để tối đa hóa thông lượng bằng cách không ức chế các nhà sản xuất.
Dữ liệu mà tác vụ của chúng tôi hoạt động dễ dàng được tuần tự hóa, vì vậy tôi dự định triển khai giải pháp hệ thống tệp để làm đầy tất cả các tác vụ không thể ngay lập tức được thỏa mãn.
Tôi đang sử dụng Java ThreadPoolExecutor
với số BlockingQueue
với dung lượng tối đa để đảm bảo chúng tôi không hết bộ nhớ. Vấn đề là trong việc thực hiện một hàng đợi "tầng", nơi mà các nhiệm vụ có thể được xếp hàng trong bộ nhớ được thực hiện ngay lập tức, nếu không dữ liệu được xếp hàng đợi trên đĩa.
tôi đã đi lên với hai giải pháp khả thi:
- Thực hiện một
BlockingQueue
từ đầu, sử dụngLinkedBlockingQueue
hoặcArrayBlockingQueue
thực hiện như một tài liệu tham khảo. Điều này có thể đơn giản như việc sao chép việc thực hiện trong thư viện chuẩn và thêm đọc/ghi hệ thống tập tin. - Tiếp tục sử dụng triển khai
BlockingQueue
tiêu chuẩn, triển khaiFilesystemQueue
riêng biệt để lưu trữ dữ liệu của tôi và sử dụng một hoặc nhiều chủ đề để xóa các tệp, tạoRunnable
s và enqueue chúng bằng cách sử dụngThreadPoolExecutor
.
Một trong hai phương pháp này có hợp lý và có khả năng tiếp cận tốt hơn không?