`

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

阅读更多

      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是一款轻量级分布式消息队列支持串行并行和广播等多种消息模型

    XXL-MQ是一款专为Java开发设计的轻量级分布式消息队列系统,它提供了高效、稳定的消息传递功能,能够帮助开发者在分布式环境下构建可靠的数据通信。作为一款强大的中间件,XXL-MQ旨在解决微服务架构中的异步处理、...

    轻量级消息推送client&server

    本文将基于“轻量级消息推送client&server”这一主题,深入探讨如何构建一个简单而有效的消息推送系统,主要关注Android平台以及Java后端。 标题:“轻量级消息推送client&server” 描述中提到,开发者在尝试使用...

    轻量级J2EE企业应用开发(3,4,5).rar

    《轻量级J2EE企业应用实战5》可能侧重于企业级应用的高级话题,比如安全框架如Spring Security的配置与使用,消息队列(MQ)如RabbitMQ或ActiveMQ的集成,以及微服务架构的初步介绍。此外,可能还包括了性能调优、...

    基于消息队列、spring boot、websocket实现的消息推送模型源代码

    4. **Spring整合WebSocket**:Spring框架提供了WebSocket的支持,包括STOMP(Simple Text Oriented Messaging Protocol)协议,这是一种轻量级的基于订阅的消息协议。在Spring Boot中,可以通过`@ServerEndpoint`...

    NGINX 云原生应用引擎是高性能轻量级的WEB应用与代理软件

    OpenNJet 应用引擎是高性能、轻量级的WEB应用与代理软件。作为云原生服务网格的数据平面,NJet具备动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。通过CoPliot副驾驶服务框架,在隔离控制面和...

    RabbitMQ实战 高效部署分布式消息队列 PDF下载

    - **信道(Channel)**:在RabbitMQ中,信道是进行I/O操作的轻量级实体,每个连接可以创建多个信道,以实现多路复用,提高性能。 - **交换器(Exchange)**:根据预设的路由规则,将消息路由到合适的队列。常见的...

    JSON 是一种轻量级的数据交换格式。该文档详细介绍了JSON

    ### JSON:一种轻量级的数据交换格式 #### 定义及背景 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以其简洁性和易读性而受到广泛欢迎。JSON最初由Douglas Crockford在1999年提出,并在随后...

    JMS消息队列机制及案例

    - **多种协议支持**:不仅支持JMS,还支持轻量级的MQTT协议,适合物联网设备。 2. **ActiveMQ配置与使用**: - **安装与启动**:下载Apache ActiveMQ的二进制包,解压后运行bin目录下的启动脚本。 - **创建队列...

    基于httpsqs进行二次开发的消息队列ucmq

    ucmq作为一个轻量级的消息队列,旨在提供高效、低延迟的消息传递服务,适用于各种实时性要求较高的应用场景。 httpsqs是ucmq的基础,它是一个高性能的HTTP协议实现的消息队列。ucmq在此基础上进行了扩展和优化,使...

    基于spring 消息队列

    Spring框架是Java开发领域广泛使用的轻量级开源框架,它提供了对消息队列的支持,使得开发者可以方便地集成消息队列到Spring应用中。在这个基于Spring的消息队列系统中,前端Web应用通过并发发送Ajax请求来获取数据...

    Go-Netlog-一个轻量级HTTP-centric基于日志(Kafka风格)的消息队列

    Go-Netlog 是一款用 Go 语言开发的轻量级消息队列,它借鉴了 Apache Kafka 的设计理念,但更注重HTTP协议,使其更适合现代Web服务的集成与通信。在本文中,我们将深入探讨Go-Netlog的核心特性、工作原理以及如何使用...

    轻量级J2ee企业应用

    这本书旨在帮助读者掌握如何在实际项目中有效地运用轻量级Java EE框架,以实现高效、灵活的企业级应用开发。Java EE是Java平台企业版的简称,它提供了一系列的API和服务,用于构建分布式、多层的Web应用。 本书主要...

    轻量级java开发的 http服务器框架源码

    轻量级Java HTTP服务器框架是开发者为了快速构建高效、灵活的Web服务而设计的工具。本压缩包提供了这样一个框架的源码,对于学习和理解Java网络编程、HTTP协议以及服务器架构有极大的帮助。 首先,我们要理解什么是...

    消息队列源码

    在本案例中,我们关注的是一个名为"EQueue"的消息队列实现,它具有轻量级、分布式、高性能以及一系列高级特性。 首先,EQueue的轻量级设计意味着它对资源的需求较低,易于集成到现有的系统架构中,不会给服务器带来...

    轻量级微服务架构电子书

    《轻量级微服务架构》是一本专注于微服务架构设计与实践的专业电子书籍,分为上下两册,提供了全面且深入的微服务理论知识和技术实践。该书旨在帮助读者理解和掌握如何构建可扩展、高可用、易维护的分布式系统,特别...

    将Django当成一个微架构并在一个单独的文件中写小应用的轻量级封装

    本话题将深入探讨如何将Django当作一个微架构来使用,以及如何在一个单独的文件中创建轻量级封装的小应用。这适用于那些希望在小型项目或模块化开发中充分利用Django功能的开发者。 首先,理解“微架构”...

    轻量级java ee企业应用实战(第三版)电子书part2

    《轻量级Java EE企业应用实战(第三版)》是由知名IT专家李刚撰写的一本经典书籍,专注于讲解如何在企业环境中高效、灵活地运用Java EE技术。这本书的第二部分,包括了三个压缩子文件:51CTO下载-轻量级Java_EE企业...

    轻量级Java EE企业应用实战第4版.光盘.源代码

    根据提供的文件信息,“轻量级Java EE企业应用实战第4版.光盘.源代码”这一资源包含了01至10章的内容,并提供了相应的源代码。下面将对这些章节涉及的关键知识点进行详细的介绍与总结。 ### 一、轻量级Java EE概述 ...

    Spring是一个主流的轻量级的Java Web开发框架,是分层的Java SE/EE full-stack轻量级开源框架

    Spring是一个主流的轻量级Java Web开发框架,也是分层的Java SE/EE full-stack轻量级开源框架。它旨在通过简化开发流程来降低企业级应用程序开发的复杂度。Spring框架不仅为Java Web应用提供了一个坚实的基础,还...

    超轻量级的Ajax库-ajax.js

    在本案例中,我们讨论的是一个名为`ajax.js`的轻量级Ajax库,它为开发者提供了简单易用的接口来实现Ajax通信。 **1. 源码分析** `ajax.js`的源码可能非常简洁,通常包含以下几个核心功能: - **创建...

Global site tag (gtag.js) - Google Analytics