読者です 読者をやめる 読者になる 読者になる

Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Queueのメッセージサイズについて

既にFAQの域に達しているかもしれませんが、Queueのメッセージサイズについて。
至る所で、Queueのメッセージサイズは8KB、8KBと呪文のように聞いたり
見たりしていたので、そうなんだろうなと漠然と思ってましたが、これが
大間違い。(というか自分の勘違い!?)

結論から言うと、Queueのメッセージサイズは、メッセージを
base64エンコードした結果が8KB以内なんですね。
ちゃんとMSDNに書いてあったっけ?

検証コードで試してみます。今回もLINQPadを使います。

以下のサンプルでは、

  • "A" を 8192 に設定
  • base64 で長さが10924になる。
  • CloudQueueMessageで例外が発生

となります。

    var b = new StringBuilder(10000);
    for(int i = 0; i < 8192; i++ ) b.Append("A");
    
    int b64length = Convert.ToBase64String(Encoding.UTF8.GetBytes(b.ToString())).Length;
    
    Console.WriteLine ("base64 =  " + b64length);
    Console.WriteLine ("orignal = " + b.Length);
    try {    
        var msg = new CloudQueueMessage(b.ToString());
        Console.WriteLine ("OK");
    } 
    catch(ArgumentException e)
    {
        Console.WriteLine (e.ToString());
    }


base64 = 10924
orignal = 8192
System.ArgumentException: Messages cannot be larger than 8192 bytes.
場所 Microsoft.WindowsAzure.StorageClient.CloudQueueMessage..ctor(String content)
場所 UserQuery.Main() 場所 c:\Users\statemachine\AppData\Local\Temp\wrlearln.0.cs:行 53


すこし調整して、6144くらいにしてみます。

    var b = new StringBuilder(10000);
    for(int i = 0; i < 6144; i++ ) b.Append("A");
    ...
    ...

ちょうどbase64エンコードした長さが8192になるので、OKとなります。
3byte -> 4byte にするんで、ちょうど計算があいますかね。


base64 = 8192
orignal = 6144
OK

では、日本語の場合は、大体の場合は、3バイトになるから
2048文字になります。

    var b = new StringBuilder(10000);
    for(int i = 0; i < 2048; i++ ) b.Append("あ");
    ...
    ...


base64 = 8192
orignal = 2048
OK