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.
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:
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.