far*_*ace 0 php mysql innodb transactions process
我试图找出实现队列系统的难度.我知道如何实现一个基本队列,所以我将解释一下我之后的一些背景:
我将实现一个将放置消息的队列,这将来自多个用户,消息将被安排在用户定义的时间发布(允许多次出现,精确度为Minutes,从UI角度来看,我将限制:"每分钟或每小时"出现,但ID仍然能够处理这个系统).
这是我的问题所在:最终我可能处于某种情况(也许不是)当前需要发布许多消息的情况,我希望有几个进程(多个脚本实例)运行来获取[x,10,25]一次从队列中发送的消息数并处理它们.问题是:如何执行此操作以便每个实例处理唯一的消息(不处理已由另一个实例处理的内容)?我担心当前的连接,如何锁定记录,以及我可能没有想到的任何其他事情.
我将使用的技术是PHP和MySQL.我正在寻找上述的一些解决方案,我应该在我的搜索,真实世界的例子,想法,评论和想法中使用的术语?
谢谢大家!
我遇到的一个解决方案是使用Amazon Simple Queue Service ...它承诺独特的消息处理/锁定http://aws.amazon.com/sqs/
好吧,我会这样做:
为消息创建表,并添加另外两个字段 - "PROCESS_ID"和"PROCESS_TIME".这些将在后面解释.
为每个进程提供唯一的ID.他们可以在启动时生成它(如GUID),或者您可以自己分配它们(然后您可以更容易地分开它们).
当一个进程想要获取一堆消息时,它会执行以下操作:
UPDATE messages SET process_id=$id, process_time=now() where process_id is null LIMIT 20这将找到20个"免费"消息并"锁定"它们.然后它会找到它锁定的消息并处理它们.处理完每条消息后,DELETE就可以了.
UPDATE语句应该是非常原子的,特别是如果你使用InnoDB,它会自动将每个这样的语句包装在一个事务中.MySQL应该关注那里的所有并发性.
PROCESS_TIME字段是可选的,但您可以使用它来查看进程何时挂起.如果邮件被锁定的时间过长,您可以断定出现问题并进行调查.