Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。在Web2.0的时代,高并发的情况越来越常见,从而使消息队列有成为居家必备的趋势,相应的也涌现出了很多实现方案,像Twitter以前就使用RabbitMQ实现消息队列服务,现在又转而使用Kestrel来实现消息队列服务,此外还有很多其他的选择,比如说:ActiveMQ,ZeroMQ等。
上述消息队列的软件中,大多为了实现AMQP,STOMP,XMPP之类的协议,变得极其重量级,但在很多Web应用中的实际情况是:我们只是想找到一个缓解高并发请求的解决方案,不需要杂七杂八的功能,一个轻量级的消息队列实现方式才是我们真正需要的。
第一感觉是能不能使用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应用里需要使用轻量级的消息队列,不妨使用它。
此外,还有不少其他的选择可供尝试,比如说MySQL第三方的Q4M引擎,通过扩展SQL语法来操作消息队列,也是一个不错的选择。
套用网络流行语:那些重量级软件实现的不是你要的功能,而只是独在高处不胜寒的寂寞,所以不必迷恋其中,它们只是传说而已。
分享到:
相关推荐
Beanstalkd,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook Causes应用。后来开源,现在有...
它是MQTT客户和代理(例如 和 )的一种基于标准的开源轻量级替代品。 它使用API优先的进行协议格式设置,而该协议又基于广泛使用的库进行协议格式设置。 用纯JavaScript编写,以最大程度地移植到受约束的设备使...
SRC包含其使用场景,例如大文件传输,websocket客户端和服务器,高性能消息队列,RPC,redis驱动程序,httpserver,mqtt,MVC,DNS,消息服务器等 SAEA.Socket是一个IOCP高端套接字网络框架,基于dotnet standard ...
Gauss是一款轻量级的微服务框架,主要用于基于RESTful风格的HTTP服务发布,并采用NoSQL数据库管理。主体框架中包含服务发布,转发,缓存,持久化,消息队列,线程管理等功能,支持单点,集群,分层,微服务,API网关...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
轻量级推送服务和实时在线监控平台,基于node的socket.io,支持web、android、ios客户端,支持移动端离线推送,可大规模集群部署
基于Struts+Spring+Hibernate的轻量级Web应用框架研究.pdf 基于Struts+Spring+Hibernate短信平台管理系统设计.pdf 基于Struts+Spring+Hibernate+Ajax技术的科研管理系统设计.pdf 基于Struts,Hibernate和...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
它不是Web规模的,但对于轻量级异步排队应用程序非常有用。 最初由撰写,并在找到。 谢谢,daddz!安装gem install filequeue用法queue = FileQueue.new 'queue_party.txt'queue.push "an item" => truequeue.pop =...
有关更多信息,请参阅: : 对象队列 0.9.0 objsQueue 是一个轻量级库,它提供在 UIWebView 中运行的内容和包含 UIWebView 的本机 Objective-C 应用程序之间的连接。 要使用它,请添加 Objective-C 库文件,然后初始...
该项目基于 ,这是一种收集Web分析并将数据存储在Cloudant数据库中的简单方法。 该项目使用微服务体系结构分解了这个概念,因此,该项目不仅将数据写入Cloudant数据库,还根据运行时环境变量将数据添加到各种输出中...
本书是《轻量级java ee企业应用实战》的姊妹篇,《轻量级java ee企业应用实战》主要介绍以spring+hibernate为基础的java ee应用;本书则主要介绍以ejb 3+jpa为基础的java ee应用。ejb 3、jpa规范都属于sun公司所...
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...
WebSocket 是 TCP 之上的一个轻量级薄层。 这使它适合使用“子协议”来嵌入消息。 在本指南中,我们使用 Spring 的消息传递来创建交互式 Web 应用程序。 STOMP 是一个运行在底层 WebSocket 之上的子协议。 你将建造...
马拉管道 该软件包包含一个轻量级的数据转换框架,重点是透明性和降低复杂性。 它具有许多固有的假设/原则: 数据集成管道作为代码:管道,任务和命令是使用声明性的Python代码创建的。 PostgreSQL作为数据处理引擎...
Azkarra Streams是一个轻量级的Java框架,可轻松开发和操作Kafka Streams应用程序(Azkarra是巴斯克语,表示“快速” ) 是用于构建应用程序和微服务的客户端库,其中输入和输出数据存储在Kafka集群中。 它结合了在...
轻量级服务总线,面向高性能、低时延、高可用特性调优,支持RPC,消息队列服务
Dubbo是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。 本套课程中,第一阶段深入Zookeeper原理和源码...