Exchange - trao đổi hoặc điểm trao đổi. Tin nhắn được gửi đến nó. Exchangephâ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ớ.
ThỏMQ. Phần 5: Xuất bản và sử dụng hiệu suất tin nhắn
ThỏMQ. Phần 6. Tổng quan về Liên đoàn và Mô-đun Xẻng
ThỏMQ. Phần 7. Chi tiết về Connection và Chanel
ThỏMQ. Phần 8. RabbitMQ trong .NET
ThỏMQ. Phần 9. Giám sát
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:
В 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:
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:
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 exchange – tấ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:
RabbitMQkhô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:
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:
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:
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:
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ố:
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.
Nếu sáng tạo exchangecó 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:
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.