全部博文(921)
分类: Erlang
2015-06-04 14:07:28
Exchange的几个类型以及工作方式:
1)直接交换类型(direct),点对点队列传输:
2)广播式交换类型(fanout),消息将被传递到所有和该交换器绑定的队列中:
3)主题式交换器类型(topic),根据routingkey(Exchange和Queue的绑定可以多对多的关系,每发送一条消息都要指定一个RoutingKey。然后Exchange将消息投递给队列,队列在通过相同的RoutingKey取。)
中的关键字进行进行模糊匹配实现绑定多个队列。
一般应用中使用点对点队列传输就可以了,php用AMQP扩展,写段简单的发送消息和接收消息的伪代码:
发布消息:
接收消息:
具体看手册上AMQP扩展的使用。
队列使用场景我列几个(web方面):
1,与业务的主要逻辑无关,但又需要执行,可以使用队列异步处理,举例子:
比如德问的发布答案,使用队列的逻辑是:提交答案 -> 答案数据入库 -> 将添加答案后的其他任务放入队列 -> 响应客户端操作结果
队列接收任务 -> 给问题的关注者发通知 -> 给发布答案用户的粉丝投递feed -> 给关注该问题下的用户发送feed -> 给设置了关注问题下有新答案的用户发送邮件通知 -> 回答者自动关注该问题 -> 等等等。
如果不使用队列那么这一系列的操作都执行完,才给用户反馈操作结果的话,太慢了,用户体验也太差了。
2,耗时操作放队列执行,一般不关心执行结果,举个大家经常用的到发邮件:
如注册激活邮件已经重新发送邮件,注册成功 -> 将发送激活邮件的任务放入队列 -> 提示收取邮件; 新发送邮件 -> 放入队列 -> 响应已发送
3,利用队列特性,使一些应用更简单
1)如队列支持多种语言客户端,那么就可以实现不同语言间的相互通信
2)比如有些队列支持 delay 特性,那么可以简单的实现一些定时程序,如德问的自动颁发悬赏,以及自动解除禁闭用户,等。
对于初次使用消息队列,还是建议使用 httpsqs,memcacheq, 然后 beanstalkd ,最后是 RabbitMQ ,相比来说RabbitMQ 算难点的。 如何选取还是根据实际情况来定,一般 httpsqs 就够了,但是没有延迟队列,如果系统中会用的话,还是用 beanstalkd 吧,memcacheq 没有详细了解过。