既に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