2011-11-07 59 views
1

我正在致力于图像托管网站(图库的竞争对手),并需要加强我的游戏。新照片通过FTP上传或放置在服务器上,并进行索引(快速),然后稍后缩略图(缓慢)。PHP/MySQL中的异步消息传递?

  1. 最简单的实现是允许用户上传,然后索引和缩略图,而他们等待(缓慢的网页加载)。管理员可以登录索引,然后缩略图手动上传的其他文件(缓慢页面加载,刷新并可能需要几小时)。

  2. 我现在的实现是用户上传原因索引,而他们等待,有时(随机)整个网站索引在正常页面负载之上搭载(对用户造成额外的边缘延迟)。网站上的网页指的是缩略图应该存在的网址。如果用户请求不存在的缩略图,则在等待时创建它(“懒惰缩略图”)。

2的好处是在多核系统上使用所有内核。缺点是,第一次需要一页新照片加载30x50 MB,并且页面超时,其中一些图像完成,其他图像处理最后的加载。

问题是在这里实现任务处理的正确方法是什么?如果它扩展到共享数据库上的多个服务器,则为奖励点。

一个想法如下(可能是乱码)

我想过做一个数据库中的作业表:

id INT NOT NULL AUTO_INCREMENT, 
priority INT NOT NULL, 
worker INT, 
workstarted DATETIME, 
func CHAR(10) NOT NULL, 
args VARCHAR NOT NULL, 
PRIMARY KEY(id), 
INDEX(priority), 
UNIQUE(func,args) -- prevent duplicate jobs if user does F5 

然后当工作需要完成,插入一行,并创建一个工作者线程(如果足够的线程不存在)。然后等待响应,并在作业成功完成或5秒后超时后继续。如果发生超时,请使用AJAX将内容提供给用户。

事情我不知道该怎么做这种方法是:如果足够的工作线程存在(使用表和心脏跳动?),工作人员如何发送响应(完成时删除作业和如果失败,写另一个表?),请求者如何高效地等待响应或超时(比轮询数据库更好?)。根据这些方法,系统可以随着在不同服务器上运行的员工进行扩展。

回答

2

我建议使用ZeroMQ来解决您的问题。

这是一个带多种语言(包括PHP)绑定的套接字框架。您可以在不使用数据库的情况下开发一个工作者系统,并且可以跨多个节点(执行工作的物理机器)扩展工作。

Here's an introduction to the 0MQ

Here's the documentation with PHP examples

Here's the 0MQ guide at github

主观意见:它只是摇滚使用0MQ。它速度非常快,有很多例子,并附有优秀的指南。

+0

这看起来像是要走的路。这是一个成熟的项目,所以我需要检查和评估0MQ的成熟程度,并确保它不会很快被取代。谢谢! –

+0

祝您的项目顺利! :) –