2013-07-26 1 views
3

В соответствии с SQS docs возможно отправлять сообщения до 256 Кбайт данных. Я настроил свою очередь на 256 Кбайт данных, но когда я отправляю сообщение с помощью boto, я максимизирую на ~ 196 000 байт. Все, что по этому поводу, я получаю следующий ответ от SQS:AWS boto sqs - почему я не могу отправлять сообщения размером более 196 000 байт?

boto.exception.SQSError: SQSError: 400 Bad Request 
<?xml version="1.0"?><ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/"> 
<Error><Type>Sender</Type><Code>InvalidParameterValue</Code><Message> 
Value for parameter  MessageBody is invalid. Reason: Message body must be shorter  than 262144 bytes.</Message> 
<Detail/></Error><RequestId>dd24151b-d499-5bb1-acd0-5f776011e960</RequestId></ErrorResponse> 

небольшая программа питона для иллюстрации:

from boto.sqs.message import Message 
from boto.sqs.connection import SQSConnection 
from boto.sqs.message import Message 
import sys 

sqs_conn = SQSConnection(AWS_KEY, AWS_SECRET) 

data = mylong_256kb_string 

print sys.getsizeof(data) 
current_queue = sqs_conn.create_queue('test_temp_queue') 

m = Message() 
m.set_body(data) 

current_queue.write(m) 

ответ

4

Это потому, что по умолчанию, бото base64 кодирует полезную нагрузку сообщения перед его отправкой и декодирует его при чтении. Это происходит главным образом из-за исторических причин; в первые дни SQS было много ограничений на то, какие символы могут быть в сообщении SQS. На самом деле это не так, поэтому кодирование/декодирование, вероятно, не обязательно.

Чтобы обойти это, используйте только boto.message.RawMessage класс, а не boto.message.Message.

+0

Отлично! Это никогда не приходило мне в голову, но ты прав. Ура! –