为什么这些延期任务没有按照添加顺序执行?

时间:2012-09-16 21:05:47

标签: google-app-engine python-2.7 twilio

我正在使用Twilio发送带有appengine的短信。 Twilio不接受超过160个字符的短信,所以我必须拆分它们。我正在拆分短信并按如下方式发送:

def send_sms_via_twilio(mobile_number, message_text):
    client = TwilioRestClient(twilio_account_sid , twilio_auth_token)
    message = client.sms.messages.create(to=mobile_number, from_=my_twilio_number, body=message_text)

split_list = split_sms(long_message)
for each_message in split_list:
    send_sms_via_twilio(each_message)

但是我发现发送的顺序各不相同。例如,有时我会收到消息2/5然后1/5然后4/5等,其他时候订单是正确的。 split_list的顺序肯定是正确的。为了克服短信的不正确的顺序,我试过

for each_message in split_list:
    deferred.defer(send_sms_via_twilio, each_message, _countdown=1)

但是我遇到了同样的问题。然后我尝试了

for each_message in split_list:
    deferred.defer(send_sms_via_twilio, each_message, _countdown=1, _queue="send-text-message")

并将我的队列定义为

- name: send-text-message
  rate: 1/s
  bucket_size: 10
  max_concurrent_requests: 1
  retry_parameters:   
    task_retry_limit: 5

认为问题是并发(在python27中运行),如果我限制了max_concurrent_requests,这个问题就会得到解决。但是问题仍然存在,即文本仍然以错误的顺序发送。我检查了日志,但看不到任何任务失败的通知 - 它们似乎只是以错误的顺序执行。

我有什么遗失的吗?我该如何解决这个问题。

2 个答案:

答案 0 :(得分:4)

请注意,SMS消息(特别是SMPP等基础协议)根据定义是异步的。这意味着您无法指定不同 SMS消息的顺序。

是一种通过在这些消息的二进制正文中使用UDH(user defined headers)来指定SMS数据包顺序的方法。但这仅适用于长短信息 - 那些太长而无法在一条消息中发送的消息。例如,如果您的消息超过160个GSM-7字符或80个UTF-16字符,它将作为多条消息与UDH一起发送。

在这种情况下,手机在到达时不会显示消息部分。它会将它们收集在内存中,直到最后一个出现,然后以正确的顺序组装它们。对于最终用户而言,这只是一条比平常更长的消息,您不必在消息中写上“1/3”,“2/3”,...。

免责声明:我在一家公司工作,使您能够使用用户指定的标头(UDH)和/或标准长消息发送和接收多个二进制消息。

答案 1 :(得分:-1)

如果您没有与Twilio绑定,请尝试使用SMSified。它们会自动为您分割信息,确保信息顺序正确,并在信息末尾添加“1 / 2,2 / 2 ......”。换句话说,您只需将完整的消息发送到他们的REST API,无论长度如何,他们都会处理其余的消息。由于他们也使用REST API,因此您可以继续使用Python。