原文:本文出自 “峰云,就她了。” http://rfyiamcool.blog.51cto.com/1030776/1131271
用我的话来说, 队列特点是先进先出,在任务调度时,有时候需要保证先进入的任务先执行,所以需要使用队列。
下面这段话来自VMWare的网站,个人觉得关于消息队列的作用的概括简明扼要,遂摘录至此:
现 代的互联网应用大量地使用了消息队列(Messaging)。消息队列不仅被用于系统内部组件之间的通信,同时也被用于系统跟其它服务之间的交互。消息队 列的使用可以增加系统的可扩展性、灵活性和用户体验。非基于消息队列的系统,其运行速度取决于系统中最慢的组件的速度(注:短板效应)。而基于消息队列可 以将系统中各组件解除耦合,这样系统就不再受最慢组件的束缚,各组件可以异步运行从而得以更快的速度完成各自的工作。
【更新2012-6-28】
刚知道原来虎扑网也使用了消息队列(RabbitMQ),来看看他们的观点:
消息队列能够将业务逻辑解耦,调用方只需要下达命令而不用等待整个逻辑执行完毕。除此之外消息队列也可以抑制性能波峰的产生,在瞬时业务增长产生时保持性能曲线的平滑。
【更新2012-6-29】
博文“使用django+celery+RabbitMQ实现异步执行”中展示了一个消息队列的典型应用:
发 帖之后只需给队列发送一条消息, 告诉队列“我发帖子了”,然后把发帖的结果返回给用户。 这时另一个叫做worker的进程会取出这条消息并执行那100条INSERT查询。这样,推送通知的操作在后台异步执行, 用户就能立即看到发帖结果。更精彩的是,可以运行多个worker实现分布式,多繁重的任务都不在话下了。
在ptyhon中,可以用下ztq,这个我没有用,对于我来说还是复杂点~
ZTQ:Z Task Queue
https://github.com/everydo/ztq
在php中的应用
1 入队操作 2 3 $redis = new Redis(); 4 5 $redis->connect('127.0.0.1',6379); 6 7 while(True){ 8 9 try{ 10 11 $value = 'value_'.date('Y-m-d H:i:s'); 12 13 $redis->LPUSH('key1',$value); 14 15 sleep(rand()%3); 16 17 echo $value." "; 18 19 }catch(Exception $e){ 20 21 echo $e->getMessage()." "; 22 23 } 24 25 } 26 27 出队操作 28 29 $redis = new Redis(); 30 31 $redis->pconnect('127.0.0.1',6379); 32 33 while(True){ 34 35 try{ 36 37 echo $redis->LPOP('key1')." "; 38 39 }catch(Exception $e){ 40 41 echo $e->getMessage()." "; 42 43 } 44 45 sleep(rand()%3); 46 47 }
我的python应用
1 入队列 2 3 #!/usr/bin/env python 4 5 import time 6 7 from redis import Redis 8 9 redis = Redis(host='127.0.0.1', port=6379) 10 11 while True: 12 13 now = time.strftime("%Y/%m/%d %H:%M:%S") 14 15 redis.lpush('test_queue', now) 16 17 time.sleep(1)
#!/usr/bin/env python import sys from redis import Redis redis = Redis(host='127.0.0.1', port=6379) while True: res = redis.rpop('test_queue') if res == None: pass else: print str(res)