Bất cứ ai có thể cho tôi biết mẫu thiết kế Disruptor là gì với ví dụ đơn giản? Tôi sẽ muốn biết khái niệm cơ bản về mẫu thiết kế này.Mẫu thiết kế LMAX Disruptor là gì?
Trả lời
Một Google đơn giản mang lại cho tôi rất nhiều thông tin, bao gồm this introduction bởi Martin Fowler
Ở mức độ thô, bạn có thể nghĩ đến một Disruptor như một đồ thị multicast của hàng đợi nơi các nhà sản xuất đưa các đối tượng trên nó được gửi cho tất cả người tiêu dùng để sử dụng song song thông qua hàng đợi riêng biệt. Khi bạn nhìn vào bên trong, bạn thấy rằng mạng xếp hàng này thực sự là cấu trúc dữ liệu đơn - một bộ đệm vòng. Mỗi nhà sản xuất và người tiêu dùng có bộ đếm tuần tự để cho biết vị trí nào trong bộ đệm hiện tại là đang hoạt động. Mỗi nhà sản xuất/người tiêu dùng viết bộ đếm tuần tự riêng của mình nhưng có thể đọc các bộ đếm chuỗi của người khác. Bằng cách này, nhà sản xuất có thể đọc các quầy của người tiêu dùng để đảm bảo vị trí mà nó muốn viết là có sẵn mà không cần bất kỳ khóa nào trên quầy. Tương tự, người tiêu dùng có thể đảm bảo nó chỉ xử lý các thông báo khi người tiêu dùng khác được thực hiện với bằng cách xem bộ đếm.
GitHub project chứa mã Java + doc.
Họ đang đề cập đến việc sử dụng mức độ rất cao của mẫu thiết kế này tôi sẽ muốn cơ bản của mẫu thiết kế này với một số ví dụ cơ bản trong ngôn ngữ lập trình Java –
Một lần nữa bạn đăng cùng một định nghĩa mức cao –
Disruptor = – sloven
Tôi đã dành một vài ngày đọc tất cả xung quanh nó và tôi chỉ bắt đầu hiểu thấu về mặt kiến trúc cũng như nắm bắt các lý do tại sao mẫu thiết kế này lại xuất hiện.
Đối với một ví dụ mã đơn giản như thế nào để thực hiện thử https://github.com/trevorbernard/disruptor-examples
Đối với một mô tả tốt bao gồm các liên kết đến một trang giấy trắng, mã nguồn và sơ đồ UML bạn có thể thử bắt đầu từ http://martinfowler.com/articles/lmax.html
Từ this article:
Mẫu bộ phá sóng là hàng đợi ghép nối được sao lưu bằng một mảng tròn (tức là bộ đệm vòng) được điền đầy đủ với chuyển tiền được phân bổ các đối tượng sử dụng các rào cản bộ nhớ để đồng bộ hóa nhà sản xuất và người tiêu dùng thông qua trình tự.
May mắn thay, bạn không cần phải hiểu chi tiết nội tại của mẫu bộ phá vỡ để sử dụng. Trong trường hợp bạn thấy dễ hiểu hơn thông qua mã, dưới đây là Hello World của CoralQueue, một hàng đợi độ trễ cực thấp cho truyền thông liên thread thực hiện mẫu phá vỡ.
package com.coralblocks.coralqueue.sample.queue;
import com.coralblocks.coralqueue.AtomicQueue;
import com.coralblocks.coralqueue.Queue;
import com.coralblocks.coralqueue.util.Builder;
public class Basics {
public static void main(String[] args) {
final Queue<StringBuilder> queue = new AtomicQueue<StringBuilder>(1024, new Builder<StringBuilder>() {
@Override
public StringBuilder newInstance() {
return new StringBuilder(1024);
}
});
Thread producer = new Thread(new Runnable() {
private final StringBuilder getStringBuilder() {
StringBuilder sb;
while((sb = queue.nextToDispatch()) == null) {
// queue can be full if the size of the queue
// is small and/or the consumer is too slow
// busy spin (you can also use a wait strategy instead)
}
return sb;
}
@Override
public void run() {
StringBuilder sb;
while(true) { // the main loop of the thread
// (...) do whatever you have to do here...
// and whenever you want to send a message to
// the other thread you can just do:
sb = getStringBuilder();
sb.setLength(0);
sb.append("Hello!");
queue.flush();
// you can also send in batches to increase throughput:
sb = getStringBuilder();
sb.setLength(0);
sb.append("Hi!");
sb = getStringBuilder();
sb.setLength(0);
sb.append("Hi again!");
queue.flush(); // dispatch the two messages above...
}
}
}, "Producer");
Thread consumer = new Thread(new Runnable() {
@Override
public void run() {
while (true) { // the main loop of the thread
// (...) do whatever you have to do here...
// and whenever you want to check if the producer
// has sent a message you just do:
long avail;
while((avail = queue.availableToPoll()) == 0) {
// queue can be empty!
// busy spin (you can also use a wait strategy instead)
}
for(int i = 0; i < avail; i++) {
StringBuilder sb = queue.poll();
// (...) do whatever you want to do with the data
// just don't call toString() to create garbage...
// copy byte-by-byte instead...
}
queue.donePolling();
}
}
}, "Consumer");
consumer.start();
producer.start();
}
}
- 1. Di chuyển từ LinkedBlockingQueue sang LMAX 'Disruptor
- 2. mẫu thiết kế đối tượng ngữ cảnh là gì?
- 3. Mẫu thiết kế Gang of Four là gì
- 4. Nên sử dụng Disruptor (LMAX) với mô hình lớn trong bộ nhớ và CQRS?
- 5. Mẫu thiết kế nào?
- 6. Sự khác biệt giữa các mẫu thiết kế và các mẫu kiến trúc là gì?
- 7. Điểm tương đồng giữa các mẫu thiết kế Phương pháp mẫu và Chiến lược là gì
- 8. Thiết kế tốt hơn là gì?
- 9. Mẫu thiết kế F #
- 10. Mẫu thiết kế Android
- 11. Mẫu thiết kế SQL
- 12. Đây có phải là mẫu thiết kế nổi tiếng không? Tên của nó là gì?
- 13. Các mẫu thiết kế/chiến lược thiết kế mới
- 14. Mẫu thiết kế phần mềm kế toán
- 15. Mẫu thiết kế - Mẫu chiến lược
- 16. Ngoài các mẫu thiết kế?
- 17. Thiết kế mẫu trong Rails
- 18. Điều gì sẽ đến trước - mẫu thiết kế hoặc mã?
- 19. Đây có phải là mẫu thiết kế không?
- 20. Vaadin: Các mẫu thiết kế
- 21. Các mẫu thiết kế cho thiết kế đồng thời/tác nhân dựa trên thiết kế
- 22. Mẫu thiết kế "Mặt tiền"
- 23. Thiết kế theo định hướng dữ liệu là gì?
- 24. Mẫu thiết kế kiến trúc
- 25. Mẫu thiết kế memcache PHP
- 26. Đề xuất mẫu thiết kế
- 27. Mẫu thiết kế và Scala
- 28. Mixin có được coi là mẫu thiết kế không?
- 29. Mẫu thiết kế lệnh - Là Invoker tùy chọn?
- 30. Mẫu thiết kế nào là Codeigniter sử dụng?
Tại sao bạn cần 'mẫu thiết kế'? Trình phá rối chỉ là một hàng đợi đệm vòng/một số ứng dụng "hướng dẫn" làm thế nào để tránh ganh đua và nảy dòng bộ đệm. Họ sử dụng bận rộn chờ đợi để giảm độ trễ và tất cả các dữ liệu thường được lưu trữ ở dạng tuần tự vào bộ nhớ preallocated của bộ đệm vòng, do đó, không làm sạch xảy ra. – bestsss
Tôi cần điều này cho ứng dụng web thị trường chứng khoán của tôi (www.askkuber.com), nơi chúng tôi có rất nhiều xử lý được sao lưu trong chuỗi. –
trừ khi bạn cần phải cập nhật trong thời gian thực cũng như thời trang (có nghĩa là không có web), bạn có thể dựa vào thực thi đơn giản hoặc Fork/Join. Thậm chí sau đó là ok. – bestsss