All Products
Search
Document Center

ApsaraMQ for RabbitMQ:SDK FAQ

Last Updated:Nov 10, 2025

Topik ini menjawab pertanyaan umum mengenai pengiriman dan penerimaan pesan menggunakan kit pengembangan perangkat lunak (SDK).

Apakah klien open source dapat langsung mengakses layanan cloud?

ApsaraMQ for RabbitMQ sepenuhnya kompatibel dengan RabbitMQ open source, sehingga memungkinkan klien RabbitMQ open source untuk langsung mengakses layanan cloud. Untuk membuat koneksi, buat nama pengguna dan kata sandi, lalu berikan izin sesuai dengan pola verifikasi identitas dan izin instans Anda. Untuk informasi selengkapnya, lihat Manajemen Izin.

Bahasa pemrograman apa saja yang didukung oleh SDK open source?

ApsaraMQ for RabbitMQ mendukung semua bahasa pemrograman dan framework yang didukung oleh SDK RabbitMQ open source. Untuk informasi selengkapnya, lihat Bahasa pemrograman dan framework yang didukung oleh SDK RabbitMQ open source melalui AMQP.

Apakah saya dapat langsung menggunakan RabbitMQ JMS Client open source?

ApsaraMQ for RabbitMQ saat ini tidak mendukung penggunaan RabbitMQ JMS Client open source.

Jika ACK otomatis diaktifkan, apakah saya dapat menggunakan Reject untuk mengantre ulang pesan?

Tidak, Anda tidak dapat melakukannya. Gunakan metode basicReject untuk menolak satu pesan atau metode basicNack untuk menolak satu atau beberapa pesan dan mengantre ulang pesan tersebut.

  • Gunakan metode basicReject untuk menolak pesan dan mengantre ulangnya

    Parameter

    Deskripsi

    deliveryTag

    Pengidentifikasi unik untuk pengiriman pesan dalam suatu saluran.

    requeue

    Menentukan apakah pesan yang ditolak akan dikantre ulang. Jika diatur ke true, pesan akan dikantre ulang. Jika diatur ke false, pesan akan dibuang atau dikirim ke dead-letter exchange. Untuk informasi selengkapnya, lihat Dead-letter exchanges.

  • Gunakan metode basicNack untuk menolak beberapa pesan dan mengantre ulangnya

    Parameter

    Deskripsi

    deliveryTag

    Pengidentifikasi unik untuk pengiriman pesan dalam suatu saluran.

    multiple

    Menentukan apakah beberapa pesan akan ditolak. Jika diatur ke true, pesan dengan delivery tag yang ditentukan dan semua pesan sebelumnya yang belum diakui akan ditolak. Jika diatur ke false, hanya pesan dengan delivery tag yang ditentukan yang ditolak.

    requeue

    Menentukan apakah pesan yang ditolak akan dikantre ulang. Jika diatur ke true, pesan akan dikantre ulang. Jika diatur ke false, pesan akan dibuang atau dikirim ke dead-letter exchange. Untuk informasi selengkapnya, lihat Dead-letter exchanges.

    Kode contoh

    channel.basicConsume("test", false, new DefaultConsumer(channel) {
       @Override
        public void handleDelivery(String consumerTag, Envelope envelope,
                          AMQP.BasicProperties properties, byte[] body)
                throws IOException {
            System.out.println("Rejected: " + new String(body, "UTF-8") + ", deliveryTag: " + envelope.getDeliveryTag() + ", messageId: " + properties.getMessageId());
            channel.basicNack(envelope.getDeliveryTag(), true, true);
        }
    });

Bagaimana cara mengatur ID pesan?

Untuk melacak dan mengidentifikasi pesan, Anda dapat mengatur properti Message ID pada klien produsen ApsaraMQ for RabbitMQ guna menentukan pengidentifikasi unik bagi setiap pesan. Untuk informasi selengkapnya mengenai ID pesan, lihat ID Pesan.

Pada klien produsen ApsaraMQ for RabbitMQ, Anda dapat mengatur properti message-id dari Basic.Properties. Bagian-bagian berikut menyediakan kode contoh:

Catatan

ID pesan tidak boleh melebihi 255 karakter.

Java

AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().messageId("messageid").build(); 
channel.basicPublish("${ExchangeName}", "RoutingKey", true, props, ("Message Body").getBytes(StandardCharsets.UTF_8));

Python

properties = pika.BasicProperties(app_id='example-publisher', content_type='application/json', message_id='messageid')

PHP

$msg = new AMQPMessage($msgBody, ['application_headers'=>$amqpTable,'content_type' => 'text/plain', 'delivery_mode' => 2,'message_id' => 'messageid',]);

Go

err = ch.Publish( "helloExchange", "hello", false, false, amqp.Publishing { ContentType: "text/plain", Body: []byte(body), MessageId: "messageId", })

Node.js

channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);

Bagaimana cara menghapus pesan dari antrian?

Anda dapat menggunakan metode queuePurge dalam library klien Java untuk menghapus semua pesan dari antrian tertentu. Kode contoh berikut menunjukkan cara menggunakan metode tersebut:

channel.queuePurge("queue-name");

Bagaimana cara mengatur transmisi terenkripsi pada klien open source?

Contoh berikut menggunakan port 5672, yaitu port default tanpa enkripsi. Untuk mengenkripsi transmisi, lakukan koneksi ke port 5671 dan atur SslProtocol dari

SslProtocol dari com.rabbitmq.client.ConnectionFactory.

 private void setSSL(com.rabbitmq.client.ConnectionFactory factory) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init((KeyStore) null);
        
        sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
        
        factory.useSslProtocol(sslContext);
    }

Apa yang dapat saya lakukan jika konsumen berbeda memiliki perbedaan signifikan dalam pemanfaatan memori atau CPU karena mereka mengonsumsi jumlah data yang berbeda?

Masalah ini dapat terjadi karena cara distribusi koneksi di seluruh node layanan backend. ApsaraMQ for RabbitMQ menggunakan penerapan terdistribusi dengan beberapa node backend, dan gerbang menggunakan mekanisme polling untuk membuat koneksi. Jika koneksi klien didistribusikan secara tidak merata, konsumen mungkin menarik jumlah data yang berbeda. Sebagai contoh, bayangkan lima klien membuat lima koneksi ke tiga node layanan (A, B, dan C). Koneksi tersebut mungkin didistribusikan secara tidak merata—misalnya, dua koneksi ke node A, dua ke node B, dan hanya satu ke node C. Karena backend menggunakan arsitektur pemisahan penyimpanan dan komputasi, setiap node layanan menarik jumlah data yang kurang lebih sama. Akibatnya, klien dengan satu koneksi ke node C harus memproses seluruh data yang ditarik oleh node tersebut, sehingga menyebabkan pemanfaatan sumber daya jauh lebih tinggi dibandingkan klien lainnya.

Solusi: Buat beberapa koneksi untuk setiap klien agar didistribusikan secara merata di seluruh node backend. Misalnya, Anda dapat membuat 50 koneksi untuk setiap node klien. Pendekatan ini menyeimbangkan jumlah data yang ditarik oleh setiap klien. Jika klien Anda menggunakan Spring Boot, Anda dapat mengonfigurasi mode connection untuk konsumsi.