Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5120053
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Erlang

2015-06-04 14:07:28

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

1)直接交换类型(direct),点对点队列传输:


2)广播式交换类型(fanout),消息将被传递到所有和该交换器绑定的队列中:




3)主题式交换器类型(topic),根据routingkey(Exchange和Queue的绑定可以多对多的关系,每发送一条消息都要指定一个RoutingKey。然后Exchange将消息投递给队列,队列在通过相同的RoutingKey取。)

中的关键字进行进行模糊匹配实现绑定多个队列。




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

发布消息:


  1. 连接RabbitMQ
  2. $conn =newAMQPConnection(配置);
  3. $conn->connect();

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

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

  15. //消息发布
  16. $channel->startTransaction();
  17. $message = '消息内容';
  18. $ex->publish($message,'routingkey');
  19. $channel->commitTransaction();
  20. $conn->disconnect();

接收消息:


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

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

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

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

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

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

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

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

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

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

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



阅读(1860) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~