Jika ukuran pesan melebihi 64 KB dan tidak dapat disimpan langsung di antrian Simple Message Queue (sebelumnya MNS), Anda dapat menggunakan SMQ dan Object Storage Service untuk mentransmisikan pesan tanpa perlu memotong pesan tersebut.
Informasi latar belakang
Anda dapat mengirim pesan dengan ukuran hingga 64 KB ke antrian SMQ. Dalam banyak kasus, ini memenuhi persyaratan dasar transmisi pesan. Namun, dalam skenario tertentu, Anda harus memotong pesan yang ukurannya lebih besar dari 64 KB untuk mengirimkannya. Jika Anda ingin menghindari pemotongan pesan, Anda dapat menggunakan SMQ bersama dengan OSS untuk mentransmisikan pesan.
Contoh berikut menunjukkan cara menggunakan OSS untuk mentransmisikan pesan yang ukurannya lebih besar dari 64 KB tanpa pemotongan.
Solusi
Sebelum produsen pesan mengirim pesan ke antrian SMQ, produsen mengunggah isi pesan sebagai objek ke OSS jika ukuran isi pesan lebih besar dari 64 KB.
Produsen pesan mengirim objek ke antrian SMQ.
Konsumen pesan membaca pesan dari antrian SMQ dan memeriksa apakah isi pesan adalah objek OSS.
Jika isi pesan adalah objek OSS, konsumen pesan mengunduh objek OSS dan mengembalikan isi pesan ke aplikasi lapisan atas.
Gambar berikut menunjukkan proses transmisi pesan.
Catatan penggunaan
Pesan berukuran besar terutama mengonsumsi lebar pita jaringan. Saat menggunakan solusi ini untuk mengirim pesan berukuran besar, lebar pita jaringan baik produsen maupun konsumen pesan harus memenuhi persyaratan.
Mengirim pesan berukuran besar memakan waktu dan mungkin terpengaruh oleh jitter jaringan. Kami menyarankan Anda melakukan percobaan ulang di lapisan atas jika terjadi kesalahan.
Prasyarat
SDK SMQ untuk Java telah diinstal. Untuk informasi lebih lanjut, lihat Instal SDK untuk Java.
Titik akhir dan kredensial akses telah dikonfigurasi. Untuk informasi lebih lanjut, lihat Konfigurasikan Titik Akhir dan Kredensial Akses.
Contoh kode
Untuk informasi lebih lanjut tentang cara mengunduh contoh kode, lihat LargeMessageDemo.java.
package com.aliyun.mns.sample.scenarios.largeMessage;
import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.CloudQueue;
import com.aliyun.mns.client.CloudTopic;
import com.aliyun.mns.client.MNSClient;
import com.aliyun.mns.common.utils.ServiceSettings;
import com.aliyun.mns.model.Message;
import com.aliyun.mns.sample.scenarios.largeMessage.service.MNSExtendedClient;
import com.aliyun.mns.sample.scenarios.largeMessage.service.bean.MNSExtendedConfiguration;
import com.aliyun.mns.sample.scenarios.largeMessage.service.impl.MNSExtendedClientImpl;
import com.aliyun.mns.sample.utils.ReCreateUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyuncs.exceptions.ClientException;
import org.junit.Assert;
public class LargeMessageDemo {
private final static String OSS_ENDPOINT = "oss-cn-XXX.aliyuncs.com";
private final static String OSS_BUCKET_NAME = "mns-test-XXXXX-bucket";
private final static String MNS_QUEUE_NAME = "test-largeMessage-queue";
private final static String MNS_TOPIC_NAME = "test-largeMessage-topic";
/**
* Dalam contoh ini, pesan yang ukurannya lebih besar dari 4 KB dikirim ke OSS.
*/
private final static Long payloadSizeThreshold = 4L;
public static void main(String[] args) throws ClientException {
// Dapatkan kredensial akses dari variabel lingkungan.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Buat instance OSSClient.
OSS ossClient = new OSSClientBuilder().build(OSS_ENDPOINT, credentialsProvider);
// Buat instance MNS.
// Konfigurasikan AccessKey ID dan AccessKey secret di lingkungan berdasarkan spesifikasi Alibaba Cloud.
CloudAccount account = new CloudAccount(ServiceSettings.getMNSAccountEndpoint());
MNSClient client = account.getMNSClient();
CloudQueue queue = client.getQueueRef(MNS_QUEUE_NAME);
CloudTopic cloudTopic = client.getTopicRef(MNS_TOPIC_NAME);
//reCreate
ReCreateUtil.reCreateQueue(client,MNS_QUEUE_NAME);
ReCreateUtil.reCreateTopic(client,MNS_TOPIC_NAME);
// Konfigurasikan atribut antrian untuk pesan berukuran besar.
MNSExtendedConfiguration configuration = new MNSExtendedConfiguration()
.setOssClient(ossClient).setOssBucketName(OSS_BUCKET_NAME)
.setMNSQueue(queue)
.setMNSTopic(cloudTopic)
.setPayloadSizeThreshold(payloadSizeThreshold);
MNSExtendedClient mnsExtendedClient = new MNSExtendedClientImpl(configuration);
// Kirim pesan berukuran normal ke antrian.
Message normalMessage = new Message();
normalMessage.setMessageBodyAsRawString("1");
mnsExtendedClient.sendMessage(normalMessage);
Message message = mnsExtendedClient.receiveMessage(10);
System.out.println("[normal]ReceiveMsg:"+message.getMessageBodyAsRawString());
mnsExtendedClient.deleteMessage(message.getReceiptHandle());
// Kirim pesan berukuran besar ke antrian.
String largeMsgBody = "largeMessage";
Assert.assertTrue(largeMsgBody.getBytes().length > payloadSizeThreshold);
Message largeMessage = new Message();
largeMessage.setMessageBodyAsRawString(largeMsgBody);
mnsExtendedClient.sendMessage(largeMessage);
Message receiveMessage = mnsExtendedClient.receiveMessage(10);
System.out.println("[large]ReceiveMsg:"+receiveMessage.getMessageBodyAsRawString());
mnsExtendedClient.deleteMessage(receiveMessage.getReceiptHandle());
client.close();
ossClient.shutdown();
}
}