Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Praktik terbaik untuk pengoptimalan kinerja dan efisiensi di Amazon MQ untuk RabbitMQ
Anda dapat mengoptimalkan Amazon MQ Anda untuk kinerja broker RabbitMQ dengan memaksimalkan throughput, meminimalkan latensi, dan memastikan pemanfaatan sumber daya yang efisien. Selesaikan praktik terbaik berikut untuk mengoptimalkan kinerja aplikasi Anda.
Langkah 1: Simpan 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 terduga 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 muatan pesan di penyimpanan eksternal dan hanya mengirim pengidentifikasi referensi payload melalui RabbitMQ. Konsumen menggunakan pengidentifikasi 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.

Contoh berikut menunjukkan pola ini menggunakan Amazon MQ, SDK for Java AWS 2.x, dan Amazon S3:
-
Pertama, tentukan kelas Pesan yang akan menampung pengenal referensi Amazon S3.
class Message { // Other data fields of the message... public String s3Key; public String s3Bucket; }
-
Buat metode penerbit yang menyimpan muatan di Amazon S3 dan mengirim 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); }
-
Menerapkan 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.consume
dan konsumen berumur panjang
Menggunakan basic.consume
dengan konsumen berumur panjang lebih efisien daripada polling untuk menggunakan 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 dikirimkannya 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 global
diatur ke false
, sehingga contoh di atas dapat ditulis hanya sebagai channel.basicQos(10)
.
Langkah 4: Gunakan Seledri 5.5 atau lebih baru dengan antrian kuorum
Python Celery
Untuk semua versi Seledri
-
Matikan
task_create_missing_queues
untuk mengurangi churn antrian. -
Kemudian, matikan
worker_enable_remote_control
untuk menghentikan pembuatancelery@...pidbox
antrian dinamis. Ini akan mengurangi churn antrian pada broker.worker_enable_remote_control = false
-
Untuk lebih mengurangi aktivitas pesan non-kritis, matikan Seledri worker-send-task-events
dengan tidak menyertakan -E
atau--task-events
menandai saat memulai aplikasi Seledri Anda. -
Mulai aplikasi Seledri Anda menggunakan parameter berikut:
celery -A app_name worker --without-heartbeat --without-gossip --without-mingle
Untuk Seledri versi 5.5 dan di atas
-
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, gunakan celery --version
. Untuk informasi lebih lanjut tentang antrian kuorum, lihat. Antrian kuorum untuk RabbitMQ di Amazon MQ -
Setelah memutakhirkan ke Celery 5.5 atau yang lebih baru, konfigurasikan
task_default_queue_type
ke “kuorum”. -
Kemudian, Anda juga harus mengaktifkan Publikasikan Konfirmasi di Opsi Transportasi Broker
: broker_transport_options = {"confirm_publish": True}