Python trong hàng đợi bộ nhớ

Hướng dẫn này giả định rằng RabbitMQ đã được cài đặt và chạy trên máy chủ cục bộ trên cổng tiêu chuẩn [5672]. Trong trường hợp bạn sử dụng máy chủ, cổng hoặc thông tin xác thực khác, cài đặt kết nối sẽ yêu cầu điều chỉnh

Nhận trợ giúp ở đâu

Nếu bạn gặp khó khăn khi xem hướng dẫn này, bạn có thể liên hệ với chúng tôi qua danh sách gửi thư hoặc cộng đồng RabbitMQ Slack

RabbitMQ là một nhà môi giới tin nhắn. nó chấp nhận và chuyển tiếp tin nhắn. Bạn có thể nghĩ về nó như một bưu điện. khi bạn đặt thư bạn muốn gửi vào hộp thư, bạn có thể chắc chắn rằng người đưa thư cuối cùng sẽ chuyển thư đến người nhận của bạn. Theo cách tương tự này, RabbitMQ là hộp thư, bưu điện và người vận chuyển thư

Sự khác biệt chính giữa RabbitMQ và bưu điện là nó không xử lý giấy, thay vào đó, nó chấp nhận, lưu trữ và chuyển tiếp các khối dữ liệu nhị phân - tin nhắn

