ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

Exchange - trao đổi hoặc điểm trao đổi. Tin nhắn được gửi đến nó. Exchange phân phối tin nhắn trong một hoặc nhiều hàng đợi. Anh ta định tuyến tin nhắn đến hàng đợi dựa trên các liên kết được tạo (bindings) giữa nó và hàng đợi.

Exchange không phải quá trình Erlang. Vì lý do khả năng mở rộng exchange là một chuỗi (một liên kết đến mô-đun có mã chứa logic định tuyến) trong cơ sở dữ liệu nhúng mất trí nhớ. 1 nghìn bộ trao đổi sẽ chỉ tiêu tốn 1MB bộ nhớ.

Mục lục

Trao đổi trực tiếp

Direct exchange - sử dụng khi cần thiết gửi tin nhắn đến hàng đợi cụ thể. Tin nhắn được xuất bản tới bộ trao đổi với một nội dung cụ thể khóa định tuyến và đi vào tất cả các hàng đợi được liên kết với bộ trao đổi này bằng khóa định tuyến tương tự. Khóa định tuyến là một chuỗi. Việc so khớp được thực hiện bằng cách sử dụng kiểm tra chuỗi cho bằng nhau.

Biểu diễn đồ họa của luồng tin nhắn:

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

В rabbitmq có một khái niệm trao đổi mặc định. Nó direct exchange không có tên. Nếu bộ trao đổi mặc định được sử dụng thì tin nhắn sẽ được chuyển đến hàng đợi có tên bằng khóa định tuyến tin nhắn.

Trao đổi chủ đề

Topic exchange - tương tự direct exchange cho phép định tuyến chọn lọc bằng cách so sánh khóa định tuyến. Tuy nhiên, trong trường hợp này, chìa khóa được đưa ra theo mẫu. Khi tạo mẫu, hãy sử dụng 0 hoặc nhiều từ (chữ cái AZ и az và những con số 0-9), cách nhau bằng dấu chấm, cũng như các ký hiệu * и #.

  • * - có thể được thay thế bằng chính xác 1 từ
  • # - có thể được thay thế bởi 0 hoặc nhiều từ

Biểu diễn đồ họa của luồng tin nhắn:

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

Bắt đầu từ phiên bản RabbitMQ 2.4.0 thuật toán định tuyến cho topic exchange bắt đầu làm việc cho đến khi 145 nhanh hơn nhiều lần. Họ đạt được điều này bằng cách áp dụng phương pháp triển khai trie, ngụ ý việc biểu diễn các mẫu dưới dạng cấu trúc cây. Ví dụ mẫu a.b.c, a.*.b.c, a.#.c и b.b.c sẽ được biểu diễn bằng cấu trúc sau:

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

So khớp mẫu được tìm kiếm bắt đầu từ gốc và đi từ trên xuống dưới.

Các tính năng:

  • việc sử dụng bộ trao đổi này có thể trở thành một lựa chọn tốt để phát triển ứng dụng trong tương lai, bởi vì các mẫu luôn có thể được tùy chỉnh để tin nhắn được xuất bản tương tự direct exchange hoặc fanout exchange
  • mẫu sử dụng * nhanh hơn nhiềuhơn các mẫu sử dụng #.
  • topic exchange Chậm hơn direct exchange

Trao đổi fanout

Fanout exchangetất cả tin nhắn được gửi đến tất cả hàng đợi ngay cả khi khóa định tuyến được chỉ định trong tin nhắn.

Các tính năng:

  • RabbitMQ không hoạt động với các khóa và mẫu định tuyến điều này có tác động tích cực đến hiệu suất. Đây là cách nhanh nhất exchange;
  • tất cả người tiêu dùng phải có khả năng xử lý tất cả tin nhắn;

Biểu diễn đồ họa của luồng tin nhắn:

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

Trao đổi tiêu đề

Headers exchange - chuyển các thông điệp đến các hàng đợi có liên quan dựa trên sự so sánh các cặp thuộc tính (khóa, giá trị) headers thuộc tính ràng buộc và thông điệp tương tự. headers là một Dictionary<ключ, значение>.

Nếu bạn thêm một khóa đặc biệt vào từ điển x-match với ý nghĩa any, thì tin nhắn sẽ được định tuyến nếu các cặp (khóa, giá trị) khớp một phần. Hành vi này tương tự như người vận hành or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

Phím mặc định x-match chứa một giá trị all. Điều này có nghĩa là tin nhắn được định tuyến khi các cặp (khóa, giá trị) hoàn toàn khớp nhau. Hành vi này tương tự như người vận hành and.

Biểu diễn đồ họa của luồng tin nhắn:

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

Các tính năng:

  • tính linh hoạt bổ sung
  • chi phí tính toán bổ sung. Tất cả các cặp (khóa, giá trị) của thuộc tính headers phải được sắp xếp theo tên khóa trước khi tính giá trị định tuyến tin nhắn. Chậm hơn các loại trao đổi khác.

Trao đổi băm nhất quán

Bộ trao đổi này cắm vào и không được xây dựng trong в RabbitMQ.

Consistent-hashing exchange (trao đổi với hàm băm nhất quán) - được sử dụng khi có nhiều hàng đợi có thể là người nhận tin nhắn và khi bạn cần cân bằng tải giữa chúng. Thông báo được liên kết với hàng đợi theo trọng lượng (giá trị chuỗi có điều kiện từ 0 - n).

Trọng số tương đương của hàng đợi - cho biết mỗi hàng đợi sẽ nhận được về cùng một lượng tin nhắn (mỗi tin nhắn sẽ chỉ được đưa vào một hàng đợi). Không có sự đảm bảo hoàn toàn về việc phân phối tin nhắn thống nhất.

