PHP-请问PHP如何操作RabbitMQ , web中使用队列一般是怎么设计的啊 ?

发布于 2016-12-21 03:20:10 字数 58 浏览 1322 评论 3

比较大的购物网站中的 购物车 , 结算 是不是都使用了队列啊 ?

能举一些例子吗 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瑾兮 2017-05-31 08:45:00

没有使用RabbitMQ,用的是HTTPSQS,使用队列还用怎么设计?

一个应用向队列写,而另外一个应用从队列读,这个不牵涉到什么复杂的地方。唯一要考虑的是加上重试队列,防止一次失败后就彻底失败。

简单说下我们这里同步微博的机制,发布内容应用每发一次内容,都会将要同步的内容写到同步队列当中,而同步守护应用,每隔1分钟读取一次队列,如果队列里有内容,则处理队列中的内容,如果没有,则继续等待1分钟,如果失败了,则加入重试队列,交给重试守护程序处理。

甜柠檬 2017-05-16 01:19:57

Exchange的几个类型以及工作方式:

1)直接交换类型(direct),点对点队列传输:
2)广播式交换类型(fanout),消息将被传递到所有和该交换器绑定的队列中:
3)主题式交换器类型(topic),根据routingkey(Exchange和Queue的绑定可以多对多的关系,每发送一条消息都要指定一个RoutingKey。然后Exchange将消息投递给队列,队列在通过相同的RoutingKey取。)中的关键字进行进行模糊匹配实现绑定多个队列。

一般应用中使用点对点队列传输就可以了,php用AMQP扩展,写段简单的发送消息和接收消息的伪代码:

发布消息:连接RabbitMQ

$conn =newAMQPConnection(配置);
$conn->connect();

//创建exchange名称和类型
$channel =newAMQPChannel($conn);
$ex =new AMQPExchange($channel);
$ex->setName(交换机名称);
$ex->setType(上边说的三种类型其中一种);
$ex->declare();

//创建queue名称,使用exchange,绑定routingkey
$q =new AMQPQueue($channel);
$q->setName(队列名称);
$q->declare();
$q->bind(交换机名称,'routingkey');

//消息发布
$channel->startTransaction();
$message = '消息内容';
$ex->publish($message,'routingkey');
$channel->commitTransaction();
$conn->disconnect();

接收消息:

//连接RabbitMQ
$conn = new AMQPConnection(配置);
$conn->connect();

//设置queue名称,使用exchange,绑定routingkey
$channel = new AMQPChannel($conn);
$q = new AMQPQueue($channel);
$q->setName(发送使用的队列名称);
$q->declare();
$q->bind(发送使用的交换机名称, 'routingkey');  
 
//消息获取
$messages = $q->get(AMQP_AUTOACK);
var_dump($messages); //输出消息
$conn->disconnect();

具体看手册上AMQP扩展的使用。

队列使用场景我列几个(web方面):
1,与业务的主要逻辑无关,但又需要执行,可以使用队列异步处理,举例子:

比如发布答案,使用队列的逻辑是:提交答案 -> 答案数据入库 -> 将添加答案后的其他任务放入队列 -> 响应客户端操作结果
队列接收任务 -> 给问题的关注者发通知 -> 给发布答案用户的粉丝投递feed -> 给关注该问题下的用户发送feed -> 给设置了关注问题下有新答案的用户发送邮件通知 -> 回答者自动关注该问题 -> 等等等。

如果不使用队列那么这一系列的操作都执行完,才给用户反馈操作结果的话,太慢了,用户体验也太差了。

2,耗时操作放队列执行,一般不关心执行结果,举个大家经常用的到发邮件:

如注册激活邮件已经重新发送邮件,注册成功 -> 将发送激活邮件的任务放入队列 -> 提示收取邮件; 新发送邮件 -> 放入队列 -> 响应已发送

3,利用队列特性,使一些应用更简单

1)如队列支持多种语言客户端,那么就可以实现不同语言间的相互通信
2)比如有些队列支持 delay 特性,那么可以简单的实现一些定时程序,如自动颁发悬赏,以及自动解除禁闭用户,等。

对于初次使用消息队列,还是建议使用 httpsqs,memcacheq, 然后 beanstalkd ,最后是 RabbitMQ ,相比来说RabbitMQ 算难点的。 如何选取还是根据实际情况来定,一般 httpsqs 就够了,但是没有延迟队列,如果系统中会用的话,还是用 beanstalkd 吧,memcacheq 没有详细了解过。

灵芸 2016-12-21 11:44:07

以下这些语言都是支持的
C# (using .net/c# client)
erlang (using erlang client)
java (using java client)
perl (using Net::RabbitFoot)
php (using a fork of php-amqplib)
python (using pika)
python-puka (using puka)
ruby (using amqp gem)

消息传递操作流程介绍

消息传递操作流程介绍
AMQP 有四个非常重要的概念:
虚拟机(virtual host),交换机(exchange),队列(queue)和绑定(binding)。

虚拟机: 通常是应用的外在边界,我们可以为不同的虚拟机分配访问权限。
     虚拟机可持有多个交换机、队列和绑定。

交换机: 从连接通道(Channel)接收消息,并按照特定的路由规则发送给队列。

队列: 消息最终的存储容器,直到消费客户端(Consumer)将其取走。

绑定: 也就是所谓的路由规则,告诉交换机将何种类型的消息发送到
    某个队列中。

消息传递操作流程介绍
消费者: 创建信息通道。
消费者: 定义消息队列。
消费者: 定义特定类型的交换机。
消费者: 设定绑定规则 (包括交换机名称、队列名称以及路由键)
消费者: 等待消息。
生产者: 创建消息。
生产者: 将消息投递给信息通道 (注明接收交换机名称和路由键)
交换机: 获取消息,依据交换机类型决定是否匹配路由规则
消费者: 获取并处理消息,发送反馈。
结束: 关闭通道和连接。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文