2013-01-31 55 views
5

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ì?

+2

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

+0

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. –

+0

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

Trả lời

4

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.

+0

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 –

+0

Một lần nữa bạn đăng cùng một định nghĩa mức cao –

+0

Disruptor = – sloven

2

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

2

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(); 
    } 
} 
Các vấn đề liên quan