|From Amazon Queue documentation|
I created a cron job which would run my Laravel queue work command every 5 minutes. PHP is not really the best language for long-running processes which is why I elected to rather run a task periodically instead of listening all the time. This introduced some latency (which I could cut down) but this is acceptable in my use case (imports happen once a month and are only run manually if an automated import fails).
The problem that I faced was that my queue listener kept popping the same job off the queue. I didn't try running multiple listeners but I'm pretty confident weirdness would have resulted in that case as well.
Fixing the problem turned out to be a matter of configuring the visibility time of my queue. I was using the SQS provided default of 30 seconds. Amazon defines the visibility timeout as:
The period of time that a message is invisible to the rest of your application after an application component gets it from the queue. During the visibility timeout, the component that received the message usually processes it, and then deletes it from the queue. This prevents multiple components from processing the same message. Source: Amazon documentationThis concept is common to queues and exists in various names in Beanstalk and others. In Beanstalk the setting is called time-to-run and IronMQ refers to it as timeout. So if your run time exceeds your queue availability timeout then workers will pop off a job that is currently being run in another process.