我有一个短信应用程序发送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发送短信的方法。谢谢!
答案 0 :(得分:0)
如果您要发送多条消息,则每条消息都会将其自己的路由发送到目标运营商。即使它们以正确的顺序发送,也无法保证它们将以正确的顺序在手机上接收。解决此问题的方法是使用最多1600个字符的串联消息(在美国)。如果您通过消息资源发送长消息,它将作为单个长消息接收。只需确保您使用的是消息资源:
@ client.account.messages.create()
而不是
client.account.sms.messages.create()
您可以在这里阅读更多内容:
http://twilio-ruby.readthedocs.org/en/latest/usage/messages.html