我开发了一个rest api,它接受一些数据并将其存储在消息队列中(Redis List)。现在从redis这个数据被推送到MySQL数据库。 问题是客户端需要等到数据写入mysql。
我希望客户端应该等到数据写入消息队列(Redis List),并且将数据推送到MySQL的函数应该异步执行。 我该怎么做 ?我的整个代码库都是用PHP编写的,所以我更喜欢用PHP格式。
我读过这篇文章却没有尝试过。
Distributed queue example in PHP using Redis
我很困惑如何执行slave.php(在链接中提到)。我的意思是当一条新消息到达队列时,slave.php将如何找到它。
我不想为此使用cronjob。相反,当新消息到达时,slave.php应该异步执行。怎么做?
答案 0 :(得分:11)
是的,使用Memqueue,Redis等非常有可能。
使用Redis,这就是人们可以做到的:
这个PHP文件在获取它时将消息推送到队列中:
/*
Code logic
*/
$redis->lPush("message_queue", "message 1");
使用slave.php
执行“阻止弹出”的brPop
:
$redis = new Redis();
$redis->pconnect();
while (true) {
list($queue, $message) = $redis->brPop(["message_queue"], 0);
/*
Logic to insert $message to MySQL
*/
}
现在每当有新消息到达时,slave.php
都会抓住它并将其推送到MySQL。
不要被while(true)
混淆 - 上面的代码不在无限循环中运行。 brPop
异步等待,直到队列中有新消息。
我正在使用PHP 5.4并连接到Redis 2.6及以上版本工作正常。更好的是,您可以拥有多个slave.php
文件并分配负载。
答案 1 :(得分:0)
您的问题远不清楚您的系统目前是如何运作的。
当新消息到达时,slave.php应该异步执行。
这句话是矛盾的。如果消息的处理是异步发生的,那么根据定义,它不会与消息的创建联系起来。
我怀疑问题在于你没有守护进程来处理消息的出列 - 但是解释如何编写这样的程序远远超出了答案的范围。