Web应用中的轻量级消息队列
来源:互联网 发布:男网红的淘宝店 编辑:程序博客网 时间:2024/04/30 10:30
Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update 之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。在Web2.0的时代,高并发的情况越来越常见,从而使消息队列有成为居家必备的趋势,相应的也涌现出了很多实现方案,像Twitter以前就使用RabbitMQ(http://www.rabbitmq.com/)实现消息队列服务,现在又转而使用Kestrel(http://github.com/robey/kestrel)来实现消息队列服务,此外还有很多其他的选择,比如说:ActiveMQ(http://activemq.apache.org/),ZeroMQ(http://www.zeromq.org/)等。
上述消息队列的软件中,大多为了实现AMQP,STOMP,XMPP之类的协议,变得极其重量级,但在很多Web应用中的实际情况是:我们只是想找到一个缓解高并发请求的解决方案,不需要杂七杂八的功能,一个轻量级的消息队列实现方式才是我们真正需要的。
第一感觉是能不能使用memcached(http://www.danga.com/memcached/)来实现消息队列?稍加考虑后就会发现它不合适,因为memcached仅仅支持键值方式的操作,没有排序之类的功能,所以如果要用它来实现消息队列,则必须自己通过某个键来保存数组形式的队列,不过这样的话,在操作队列的时候很容易丢失数据,比如说我们要添加一个消息,则需先取出现有队列,然后把消息保存到队列尾部,最后保存队列,单纯使用memcached的话,由于我们无法保证整个过程的原子性,所以当处理若干个并发请求时,各个请求间可能会互相覆盖,丢失数据就在所难免。另外,memcached只是内存键值缓存而已,一旦宕机,数据就消失了。
memcacheq(http://memcachedb.org/memcacheq/)的出现解决了上面的问题,它在memcached的基础上实现了消息队列,以php客户端为例:
消息从尾部入栈:memcache_set
消息从头部出栈:memcache_get
memcacheq依附于memcached之上,所以你可以通过现有的memcached工具来操作它,这无疑是它的一大优势,但它也有一个很大的缺点,那就是memcacheq本身的开发维护似乎并不活跃,如果遇到问题的话,你很可能需要自己动手解决。
目前看来,我更推荐下面这种解决方案,那就是redis(http://code.google.com/p/redis/),表面上看,redis和memcached差不多,也是键值操作,但是redis本身实现了list,相关操作也可以保证是原子的,所以可以很自然的通过list来实现消息队列:
消息从尾部入栈:RPUSH
消息从头部出栈:LPOP
redis本身虽然是一个新项目,但很有朝气,开发维护也很活跃,如果你的下一个Web应用里需要使用轻量级的消息队列,不妨使用它。
此外,还有不少其他的选择可供尝试,比如说MySQL第三方的Q4M(http://q4m.31tools.com/)引擎,通过扩展SQL语法来操作消息队列,也是一个不错的选择。
上述消息队列的软件中,大多为了实现AMQP,STOMP,XMPP之类的协议,变得极其重量级,但在很多Web应用中的实际情况是:我们只是想找到一个缓解高并发请求的解决方案,不需要杂七杂八的功能,一个轻量级的消息队列实现方式才是我们真正需要的。
第一感觉是能不能使用memcached(http://www.danga.com/memcached/)来实现消息队列?稍加考虑后就会发现它不合适,因为memcached仅仅支持键值方式的操作,没有排序之类的功能,所以如果要用它来实现消息队列,则必须自己通过某个键来保存数组形式的队列,不过这样的话,在操作队列的时候很容易丢失数据,比如说我们要添加一个消息,则需先取出现有队列,然后把消息保存到队列尾部,最后保存队列,单纯使用memcached的话,由于我们无法保证整个过程的原子性,所以当处理若干个并发请求时,各个请求间可能会互相覆盖,丢失数据就在所难免。另外,memcached只是内存键值缓存而已,一旦宕机,数据就消失了。
memcacheq(http://memcachedb.org/memcacheq/)的出现解决了上面的问题,它在memcached的基础上实现了消息队列,以php客户端为例:
消息从尾部入栈:memcache_set
消息从头部出栈:memcache_get
memcacheq依附于memcached之上,所以你可以通过现有的memcached工具来操作它,这无疑是它的一大优势,但它也有一个很大的缺点,那就是memcacheq本身的开发维护似乎并不活跃,如果遇到问题的话,你很可能需要自己动手解决。
目前看来,我更推荐下面这种解决方案,那就是redis(http://code.google.com/p/redis/),表面上看,redis和memcached差不多,也是键值操作,但是redis本身实现了list,相关操作也可以保证是原子的,所以可以很自然的通过list来实现消息队列:
消息从尾部入栈:RPUSH
消息从头部出栈:LPOP
redis本身虽然是一个新项目,但很有朝气,开发维护也很活跃,如果你的下一个Web应用里需要使用轻量级的消息队列,不妨使用它。
此外,还有不少其他的选择可供尝试,比如说MySQL第三方的Q4M(http://q4m.31tools.com/)引擎,通过扩展SQL语法来操作消息队列,也是一个不错的选择。
- Web应用中的轻量级消息队列
- Web应用中的轻量级消息队列
- Web应用中的轻量级消息队列
- Web应用中的轻量级消息队列
- Web应用中的轻量级消息队列
- Web应用中的轻量级消息队列
- Web应用中的轻量级消息队列
- 0134 Web应用中的轻量级消息队列
- Web应用中的轻量级消息队列
- Web应用中的轻量级消息队列
- httpsqs 轻量级消息队列
- mcq 轻量级的消息队列
- 轻量级消息队列服务UCMQ
- mcq 轻量级的消息队列
- mcq 轻量级的消息队列
- 消息队列在 .NET 中的应用
- 消息队列在分布式系统中的应用
- kestrel轻量级消息队列的安装
- 黑马程序员------HTML中的简单的操作
- 用递归函数求两数的最大公约数
- 转到编辑联系人的系统界面 编辑 添加
- c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存
- 推荐6款常用的Java开源报表制作工具
- Web应用中的轻量级消息队列
- C++及Windows异常处理(try,catch; __try,__finally; __try, __except)
- Intent的几种用法
- 决定把博客搬到CSDN
- Eidetic:助你提升记忆力的酷应用
- 顺序注射自动监测水中COD、氨氮和pH集成仪器研制成功并通过鉴定
- java在CPU中的一些个破事
- android 颜色表
- Linux学习笔记(十八)