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 |
| 500 TPS | Tidak ada | 500 TPS | ||
Buat exchange untuk satu instans |
| 500 TPS | Tidak ada | 500 TPS | ||
Hapus exchange untuk satu instans |
| 500 TPS | Tidak ada | 500 TPS | ||
Buat antrian untuk satu instans |
| 500 TPS | Tidak ada | 500 TPS | ||
Hapus antrian untuk satu instans |
| 500 TPS | Tidak ada | 500 TPS | ||
Buat binding untuk satu instans |
| 500 TPS | Tidak ada | 500 TPS | ||
Hapus binding untuk satu instans |
| 500 TPS | Tidak ada | 500 TPS | ||
Pulihkan pesan untuk satu instans |
| 500 TPS | Tidak ada | 500 TPS | ||
Requeue pesan untuk satu instans |
| 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:
Broker ApsaraMQ for RabbitMQ mengembalikan kode kesalahan. Untuk informasi selengkapnya, lihat Kode kesalahan dan pesan kesalahan.
Broker ApsaraMQ for RabbitMQ menutup saluran dari permintaan saat ini. Anda dapat menangkap pengecualian tersebut dalam kode Anda dan membuka kembali salurannya. Untuk informasi selengkapnya, lihat Contoh kode untuk menangani kode kesalahan.
Kode kesalahan dan pesan kesalahan
Kode kesalahan: reply-code=530
Pesan kesalahan: reply-text=denied for too many requests
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:
| 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 |
| TPS puncak pada tingkat detik |
|
| 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.