View a markdown version of this page

Praktik terbaik untuk optimalisasi kinerja dan efisiensi di Amazon MQ untuk RabbitMQ - Amazon MQ

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Praktik terbaik untuk optimalisasi kinerja dan efisiensi di Amazon MQ untuk RabbitMQ

Anda dapat mengoptimalkan kinerja broker Amazon MQ untuk RabbitMQ dengan memaksimalkan throughput, meminimalkan latensi, dan memastikan pemanfaatan sumber daya yang efisien. Lengkapi praktik terbaik berikut untuk mengoptimalkan kinerja aplikasi Anda.

Langkah 1: Pertahankan ukuran pesan di bawah 1 MB

Sebaiknya simpan pesan di bawah 1 Megabyte (MB) untuk kinerja dan keandalan yang optimal.

RabbitMQ 3.13 mendukung ukuran pesan hingga 128 MB secara default, tetapi pesan besar dapat memicu alarm memori yang tidak dapat diprediksi yang memblokir penerbitan dan berpotensi menciptakan tekanan memori tinggi saat mereplikasi pesan di seluruh node. Pesan yang terlalu besar juga dapat memengaruhi proses restart dan pemulihan broker, yang meningkatkan risiko terhadap kontinuitas layanan dan dapat menyebabkan penurunan kinerja.

Simpan dan ambil muatan besar menggunakan pola pemeriksaan klaim

Untuk mengelola pesan besar, Anda dapat menerapkan pola pemeriksaan klaim dengan menyimpan payload pesan di penyimpanan eksternal dan hanya mengirim pengenal referensi payload melalui RabbitMQ. Konsumen menggunakan pengenal referensi payload untuk mengambil dan memproses pesan besar.

Diagram berikut menunjukkan cara menggunakan Amazon MQ untuk RabbitMQ dan Amazon S3 untuk menerapkan pola pemeriksaan klaim.

Diagram menunjukkan aliran data antara Produsen, Konsumen, Amazon MQ broker, dan AWS S3.

