首页 > 如何用redis做消息队列的应用

如何用redis做消息队列的应用

我有一个php代码,接受任意客户端的请求,现在想在后端加上redis的队列将消息传递到别的处理模块。
大致结构如下
client a \
client b — broker.php -> redis -> worker.php
client c /
... /
1,broker.php如何获取后端worker.php的处理结果(是引入一个响应队列么)
2,如果引入响应队列,broker.php如何将不同的结果对应返回给abc...客户端
3,如果php无法实现这种场景,有其它什么建议方法没,给点参考资料,thanks!


后端:
redis.blpush

模块:
redis.brpop

文档:
http://redis.io/commands

//PHP我不太知道,这类问题应该都是这个思路吧?可以先用命令模拟出机制,然后调用库实现


redis只是提供一个高性能的、原子操作的分布式队列实现。具体的业务还是得需要你自己定制。
你的需求实际上是一个变形的生产者-消费者实现。对于此类需求,主要是将请求和实际的处理过程解耦,一般都是采取异步的方式来通知请求方,这跟用不用redis其实没有多大的关系。一般的实现方法是你需要将用户的请求封装成一个Task,然后将这个Task再push到redis队列,然后后端的worker.php完全可以多进程、多线程的并发处理Task并将处理结果回调给请求方。这里唯一麻烦点的就是这个Task的设计,需要能够包含请求信息(请求内容,请求方标识等等).


http://zyan.cc/httpsqs/


模式:安全的队列
Redis通常都被用做一个处理各种后台工作或消息任务的消息服务器。 一个简单的队列模式就是:生产者把消息放入一个列表中,等待消息的消费者用 RPOP 命令(用轮询方式), 或者用 BRPOP 命令(如果客户端使用阻塞操作会更好)来得到这个消息。
然而,因为消息有可能会丢失,所以这种队列并是不安全的。例如,当接收到消息后,出现了网络问题或者消费者端崩溃了, 那么这个消息就丢失了。
RPOPLPUSH (或者其阻塞版本的 BRPOPLPUSH) 提供了一种方法来避免这个问题:消费者端取到消息的同时把该消息放入一个正在处理中的列表。 当消息被处理了之后,该命令会使用 LREM 命令来移除正在处理中列表中的对应消息。
另外,可以添加一个客户端来监控这个正在处理中列表,如果有某些消息已经在这个列表中存在很长时间了(即超过一定的处理时限), 那么这个客户端会把这些超时消息重新加入到队列中。


楼主是想要实现异步响应客户端的请求吧。把耗时的请求交给worker处理。建议加callback 实现。

【热门文章】
【热门文章】