全部产品
Search
文档中心

ApsaraMQ for RabbitMQ:Praktik terbaik untuk pengendalian aliran instans

更新时间:Nov 10, 2025

ApsaraMQ for RabbitMQ menerapkan pengendalian aliran terhadap transaksi per detik (TPS) puncak dari satu instans. Topik ini menjelaskan aturan pengendalian aliran untuk instans ApsaraMQ for RabbitMQ, perilaku yang terjadi setelah pengendalian aliran dipicu, serta praktik terbaik dalam mengelola pengendalian aliran tersebut.

Ambang batas pengendalian aliran

Ambang batas pengendalian aliran TPS total instans

Instance Series

Instans serverless

Instans Langganan

Edisi

Dibagikan

Dedicated

Elastic TPS dinonaktifkan

Elastic TPS diaktifkan

Reserved + Elastic/Pay-by-traffic

Reserved + Elastic

Enterprise Edition

Platinum Edition

Professional Edition

Enterprise Edition

Platinum Edition

Professional Edition

Ambang batas pengendalian aliran

Hingga 50.000 TPS

Dua kali TPS puncak tipe instans dasar

TPS puncak tipe instans dasar

Dua kali TPS puncak tipe instans dasar, hingga 50.000 TPS

Dua kali TPS puncak tipe instans dasar, hingga 50.000 TPS

1,5 kali TPS puncak tipe instans dasar

Ambang batas pengendalian aliran TPS SendMessage node tunggal

Server membatasi TPS SendMessage untuk setiap node layanan backend dalam suatu instans. Ambang batas pengendalian alirannya adalah sebagai berikut:

Batas

Instans serverless

Instans langganan

Dibagikan

Dedicated

Enterprise Edition

Platinum Edition

Professional Edition

Jumlah kumulatif

Reserved + Elastic

Reserved + Elastic

Ambang batas pengendalian aliran

25.000 TPS

25.000 TPS

Tidak ada

25.000 TPS

Tidak ada

25.000 TPS

Ambang batas pengendalian aliran operasi API

Batasan

Antarmuka Manajemen Batas

Instans serverless

Instans langganan

Bersama

Dedicated

Enterprise Edition

Platinum Edition

Professional Edition

Reserved + Elastic/Pay-by-traffic

Reserved + Elastic

Purge antrian untuk satu instans

purgeQueue

500 TPS

Tidak ada

500 TPS

Buat exchange untuk satu instans

exchangeDeclare

500 TPS

Tidak ada

500 TPS

Hapus exchange untuk satu instans

exchangeDelete

500 TPS

Tidak ada

500 TPS

Buat antrian untuk satu instans

queueDeclare

500 TPS

Tidak ada

500 TPS

Hapus antrian untuk satu instans

queueDelete

500 TPS

Tidak ada

500 TPS

Buat binding untuk satu instans

queueBind

500 TPS

Tidak ada

500 TPS

Hapus binding untuk satu instans

queueUnbind

500 TPS

Tidak ada

500 TPS

Pulihkan pesan untuk satu instans

basicRecover

500 TPS

Tidak ada

500 TPS

Requeue pesan untuk satu instans

  • basicReject(requeue=true)

  • basicNack(requeue=true)

20 TPS

Tidak ada

20 TPS

Aturan pengendalian aliran

Jika TPS puncak instance ApsaraMQ for RabbitMQ melebihi batas TPS yang ditentukan dalam spesifikasinya, instance ApsaraMQ for RabbitMQ tersebut akan mengalami pengendalian aliran.

Ketika pengendalian aliran dipicu, hal-hal berikut terjadi:

Kode kesalahan dan pesan kesalahan

  • Kode kesalahan: reply-code=530

  • Pesan kesalahan: reply-text=denied for too many requests

Kode contoh berikut memberikan contoh stack kesalahan dari klien Java:

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>
(reply-code=530, reply-text=denied for too many requests, ReqId:5FB4C999314635F952FCBFF6, ErrorHelp[dstQueue=XXX_test_queue,
srcExchange=Producer.ExchangeName,bindingKey=XXX_test_bk, http://mrw.so/6rNqO8], class-id=50, method-id=20)
    at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:516)
    at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:346)
    at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
    at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
    at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:672)
    at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48)
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:599)
    at java.lang.Thread.run(Thread.java:748)

Contoh kode untuk menangani kode kesalahan

Kode contoh berikut menggunakan Java:

private static final int MAX_RETRIES = 5; // Jumlah maksimum percobaan ulang.
private static final long WAIT_TIME_MS = 2000; // Waktu tunggu untuk setiap percobaan ulang dalam milidetik.

private void doAnythingWithReopenChannels(Connection connection, Channel channel) {
    try {
        // ......
        // Operasi apa pun yang akan dilakukan pada saluran saat ini.
        // Misalnya, mengirim atau mengonsumsi pesan.
        // ......

    } catch (AlreadyClosedException e) {
        String message = e.getMessage();
        if (isChannelClosed(message)) {
            // Jika saluran ditutup, tutup dan buat kembali saluran tersebut.
            channel = createChannelWithRetry(connection); 
            // Anda dapat melanjutkan operasi lain setelah terhubung kembali.
            // ......
        } else {
            throw e;
        }
    }
}

