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语法来操作消息队列,也是一个不错的选择。
套用网络流行语:那些重量级软件实现的不是你要的功能,而只是独在高处不胜寒的寂寞,所以不必迷恋其中,它们只是传说而已。
分享到:
相关推荐
XXL-MQ是一款专为Java开发设计的轻量级分布式消息队列系统,它提供了高效、稳定的消息传递功能,能够帮助开发者在分布式环境下构建可靠的数据通信。作为一款强大的中间件,XXL-MQ旨在解决微服务架构中的异步处理、...
本文将基于“轻量级消息推送client&server”这一主题,深入探讨如何构建一个简单而有效的消息推送系统,主要关注Android平台以及Java后端。 标题:“轻量级消息推送client&server” 描述中提到,开发者在尝试使用...
《轻量级J2EE企业应用实战5》可能侧重于企业级应用的高级话题,比如安全框架如Spring Security的配置与使用,消息队列(MQ)如RabbitMQ或ActiveMQ的集成,以及微服务架构的初步介绍。此外,可能还包括了性能调优、...
4. **Spring整合WebSocket**:Spring框架提供了WebSocket的支持,包括STOMP(Simple Text Oriented Messaging Protocol)协议,这是一种轻量级的基于订阅的消息协议。在Spring Boot中,可以通过`@ServerEndpoint`...
OpenNJet 应用引擎是高性能、轻量级的WEB应用与代理软件。作为云原生服务网格的数据平面,NJet具备动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。通过CoPliot副驾驶服务框架,在隔离控制面和...
- **信道(Channel)**:在RabbitMQ中,信道是进行I/O操作的轻量级实体,每个连接可以创建多个信道,以实现多路复用,提高性能。 - **交换器(Exchange)**:根据预设的路由规则,将消息路由到合适的队列。常见的...
### JSON:一种轻量级的数据交换格式 #### 定义及背景 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以其简洁性和易读性而受到广泛欢迎。JSON最初由Douglas Crockford在1999年提出,并在随后...
- **多种协议支持**:不仅支持JMS,还支持轻量级的MQTT协议,适合物联网设备。 2. **ActiveMQ配置与使用**: - **安装与启动**:下载Apache ActiveMQ的二进制包,解压后运行bin目录下的启动脚本。 - **创建队列...
ucmq作为一个轻量级的消息队列,旨在提供高效、低延迟的消息传递服务,适用于各种实时性要求较高的应用场景。 httpsqs是ucmq的基础,它是一个高性能的HTTP协议实现的消息队列。ucmq在此基础上进行了扩展和优化,使...
Spring框架是Java开发领域广泛使用的轻量级开源框架,它提供了对消息队列的支持,使得开发者可以方便地集成消息队列到Spring应用中。在这个基于Spring的消息队列系统中,前端Web应用通过并发发送Ajax请求来获取数据...
Go-Netlog 是一款用 Go 语言开发的轻量级消息队列,它借鉴了 Apache Kafka 的设计理念,但更注重HTTP协议,使其更适合现代Web服务的集成与通信。在本文中,我们将深入探讨Go-Netlog的核心特性、工作原理以及如何使用...
这本书旨在帮助读者掌握如何在实际项目中有效地运用轻量级Java EE框架,以实现高效、灵活的企业级应用开发。Java EE是Java平台企业版的简称,它提供了一系列的API和服务,用于构建分布式、多层的Web应用。 本书主要...
轻量级Java HTTP服务器框架是开发者为了快速构建高效、灵活的Web服务而设计的工具。本压缩包提供了这样一个框架的源码,对于学习和理解Java网络编程、HTTP协议以及服务器架构有极大的帮助。 首先,我们要理解什么是...
在本案例中,我们关注的是一个名为"EQueue"的消息队列实现,它具有轻量级、分布式、高性能以及一系列高级特性。 首先,EQueue的轻量级设计意味着它对资源的需求较低,易于集成到现有的系统架构中,不会给服务器带来...
《轻量级微服务架构》是一本专注于微服务架构设计与实践的专业电子书籍,分为上下两册,提供了全面且深入的微服务理论知识和技术实践。该书旨在帮助读者理解和掌握如何构建可扩展、高可用、易维护的分布式系统,特别...
本话题将深入探讨如何将Django当作一个微架构来使用,以及如何在一个单独的文件中创建轻量级封装的小应用。这适用于那些希望在小型项目或模块化开发中充分利用Django功能的开发者。 首先,理解“微架构”...
《轻量级Java EE企业应用实战(第三版)》是由知名IT专家李刚撰写的一本经典书籍,专注于讲解如何在企业环境中高效、灵活地运用Java EE技术。这本书的第二部分,包括了三个压缩子文件:51CTO下载-轻量级Java_EE企业...
根据提供的文件信息,“轻量级Java EE企业应用实战第4版.光盘.源代码”这一资源包含了01至10章的内容,并提供了相应的源代码。下面将对这些章节涉及的关键知识点进行详细的介绍与总结。 ### 一、轻量级Java EE概述 ...
Spring是一个主流的轻量级Java Web开发框架,也是分层的Java SE/EE full-stack轻量级开源框架。它旨在通过简化开发流程来降低企业级应用程序开发的复杂度。Spring框架不仅为Java Web应用提供了一个坚实的基础,还...
在本案例中,我们讨论的是一个名为`ajax.js`的轻量级Ajax库,它为开发者提供了简单易用的接口来实现Ajax通信。 **1. 源码分析** `ajax.js`的源码可能非常简洁,通常包含以下几个核心功能: - **创建...