この記事では、Simple Message Queue(旧称 MNS) を使用して、メッセージを分割せずに 64 KB より大きいサイズのメッセージを転送する方法について説明します。
背景情報
Simple Message Queue(旧称 MNS) キュー内のメッセージの最大サイズは 64 KB です。この制限は、スロットリングが実装されている場合、ほとんどの場合のデータ交換のニーズを満たすことができます。この場合、メッセージが 64 KB より大きい場合は、分割する必要があります。
MNS は、メッセージを分割せずに 64 KB より大きいサイズのメッセージを送信できるソリューションを提供します。
ソリューション
- プロデューサークライアントが 64 KB より大きいサイズのメッセージを Simple Message Queue(旧称 MNS) に送信する場合、クライアントはメッセージをオブジェクトストレージサービス(OSS)にアップロードします。
- プロデューサークライアントは、メッセージを含む OSS オブジェクト情報を Simple Message Queue(旧称 MNS) に送信します。
- コンシューマークライアントは、Simple Message Queue(旧称 MNS) キューからメッセージを読み取り、メッセージの内容が OSS オブジェクトの情報であるかどうかを判断します。
- メッセージの内容が OSS オブジェクトの情報である場合、コンシューマークライアントは OSS オブジェクトをダウンロードし、メッセージの内容を上位層アプリケーションに返します。
次の図は、メッセージ転送プロセスを示しています。

サンプルコード
MNS は、サイズの大きいメッセージを転送するための Java サンプルコードを提供しています。サンプルコード をダウンロードしてください。 BigMessageSizeQueue クラスは、必要なすべての機能をカプセル化しています。
BigMessageSizeQueue は、次のパブリックメソッドを提供します:
// コンストラクターを指定します。 cq は共通の mnsqueue オブジェクトです。 ossClient と ossBucketName には、サイズの大きいメッセージの転送に使用する OSS リージョンとバケットの情報が含まれています。
public BigMessageSizeQueue(CloudQueue cq, OSSClient ossClient, String ossBucketName)
// メッセージを送信します。
public Message putMessage(Message message)
// メッセージを受信します。
public Message popMessage(int waitSeconds)
// メッセージを削除します。
public void deleteMessage(String receiptHandle)
// メッセージの最大サイズを指定します。メッセージのサイズがこの制限を超えると、メッセージは OSS を使用して転送されます。デフォルト値: 64 KB。
public void setBigMessageSize(long bigMessageSize)
// メッセージを含む OSS オブジェクトを削除するかどうかを指定します。デフォルト値: はい。
public void setNeedDeleteMessageObjectOnOSSFlag(boolean flag) サンプルコードの詳細については、「Demo.java」ファイルをご参照ください。
注意事項
- サイズの大きいメッセージの転送には、大量のネットワーク帯域幅が消費されます。プロデューサークライアントとコンシューマークライアントで帯域幅のボトルネックが発生する可能性があります。
- サイズの大きいメッセージの転送には時間がかかり、ネットワークのジッターの影響を受ける可能性があります。エラーが発生した場合は、上位層で再試行することをお勧めします。