RabbitMQ và nhắn tin nói chung, sử dụng một số biệt ngữ

  • Sản xuất không có nghĩa gì hơn là gửi. Một chương trình gửi tin nhắn là một nhà sản xuất

    sơ đồ { bgcolor=trong suốt;

  • Hàng đợi là tên của hộp thư trong RabbitMQ. Mặc dù tin nhắn chảy qua RabbitMQ và các ứng dụng của bạn, nhưng chúng chỉ có thể được lưu trữ bên trong hàng đợi. Một hàng đợi chỉ bị ràng buộc bởi giới hạn đĩa và bộ nhớ của máy chủ, về cơ bản nó là một bộ đệm thông báo lớn. Nhiều nhà sản xuất có thể gửi tin nhắn đến một hàng đợi và nhiều người tiêu dùng có thể cố gắng nhận dữ liệu từ một hàng đợi. Đây là cách chúng tôi đại diện cho một hàng đợi

    sơ đồ { bgcolor=trong suốt; . }", fillcolor="red", shape="record"]; }; }

  • Tiêu thụ có một ý nghĩa tương tự như nhận. Người tiêu dùng là một chương trình chủ yếu chờ nhận tin nhắn

    sơ đồ { bgcolor=trong suốt;

Lưu ý rằng nhà sản xuất, người tiêu dùng và nhà môi giới không phải cư trú trên cùng một máy chủ; . Một ứng dụng cũng có thể vừa là nhà sản xuất vừa là người tiêu dùng

"Chào thế giới"

[sử dụng. NET/C# máy khách]

Trong phần hướng dẫn này, chúng ta sẽ viết hai chương trình bằng C#; . Chúng tôi sẽ lướt qua một số chi tiết trong. NET client API, tập trung vào điều rất đơn giản này để bắt đầu. Đó là tin nhắn "Xin chào thế giới"

Trong sơ đồ bên dưới, "P" là nhà sản xuất của chúng tôi và "C" là người tiêu dùng của chúng tôi. Hộp ở giữa là hàng đợi - bộ đệm tin nhắn mà RabbitMQ giữ thay mặt cho người tiêu dùng

Các. thư viện máy khách NET

RabbitMQ nói nhiều giao thức. Hướng dẫn này sử dụng AMQP 0-9-1, đây là một giao thức mở, có mục đích chung để nhắn tin. Có một số ứng dụng khách cho RabbitMQ bằng nhiều ngôn ngữ khác nhau. Chúng tôi sẽ sử dụng. NET do RabbitMQ cung cấp

khách hàng hỗ trợ. NET Core cũng như. Khung lưới 4. 5. 1+. Hướng dẫn này sẽ sử dụng RabbitMQ. máy khách NET 5. 0 và. NET Core, do đó bạn sẽ đảm bảo rằng bạn đã cài đặt nó và trong PATH của bạn

Bạn cũng có thể sử dụng. NET Framework để hoàn thành hướng dẫn này tuy nhiên các bước thiết lập sẽ khác

ThỏMQ. máy khách NET 5. 0 và các phiên bản mới hơn được phân phối qua nuget

Hướng dẫn này giả định rằng bạn đang sử dụng powershell trên Windows. Trên MacOS và Linux, gần như mọi trình bao sẽ hoạt động

Thành lập

Trước tiên hãy xác minh rằng bạn có. NET Core trong PATH

dotnet --help

nên tạo ra một thông báo trợ giúp

Bây giờ, hãy tạo hai dự án, một cho nhà xuất bản và một cho người tiêu dùng

dotnet new console --name Send
mv Send/Program.cs Send/Send.cs
dotnet new console --name Receive
mv Receive/Program.cs Receive/Receive.cs

Thao tác này sẽ tạo hai thư mục mới có tên Gửi và Nhận

Sau đó, chúng tôi thêm sự phụ thuộc của khách hàng

cd Send
dotnet add package RabbitMQ.Client
cd ../Receive
dotnet add package RabbitMQ.Client

Bây giờ chúng tôi có. NET được thiết lập, chúng ta có thể viết một số mã

Gửi

Chúng tôi sẽ gọi cho nhà xuất bản tin nhắn của chúng tôi [người gửi] Gửi. cs và người tiêu dùng tin nhắn của chúng tôi [người nhận] Nhận. cs. Nhà xuất bản sẽ kết nối với RabbitMQ, gửi một tin nhắn, sau đó thoát

Trong Gửi. cs, chúng ta cần sử dụng một số không gian tên

using System;
using RabbitMQ.Client;
using System.Text;

Thiết lập lớp học

class Send
{
    public static void Main[]
    {
        ...
    }
}

sau đó chúng ta có thể tạo kết nối đến máy chủ

class Send
{
    public static void Main[]
    {
        var factory = new ConnectionFactory[] { HostName = "localhost" };
        using [var connection = factory.CreateConnection[]]
        using [var channel = connection.CreateModel[]]
        {
            ...
        }
    }
}

Kết nối trừu tượng hóa kết nối ổ cắm và đảm nhiệm việc đàm phán và xác thực phiên bản giao thức, v.v. Ở đây chúng tôi kết nối với nút RabbitMQ trên máy cục bộ - do đó là localhost. Nếu chúng tôi muốn kết nối với một nút trên một máy khác, chúng tôi chỉ cần chỉ định tên máy chủ hoặc địa chỉ IP của nó tại đây

Tiếp theo, chúng tôi tạo một kênh, đây là nơi chứa hầu hết các API để hoàn thành công việc

Để gửi, chúng tôi phải khai báo một hàng đợi để chúng tôi gửi tới;

using System;
using RabbitMQ.Client;
using System.Text;

class Send
{
    public static void Main[]
    {
        var factory = new ConnectionFactory[] { HostName = "localhost" };
        using[var connection = factory.CreateConnection[]]
        using[var channel = connection.CreateModel[]]
        {
            channel.QueueDeclare[queue: "hello",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null];

            string message = "Hello World!";
            var body = Encoding.UTF8.GetBytes[message];

            channel.BasicPublish[exchange: "",
                                 routingKey: "hello",
                                 basicProperties: null,
                                 body: body];
            Console.WriteLine[" [x] Sent {0}", message];
        }

        Console.WriteLine[" Press [enter] to exit."];
        Console.ReadLine[];
    }
}

Khai báo hàng đợi là idempotent - nó sẽ chỉ được tạo nếu nó chưa tồn tại. Nội dung tin nhắn là một mảng byte, vì vậy bạn có thể mã hóa bất cứ thứ gì bạn thích ở đó

Khi đoạn mã trên chạy xong, kênh và kết nối sẽ bị loại bỏ. Đó là nó cho nhà xuất bản của chúng tôi

Đây là toàn bộ Gửi. lớp cs

Gửi không hoạt động

Nếu đây là lần đầu tiên bạn sử dụng RabbitMQ và bạn không thấy thông báo "Đã gửi" thì bạn có thể phải vò đầu bứt tai tự hỏi điều gì có thể sai. Có thể người môi giới đã bắt đầu mà không có đủ dung lượng đĩa trống [theo mặc định, nó cần ít nhất 50 MB trống] và do đó từ chối nhận tin nhắn. Kiểm tra tệp nhật ký của nhà môi giới để xác nhận và giảm giới hạn nếu cần. Tài liệu về tệp cấu hình sẽ chỉ cho bạn cách đặt disk_free_limit

nhận

Đối với người tiêu dùng, nó đang lắng nghe tin nhắn từ RabbitMQ. Vì vậy, không giống như nhà xuất bản xuất bản một tin nhắn duy nhất, chúng tôi sẽ giữ cho người tiêu dùng chạy liên tục để nghe tin nhắn và in chúng ra

Mã [trong Nhận. cs] có các câu lệnh sử dụng gần giống như Gửi

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

Thiết lập giống như nhà xuất bản; . Lưu ý điều này phù hợp với hàng đợi Gửi xuất bản tới

________số 8

Lưu ý rằng chúng tôi cũng khai báo hàng đợi ở đây. Bởi vì chúng tôi có thể bắt đầu người tiêu dùng trước nhà xuất bản, chúng tôi muốn đảm bảo rằng hàng đợi tồn tại trước khi chúng tôi cố gắng sử dụng thư từ nó

Chúng tôi chuẩn bị yêu cầu máy chủ gửi cho chúng tôi tin nhắn từ hàng đợi. Vì nó sẽ đẩy các tin nhắn của chúng tôi không đồng bộ, chúng tôi cung cấp một cuộc gọi lại. Đó là những gì EventingBasicConsumer. Trình xử lý sự kiện đã nhận không

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

class Receive
{
    public static void Main[]
    {
        var factory = new ConnectionFactory[] { HostName = "localhost" };
        using[var connection = factory.CreateConnection[]]
        using[var channel = connection.CreateModel[]]
        {
            channel.QueueDeclare[queue: "hello",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null];

            var consumer = new EventingBasicConsumer[channel];
            consumer.Received += [model, ea] =>
            {
                var body = ea.Body.ToArray[];
                var message = Encoding.UTF8.GetString[body];
                Console.WriteLine[" [x] Received {0}", message];
            };
            channel.BasicConsume[queue: "hello",
                                 autoAck: true,
                                 consumer: consumer];

            Console.WriteLine[" Press [enter] to exit."];
            Console.ReadLine[];
        }
    }
}

Đây là toàn bộ Nhận. lớp cs

Để tất cả chúng cùng nhau

Mở hai thiết bị đầu cuối

Bạn có thể chạy các ứng dụng khách theo bất kỳ thứ tự nào, vì cả hai đều khai báo hàng đợi. Chúng tôi sẽ chạy ứng dụng tiêu dùng trước để bạn có thể thấy nó đang chờ và sau đó nhận tin nhắn

dotnet new console --name Send
mv Send/Program.cs Send/Send.cs
dotnet new console --name Receive
mv Receive/Program.cs Receive/Receive.cs
0

Sau đó chạy nhà sản xuất

dotnet new console --name Send
mv Send/Program.cs Send/Send.cs
dotnet new console --name Receive
mv Receive/Program.cs Receive/Receive.cs
1

Người tiêu dùng sẽ in thông báo nhận được từ nhà xuất bản qua RabbitMQ. Người tiêu dùng sẽ tiếp tục chạy, chờ tin nhắn, vì vậy hãy thử khởi động lại nhà xuất bản nhiều lần

Đã đến lúc chuyển sang phần 2 và xây dựng hàng đợi công việc đơn giản

Sản xuất [Non-]Sự phù hợp Tuyên bố từ chối trách nhiệm

Xin lưu ý rằng hướng dẫn này và các hướng dẫn khác đều là hướng dẫn. Họ thể hiện một khái niệm mới tại một thời điểm và có thể cố tình đơn giản hóa một số thứ và loại bỏ những thứ khác. Ví dụ: các chủ đề như quản lý kết nối, xử lý lỗi, khôi phục kết nối, đồng thời và thu thập số liệu phần lớn được bỏ qua vì lý do ngắn gọn. Mã đơn giản hóa như vậy không nên được coi là sẵn sàng sản xuất

Vui lòng xem phần còn lại của tài liệu trước khi đưa ứng dụng của bạn vào hoạt động. Chúng tôi đặc biệt đề xuất các hướng dẫn sau. Xác nhận của nhà xuất bản và Xác nhận của người tiêu dùng, Danh sách kiểm tra và giám sát sản xuất

Nhận trợ giúp và cung cấp phản hồi

Nếu bạn có thắc mắc về nội dung của hướng dẫn này hoặc bất kỳ chủ đề nào khác liên quan đến RabbitMQ, đừng ngần ngại hỏi họ trong danh sách gửi thư của RabbitMQ

Giúp chúng tôi cải thiện tài liệu

Chủ Đề