我正在使用Amazon SQS队列,我有一个消耗队列消息的类。我试图尽可能接近实时消息,所以我需要消耗代码无休止地运行。队列中的消息将持续超过半天。
我遇到过一些无休止地解决这个问题的解决方案,我想知道是否有这种需求的最佳实践。
选项1
在Web服务器上使用delayed_job或sidekiq在后台连续运行该过程。
选项2
让一个单独的服务器有一个专用于使用消息的ruby应用程序。
选项3
将SQS使用者置于rake任务中并使用系统调用在后台触发任务。
非常感谢任何见解!
答案 0 :(得分:5)
您可以使用shoryuken。
它将持续消耗您的消息,直到您的队列有消息。
shoryuken -r your_worker.rb -C shoryuken.yml \
-l log/shoryuken.log -p shoryuken.pid -d
答案 1 :(得分:1)
正如您可能已经发现的那样,没有一种明显的正确方法™来处理这类事情。这在很大程度上取决于您为每项工作所做的工作,应用程序和基础架构的大小,以及您对API,消息排队理念和架构的个人偏好。
那就是说,我可能会根据您的描述倾向于选项2。 Sidekiq和delayed_job不会说SQS,虽然你可以用类似sidekiq-sqs的东西教他们,但听起来你可能很快就会长大。除非您需要为您的工作人员提供Rails环境,否则您可以更好地将队列使用者分成不同的应用程序,这样只需通过启动更多进程就可以轻松地进行水平扩展。它还允许您进一步将工作人员与Rails应用程序分离,这可以使部署和管理更容易。
选项3是非首发IMO。你想要让一个守护进程运行来处理工作,如果rake必须在每个工作上加载你的环境,事情就会变得懒散。