sidekiq工人以错误的顺序发送twilio电话

时间:2014-05-06 02:17:24

标签: ruby-on-rails twilio sidekiq

我有一个短信应用程序发送SMS消息发送给sidekiq工作人员,然后ping twilio实际发送消息。我遇到的问题是,通过向工作人员发送消息,有时会以错误的顺序发送超过160个字符的消息。我认为这是因为sidekiq同时运行作业。我该如何解决这个问题?

以前,我会遍历邮件的每个160个字符,并将每个160个字符的字符串发送给要发送的工作人员。这导致了问题,因为工作人员会得到设置并同时运行以使消息无序。为了解决这个问题,我将160字符逻辑移到了worker中,我认为这解决了单个消息的问题。

但是,如果在1-2秒内发出多条消息,它们会同时发送,因此可能会再次出现故障。如何确保sidekiq按照我调用perform_async方法的顺序处理消息?这是我的代码:

// messages_controller.rb

SendSMSWorker.new.perform(customer.id, message_text, 'sent', false, true)

// send_sms_worker.rb

def perform(customer_id, message_text, direction, viewed, via_api)
    customer = Customer.find(customer_id)
    company  = customer.company
    texts = message_text.scan(/.{1,160}/) # split the messages up into 160 char pieces
    texts.each do |text|
      message = customer.messages.new(
        user_id:     company.admin.id, # set the user_id to the admin's ID when using the api
        company_id:  company.id,
        text:        text,
        direction:   'sent',
        viewed:      false,
        via_api:     true
      )
      # send_sms returns nil if successful
      if error = message.send_sms
        customer.mark_as_invalid! if error.code == 21211
      else
        # only save the message if the SMS was successfully sent
        puts "API_SEND_MESSAGE company_id: #{company.id}, customer_id: #{customer.id}, message_id: #{message.id}, texts_count: #{texts.count}"
        message.save
        Helper.publish(company.admin, message.create_json_with_extra_attributes(true))
      end
    end
  end

要清楚,message.send_sms是消息模型上实际通过twilio发送短信的方法。谢谢!

1 个答案:

答案 0 :(得分:0)

如果您要发送多条消息,则每条消息都会将其自己的路由发送到目标运营商。即使它们以正确的顺序发送,也无法保证它们将以正确的顺序在手机上接收。解决此问题的方法是使用最多1600个字符的串联消息(在美国)。如果您通过消息资源发送长消息,它将作为单个长消息接收。只需确保您使用的是消息资源:

@ client.account.messages.create()

而不是

client.account.sms.messages.create()

您可以在这里阅读更多内容:

https://www.twilio.com/help/faq/sms/does-twilio-support-concatenated-sms-messages-or-messages-over-160-characters

http://twilio-ruby.readthedocs.org/en/latest/usage/messages.html