|
1
5
好吧,我会这样做的: 为消息创建表,再添加两个字段-“进程ID”和“进程时间”。这些将在后面解释。 给每个进程一个唯一的ID。它们可以在启动时生成它(如guid),或者您可以自己分配它们(然后您可以更容易地将它们区分开来)。 当一个进程想要获取一堆消息时,它会这样做:
这将找到20条“免费”消息并“锁定”它们。然后它将找到它锁定的消息并处理它们。在处理每个消息之后,
update语句应该是非常原子的,特别是使用innodb时,它会自动将每个这样的语句包装在事务中。MySQL应该处理所有的并发性。 进程时间字段是可选的,但您可以使用它查看进程何时挂起。如果一条消息被锁定的时间太长,您可以断定出了问题并进行调查。 |
|
|
2
1
你可以扭转这个问题。 而不是同时把事情从队列中拿出来。一旦你得到了所有的信息,就发布它。 但是 用一个规则发布它,直到某个时间它才被显示出来。这样做可以帮助您避免锁定/争用问题。 |
|
|
3
1
看看 Beanstalkd 消息队列。它有PHP客户端。Beanstack的一个好特性(与Dropr相反)是您可以延迟消息。也就是说,您可以将消息发送到队列,直到x秒过去,它才会被传递到客户机。 不过,beanstack有一个很大的缺点:它是内存队列。这意味着如果它(或您的机器)崩溃,那么队列是空的,内容也会丢失。持久性是为下一个版本的beanstack计划的一个特性。 |
|
|
4
0
一些在线解决方案: 我想谷歌的解决方案要便宜得多(如果不用的话甚至可以免费)。 我还考虑在php/mysql中实现队列,并考虑使用:
|