PHP / MySQL中的异步消息传递?

时间:2011-11-07 15:19:07

标签: php mysql asynchronous scalability message-queue

我正在处理图片托管网站(Gallery的竞争对手),需要加强我的游戏。新照片通过FTP上传或放置在服务器上并被编入索引(快速),然后稍后缩略图(慢)。

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

  2. 我现在的实现是用户上传导致索引等待,有时(随机)整个站点索引捎带在正常页面加载之上(导致用户额外的边际延迟)。网站上的页面是指缩略图所在的URL(如果存在)。如果用户请求不存在的缩略图,则会在等待时创建(“懒惰缩略图”)。

  3. 2的好处是在多核系统上使用所有核心。缺点是第一次新照片加载30x50 MB并且页面超时,一些图像完成,其他图像处理子请求加载。

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

    接下来有一个想法(可能是动摇)

    我考虑过在DB中创建一个作业表:

    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将内容提供给用户。

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

1 个答案:

答案 0 :(得分: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。这是非常快的,有很多例子,还有一个很好的指南。