Web应用中的轻量级消息队列

转载 2013年12月04日 15:58:40
原文地址:http://hi.baidu.com/thinkinginlamp/blog/item/27a18202578f3d054bfb511f.html

Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。在Web2.0的时代,高并发的情况越来越常见,从而使消息队列有成为居家必备的趋势,相应的也涌现出了很多实现方案,像Twitter以前就使用RabbitMQ实现消息队列服务,现在又转而使用Kestrel来实现消息队列服务,此外还有很多其他的选择,比如说:ActiveMQZeroMQ等。

上述消息队列的软件中,大多为了实现AMQP,STOMP,XMPP之类的协议,变得极其重量级,但在很多Web应用中的实际情况是:我们只是想找到一个缓解高并发请求的解决方案,不需要杂七杂八的功能,一个轻量级的消息队列实现方式才是我们真正需要的。

第一感觉是能不能使用memcached来实现消息队列?稍加考虑后就会发现它不合适,因为memcached仅仅支持键值方式的操作,没有排序之类的功能,所以如果要用它来实现消息队列,则必须自己通过某个键来保存数组形式的队列,不过这样的话,在操作队列的时候很容易丢失数据,比如说我们要添加一个消息,则需先取出现有队列,然后把消息保存到队列尾部,最后保存队列,单纯使用memcached的话,由于我们无法保证整个过程的原子性,所以当处理若干个并发请求时,各个请求间可能会互相覆盖,丢失数据就在所难免(新的memcached扩展一定程度上能缓解这个问题)。另外,memcached只是内存键值缓存而已,一旦宕机,数据就消失了。

memcacheq的出现解决了上面的问题,它在memcached的基础上实现了消息队列,以php客户端为例:

消息从尾部入栈:memcache_set
消息从头部出栈:memcache_get

memcacheq依附于memcached之上,所以你可以通过现有的memcached工具来操作它,这无疑是它的一大优势,但它也有一个很大的缺点,那就是memcacheq本身的开发维护似乎并不活跃,如果遇到问题的话,你很可能需要自己动手解决。

目前看来,我更推荐下面这种解决方案,那就是redis,如果不了解,可以参考我以前的文章,表面上看,redis和memcached差不多,也是键值操作,但是redis本身实现了list,相关操作也可以保证是原子的,所以可以很自然的通过list来实现消息队列:

消息从尾部进队列:RPUSH
消息从头部出队列:LPOP

redis本身虽然是一个新项目,但很有朝气,开发维护也很活跃,如果你的下一个Web应用里需要使用轻量级的消息队列,不妨使用它,顺便说一句,redis里还有set结构,可以用来实现一个高效能的tag系统。

此外,还有不少其他的选择可供尝试,比如说MySQL第三方的Q4M引擎,通过扩展SQL语法来操作消息队列,也是一个不错的选择。

消息队列的应用场景和常见的消息队列之间的比较

From: http://blog.csdn.net/cws1214/article/details/52922267 消息队列使用的四种场景介绍 消息队列中间...
  • DJ2008
  • DJ2008
  • 2017年12月22日 14:22
  • 63

消息队列/分布式消息队列介绍及其应用场景

消息队列的定义,以及引入消息队列可解决的问题 1. 消息队列中的“消息”即指同一台计算机的进程间,或不同计算机的进程间传送的数据; “消息队列”是在消息的传输过程中保存消息的容器。 消息被发...
  • apexlj
  • apexlj
  • 2015年12月03日 10:07
  • 2118

消息队列入门(四)ActiveMQ的应用实例

消息队列入门(四)ActiveMQ的应用实例 >>部署和启动ActiveMQ 去官网下载:http://activemq.apache.org/ 我下载的是apache-activemq-5.1...
  • yangliuhbhd
  • yangliuhbhd
  • 2016年09月05日 20:25
  • 993

消息队列(Message Queue)基本概念和使用场景分析

背景   之前做日志收集模块时,用到flume。另外也有的方案,集成kafaka来提升系统可扩展性,其中涉及到消息队列当时自己并不清楚为什么要使用消息队列。而在我自己提出的原始日志采集方案中不适...
  • jaryle
  • jaryle
  • 2016年08月17日 10:44
  • 2341

php消息队列的应用

最近打算开发一个新功能,计划应用消息队列。 以前对消息队列都是简单的理论了解,真正应用之后把自己的感觉和一些理解整理下来。 =================说正事分割线===============...
  • u014017080
  • u014017080
  • 2016年09月03日 16:26
  • 1536

Web应用中的轻量级消息队列

Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update 之类的请求同时到达mysql,直接导致无数的行锁表锁,...
  • andybbc
  • andybbc
  • 2016年02月23日 15:43
  • 771

Web应用中的轻量级消息队列

原文地址:http://hi.baidu.com/thinkinginlamp/blog/item/27a18202578f3d054bfb511f.html Web应用中为什么会需...
  • myhuashengmi
  • myhuashengmi
  • 2016年09月23日 16:56
  • 251

大数据技术栈-Web框架&消息队列

大数据技术栈-Web框架&消息队列前言很多人写这方面的文章都喜欢从大的方面讲,讲体系结构,画出各种好看的图,看多了,感觉大家都差不多的样子。比较典型的,我记得是有一期程序员杂志,专门讲各大电商技术体系...
  • allwefantasy
  • allwefantasy
  • 2015年04月07日 23:36
  • 4405

消息队列使用的四种场景介绍

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用,可伸缩和最终一致性架构 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ...
  • Seven__________7
  • Seven__________7
  • 2017年04月18日 10:55
  • 6901

C的简单消息队列

让我们来看看,当你进行嵌入式开发时,你真的没有很多优秀的工具可供您使用。如果你幸运的话,你可能有一个符合C99标准的编译器和一个带有浮点硬件和DMA的微控制器。如果你不幸运,你可能有一个微控制器实际上...
  • sergeycao
  • sergeycao
  • 2017年03月30日 11:25
  • 676
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Web应用中的轻量级消息队列
举报原因:
原因补充:

(最多只允许输入30个字)