Biểu diễn đồ họa của luồng tin nhắn:

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

Hash được tính toán dựa trên khóa hoặc thuộc tính định tuyến headers tin nhắn. Nếu tất cả các tin nhắn được xuất bản có khóa định tuyến khác nhau, hoặc headers, thì việc phân phối sẽ diễn ra theo trọng lượng. Nếu không, khóa định tuyến sẽ được sử dụng hoặc headers.

Sẽ hữu ích khi thông lượng của người tiêu dùng cần tăng cao hơn giải pháp có nhiều người tiêu dùng sử dụng cùng một hàng đợi.

Sự kết hợp của bộ trao đổi (E2E)

Hành vi của tất cả các bộ trao đổi có thể được kết hợp bằng cách sử dụng giao tiếp Trao đổi để trao đổi (sự kết hợp của bộ trao đổi không được bao gồm trong đặc điểm kỹ thuật AMQP. Đây là một phần mở rộng giao thức từ bên cạnh RabbitMQ).

Biểu diễn đồ họa của luồng tin nhắn:

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

Với chi phí của E2E chúng tôi có thể tìm thấy cấu hình có thể mở rộng phù hợp, đáp ứng cả yêu cầu hiện tại và yêu cầu ngày càng tăng.

Tạo một sàn giao dịch

Bộ trao đổi được tạo bằng cách sử dụng đồng bộ RPC yêu cầu tới máy chủ. Yêu cầu được thực hiện bằng phương pháp Exchange.Declare, được gọi với các tham số:

  • tên trao đổi
  • loại trao đổi
  • sự lựa chọn khác

Ví dụ về tạo exchange bằng các phương tiện RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange - tên của bộ trao đổi mà chúng tôi muốn tạo. Tên phải là duy nhất
  • type - loại trao đổi
  • durable - nếu được cài đặt truesau đó exchange sẽ là vĩnh viễn. Nó sẽ được lưu trữ trên đĩa và có thể tồn tại khi khởi động lại máy chủ/nhà môi giới. Nếu giá trị falsesau đó exchange là tạm thời và sẽ bị xóa khi máy chủ/nhà môi giới được khởi động lại
  • autoDelete - tự động xóa. Exchange sẽ bị xóa khi tất cả các hàng đợi liên quan bị xóa
  • arguments là các đối số tùy chọn. Thông thường, thông qua các tập đối số alternative exchange (trao đổi thay thế). Nếu một tin nhắn không thể đi qua tuyến đường ban đầu, nó có thể được gửi đến một tổng đài thay thế để được định tuyến theo một con đường khác.

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

Nếu sáng tạo exchange có lẽ, sau đó máy chủ sẽ gửi cho máy khách một bản tin đồng bộ RPC trả lời Exchange.DeclareOk. Nếu sáng tạo là không thể (có sự từ chối theo yêu cầu Exchange.Declare), sau đó kênh sẽ đóng máy chủ sử dụng lệnh không đồng bộ Channel.Close và khách hàng sẽ nhận được một ngoại lệ Hoạt động bị gián đoạnngoại lệ, sẽ chứa mã lỗi và mô tả của nó.

Một bộ trao đổi phải được tạo trước khi đăng. Nếu bạn xuất bản một tin nhắn tới một số bộ trao đổi không tồn tại - RabbitMQ âm thầm loại bỏ nó.

Tạo GUI Exchange

Đi tới bảng quản trị RabbitMQ dưới quyền người dùng guest (tên tài khoản: guest và mật khẩu: guest). Xin lưu ý rằng người dùng guest chỉ có thể kết nối từ localhost. Bây giờ chúng ta hãy chuyển đến tab Exchanges và bấm vào Add a new exchange. Điền các thuộc tính:

ThỏMQ. Phần 2. Tìm hiểu sàn giao dịch

Hầu hết các thuộc tính đã được mô tả ở trên. Ở đây chúng tôi lưu ý rằng nếu chúng tôi đặt Internal, thì việc trao đổi chỉ có thể được sử dụng cho E2E. Producer sẽ không thể gửi tin nhắn đến một cuộc trao đổi như vậy.

Kết luận

Khi phát triển một hệ thống, sẽ thuận tiện hơn khi mô tả cấu trúc liên kết định tuyến sử dụng đồ thị. Nhưng trước khi bạn bắt đầu xây dựng biểu đồ, bạn nên làm nổi bật những đường dẫn có lưu lượng truy cập cao, bởi vì. họ đòi hỏi thông lượng cao hơn (hiệu suất). Tiếp theo, bạn có thể phân loại lưu lượng truy cập. Và sau đó bắt đầu xây dựng.

Nếu trong đồ thị đã xây dựng tồn tại tập hợp hữu hạn các khóa định tuyến, sau đó, đáng để xem xét một số fanout exchange, tỷ lệ 1:1 liên quan đến khóa định tuyến. Nhớ lấy fanout exchange nhanh nhất.

Nếu số đường đi có xu hướng đến vô cùng, đáng để quan tâm topic exchange hoặc nếu không cần mẫu thì bạn có thể chọn direct exchnge, bởi vì anh ấy nhanh hơn topic exchange.

Sự kết hợp của nhiều loại exchange sẽ giúp bạn tìm được cái phù hợp. cấu hình có thể mở rộng, đáp ứng cả yêu cầu hệ thống hiện tại và đang phát triển.

Số exchange và hàng đợi phải ở mức tối thiểu so với số lượng tuyến đường.

Trong bài viết tiếp theo, chúng ta sẽ bắt đầu tìm hiểu thêm về Hàng đợi và Ràng buộc.

tài liệu tham khảo

Nguồn: www.habr.com

Thêm một lời nhận xét