private Channel createChannelWithRetry(Connection connection) {
    for (int attempt = 1; attempt <= MAX_RETRIES; attempt++) {
        try {
            return connection.createChannel();
        } catch (Exception e) {
            System.err.println("Gagal membuat saluran. Percobaan " + attempt + " dari " + MAX_RETRIES);
            // Periksa kesalahan. Jika saluran masih ditutup karena pengendalian aliran, Anda dapat menunggu lalu mencoba lagi.
            // Anda juga dapat menghapus logika percobaan ulang ini.
            if (attempt < MAX_RETRIES) {
                try {
                    Thread.sleep(WAIT_TIME_MS);
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt(); // Pulihkan status interupsi.
                }
            } else {
                throw new RuntimeException("Melebihi jumlah maksimum percobaan ulang untuk membuat saluran", e);
            }
        }
    }
    throw new RuntimeException("Baris ini seharusnya tidak pernah tercapai"); // Secara teori, baris kode ini tidak akan pernah tercapai.
}

private boolean isChannelClosed(String errorMsg) {
    // Periksa apakah pesan kesalahan berisi "channel.close". Kesalahan ini menunjukkan bahwa saluran ditutup.
    // Kesalahan tersebut mungkin berisi pesan kesalahan seperti 530 dan 541.
    if (errorMsg != null && errorMsg.contains("channel.close")) {
        System.out.println("[ChannelClosed] Detail kesalahan: " + errorMsg);
        return true;
    }
    return false;
}

Kueri TPS puncak suatu instans

Anda dapat mengkueri TPS puncak aktual suatu instans untuk memahami fluktuasi lalu lintas bisnis, serta lalu lintas puncak, dan menentukan apakah spesifikasi instans memenuhi kebutuhan bisnis Anda.

ApsaraMQ for RabbitMQ menyediakan tiga metode berikut untuk mengkueri TPS puncak suatu instans:

Metode

Deskripsi

Granularitas waktu

Tingkat sumber daya

(Direkomendasikan) Kueri TPS puncak instans dan konfigurasi aturan peringatan menggunakan CloudMonitor

Manfaat:

  • Anda dapat menggunakan metode kueri ini untuk mengkueri perubahan TPS puncak dalam 14 hari terakhir. Metode kueri ini membantu Anda mengidentifikasi anomali secara efisien.

  • Anda dapat menggunakan TPS puncak instans sebagai metrik untuk mengonfigurasi aturan peringatan.

  • Anda tidak dikenai biaya saat menggunakan metode kueri ini.

TPS puncak pada tingkat menit

TPS puncak instans selama periode statistik 1 menit

TPS puncak instans

(Direkomendasikan) Kueri TPS puncak instans pada halaman Detail Instans

  • Manfaat:

    • Anda dapat menggunakan metode kueri ini untuk mengkueri TPS puncak pada tingkat detik. Metode kueri ini membantu Anda mengidentifikasi anomali secara akurat.

    • Anda dapat mengkueri TPS puncak dari operasi API tertentu.

    • Anda tidak dikenai biaya saat menggunakan metode kueri ini.

  • Catatan penggunaan: Untuk mencegah tampilan daftar hasil kueri yang terlalu panjang, hanya hasil kueri yang dikembalikan dalam 10 menit pertama yang ditampilkan.

TPS puncak pada tingkat detik

  • TPS puncak instans

  • TPS puncak operasi API tertentu

Kueri TPS puncak instans menggunakan Simple Log Service

  • Manfaat: Anda dapat menggunakan pernyataan Simple Log Service untuk mengkueri TPS puncak instans. Metode kueri ini membantu Anda mengidentifikasi anomali dalam skenario bisnis kompleks.

  • Catatan penggunaan:

TPS puncak pada tingkat detik

TPS puncak instans

Apa yang harus saya lakukan jika pengendalian aliran dipicu karena kelebihan TPS?

Jika pengendalian aliran dipicu untuk suatu instans atau koneksi dan memengaruhi bisnis Anda karena TPS puncak tidak dikonfigurasi dengan tepat, kami merekomendasikan solusi berikut.

Solusi untuk pengendalian aliran yang disebabkan oleh melebihi TPS total instans tunggal

  • Untuk skenario pengujian atau skenario jangka pendek dengan lalu lintas puncak yang tidak pasti atau volume lalu lintas kecil, kami merekomendasikan penggunaan instans ApsaraMQ for RabbitMQ serverless. Jika Anda menggunakan instans ApsaraMQ for RabbitMQ berbasis langganan dalam skenario tersebut, kami merekomendasikan agar Anda mengaktifkan fitur elastic TPS untuk instans tersebut. Untuk informasi selengkapnya, lihat Aktifkan fitur elastic TPS untuk instans.

  • Untuk skenario jangka panjang dengan lalu lintas stabil dan besar, kami merekomendasikan agar Anda meningkatkan spesifikasi TPS. Untuk informasi selengkapnya, lihat Peningkatan konfigurasi instans.

Solusi untuk pengendalian aliran yang disebabkan oleh melebihi TPS pada satu node

  • Kluster ApsaraMQ for RabbitMQ menggunakan arsitektur terdistribusi. Kami merekomendasikan agar Anda membuat beberapa koneksi (minimal 10) untuk setiap antrian sehingga klien dapat terhubung ke beberapa node layanan dalam kluster secara merata. Metode ini secara efektif mencegah hotspot beban dan meningkatkan efisiensi pengiriman serta konsumsi pesan.

  • Jika Anda pengguna Spring, kami merekomendasikan agar Anda menggunakan mode CONNECTION dari CachingConnectionFactory. Untuk informasi selengkapnya, lihat Integrasi Spring.