Contoh berikut menunjukkan pola ini menggunakan Amazon MQ, AWS SDK untuk Java 2.x, dan Amazon S3:

  1. Pertama, tentukan kelas Pesan yang akan menyimpan pengidentifikasi referensi Amazon S3.

    class Message { // Other data fields of the message... public String s3Key; public String s3Bucket; }
  2. Buat metode penerbit yang menyimpan payload di Amazon S3 dan mengirimkan pesan referensi melalui RabbitMQ.

    public void publishPayload() { // Store the payload in S3. String payload = PAYLOAD; String prefix = S3_KEY_PREFIX; String s3Key = prefix + "/" + UUID.randomUUID(); s3Client.putObject(PutObjectRequest.builder() .bucket(S3_BUCKET).key(s3Key).build(), RequestBody.fromString(payload)); // Send the reference through RabbitMQ. Message message = new Message(); message.s3Key = s3Key; message.s3Bucket = S3_BUCKET; // Assign values to other fields in your message instance. publishMessage(message); }
  3. Terapkan metode konsumen yang mengambil payload dari Amazon S3, memproses payload, dan menghapus objek Amazon S3.

    public void consumeMessage(Message message) { // Retrieve the payload from S3. String payload = s3Client.getObjectAsBytes(GetObjectRequest.builder() .bucket(message.s3Bucket).key(message.s3Key).build()) .asUtf8String(); // Process the complete message. processPayload(message, payload); // Delete the S3 object. s3Client.deleteObject(DeleteObjectRequest.builder() .bucket(message.s3Bucket).key(message.s3Key).build()); }

Langkah 2: Gunakan basic.consum dan konsumen berumur panjang

Menggunakan basic.consume dengan konsumen berumur panjang lebih efisien daripada polling untuk penggunaan pesan individu. basic.get Untuk informasi selengkapnya, lihat Polling untuk pesan individual.

Langkah 3: Konfigurasikan pra-pengambilan

Anda dapat menggunakan nilai pra-pengambilan RabbitMQ untuk mengoptimalkan cara konsumen mengonsumsi pesan. RabbitMQ mengimplementasikan mekanisme pra-pengambilan saluran yang disediakan oleh AMQP 0-9-1 dengan menerapkan jumlah pra-pengambilan untuk konsumen yang bertentangan dengan saluran. Nilai pra-pengambilan digunakan untuk menentukan jumlah pesan yang dikirim ke konsumen pada waktu tertentu. Secara default, RabbitMQ menetapkan ukuran buffer yang tidak terbatas untuk aplikasi klien.

Ada berbagai faktor yang perlu dipertimbangkan saat menetapkan jumlah pra-pengambilan untuk konsumen RabbitMQ. Pertama, pertimbangkan lingkungan dan konfigurasi konsumen Anda. Karena konsumen perlu menyimpan semua pesan dalam memori saat pesan sedang diproses, nilai pra-pengambilan yang tinggi dapat memiliki dampak negatif pada performa konsumen, dan di beberapa kasus, membuat konsumen berpotensi merusak semuanya. Demikian pula, broker RabbitMQ sendiri menyimpan semua pesan yang dikirim dalam cache dalam memori sampai menerima pengakuan konsumen. Nilai pra-pengambilan yang tinggi dapat menyebabkan server RabbitMQ Anda kehabisan memori dengan cepat jika pengakuan otomatis tidak dikonfigurasi untuk konsumen, dan jika konsumen mengambil waktu yang relatif lama untuk memproses pesan.

Dengan pertimbangan di atas, kami rekomendasikan Anda untuk selalu menetapkan nilai pra-pengambilan agar terhindar dari situasi ketika broker RabbitMQ atau konsumen kehabisan memori karena sejumlah besar pesan yang belum diproses, atau tidak diakui. Jika perlu mengoptimalkan broker untuk memproses pesan dalam volume besar, Anda dapat menguji broker dan konsumen menggunakan berbagai jumlah pra-pengambilan untuk menentukan nilai titik ketika overhead jaringan menjadi sangat tidak signifikan dibandingkan dengan waktu yang dibutuhkan konsumen untuk memproses pesan.

catatan
  • Jika aplikasi klien Anda telah dikonfigurasi untuk secara otomatis mengakui pengiriman pesan ke konsumen, menetapkan nilai pra-pengambilan tidak akan berpengaruh.

  • Semua pesan pra-pengambilan dihapus dari antrean.

Contoh berikut mendemonstrasikan cara menentukan nilai pra-pengambilan 10 untuk konsumen tunggal menggunakan pustaka klien RabbitMQ Java.

ConnectionFactory factory = new ConnectionFactory(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.basicQos(10, false); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume("my_queue", false, consumer);
catatan

Dalam pustaka klien RabbitMQ Java, nilai default untuk bendera globaldiatur ke false, sehingga contoh di atas dapat ditulis hanya sebagai channel.basicQos(10).

Langkah 4: Gunakan Seledri 5.5 atau yang lebih baru dengan antrian kuorum

Python Celery, sistem antrian tugas terdistribusi, dapat menghasilkan banyak pesan non-kritis saat mengalami beban tugas yang tinggi. Aktivitas broker tambahan ini dapat memicu Amazon MQ untuk RabbitMQ: Alarm memori tinggi dan menyebabkan tidak tersedianya broker. Untuk mengurangi kemungkinan memicu alarm memori, lakukan hal berikut:

Untuk semua versi Seledri

  1. Matikan task_create_missing_queues untuk mengurangi churn antrian.

  2. Kemudian, matikan worker_enable_remote_control untuk menghentikan pembuatan celery@...pidbox antrian dinamis. Ini akan mengurangi churn antrian pada broker.

    worker_enable_remote_control = false
  3. Untuk mengurangi aktivitas pesan non-kritis lebih lanjut, matikan Celery worker-send-task-events dengan tidak menyertakan -E atau --task-events menandai saat memulai aplikasi Celery Anda.

  4. Mulai aplikasi Seledri Anda menggunakan parameter berikut:

    celery -A app_name worker --without-heartbeat --without-gossip --without-mingle

Untuk Seledri versi 5.5 dan lebih tinggi

  1. Tingkatkan ke Celery versi 5.5, versi minimum yang mendukung antrian kuorum, atau versi yang lebih baru. Untuk memeriksa versi Seledri apa yang Anda gunakan, gunakancelery --version. Untuk informasi lebih lanjut tentang antrian kuorum, lihat. Antrian kuorum untuk RabbitMQ di Amazon MQ

  2. Setelah memutakhirkan ke Celery 5.5 atau yang lebih baru, konfigur task_default_queue_type asikan ke “quorum”.

  3. Kemudian, Anda juga harus mengaktifkan Publikasikan Konfirmasi di Opsi Transportasi Broker:

    broker_transport_options = {"confirm_publish": True}