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

上述消息队列的软件中,大多为了实现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语法来操作消息队列,也是一个不错的选择。

Web应用中的轻量级消息队列相关推荐

  1. 轻量级消息队列RedisQueue

    消息队列(Message Queue)是分布式系统必不可少的中间件,大部分消息队列产品(如RocketMQ/RabbitMQ/Kafka等)要求团队有比较强的技术实力,不适用于中小团队,并且对.NET ...

  2. RabbitMQ 中 7 种消息队列

    点击关注公众号,Java干货及时送达 七种模式介绍与应用场景 简单模式(Hello World) 做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B ...

  3. Spring Boot 项目 RedisTemplate 实现轻量级消息队列

    背景公司项目有个需求, 前端上传excel文件, 后端读取数据.处理数据.返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没人 ...

  4. RabbitMQ中7种消息队列和保姆级代码演示!

    blog.csdn.net/qq_32828253/article/details/110450249 七种模式介绍与应用场景 简单模式(Hello World) 做最简单的事情,一个生产者对应一个消 ...

  5. r语言list添加元素_Redis数据结构 List 类型】List 类型生产中的应用 消息队列、排行榜、朋友圈、监控程序的实现...

    点击蓝色"不太灵光的程序员"关注我哟加个"星标",每天上午 08:00,干货推送!昨天有很多同学关注,感谢你们的支持.本文依旧会对学习内容进行拆分,建议阅读时间 ...

  6. kestrel轻量级消息队列的安装

    一简介 1.kestrel是一个轻量级的消息队列框架,总体来说的好处就是轻量,易于使用,但是不太便于管理. 2.现在市面上的消息中间件非常多,比较著名的就是MQ.kestrel对于新应用相对来说用的很 ...

  7. python huey 轻量级消息队列

    一huey 库简介 一个轻型的任务队列,功能和相关的broker没有celery强大,重在轻型,而且代码读起来也比较的简单. 1.下载安装huey. pip install huey 2 .下载安装r ...

  8. 消息队列技术的介绍和原理(MQ)

    最近要做一个项目准备用分布式消息队列, 花点时间看了下. 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地 ...

  9. OSSIM中分布式消息队列应用

     OSSIM中分布式消息队列应用 1. 消息队列处理 企业日志数量正在以指数级形式高速增长,日志数据的具有海量.多样.异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以 ...

最新文章

  1. 关闭webstorm自动保存,并显示文件未保存标识
  2. vue单页面跳页没有数据了_详解刷新页面vuex数据不消失和不跳转页面的解决
  3. Hadoop集群中运行MapReduce程序错误记录
  4. 用WSE在Web服务中验证用户身份
  5. 计算机可执行指令吧,电脑“开始-运行”的常用命令及用法!很有用!
  6. Python操作Memcached
  7. JMM和happens-before原则
  8. [Embeding-1]Efficient Estimation of Word Representations in Vector Space 译文
  9. 安卓与HTML简单的交互使用
  10. linux sort 排序 性能,Linux中sort 排序
  11. GBDT 和 AdaBoost
  12. Codeforces Round #358 (Div. 2) Alyona and Strings
  13. HDU2897 邂逅明下
  14. android提示用户去开启gps,在不使用GPS或互联网的情况下获取Android中用户的当前位置...
  15. ubuntu中firefox图片有色差问题
  16. PDF权限密码怎么解除
  17. 如何简化美化LEfSe分析结果中的Cladogram图
  18. 食品机械怎么找客户,如何转型
  19. 【sklearn下的SVM转onnx】
  20. 有限域(3)——多项式环的商环构造有限域

热门文章

  1. php与html交互实现登录,php与html实现交互的基本操作
  2. 学Python,这些内置数据类型总结(数字类型)你可否知道
  3. Python中的collections模块的相关练习
  4. office插件开发_Visual Studio Code有哪些你常用的插件?
  5. matlab中卡尔曼滤波,卡尔曼滤波器和matlab代码.doc
  6. android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件
  7. 关于mouseenter、mouseover、mouseout、mouseleave的理解
  8. 【Java】剑指 Offer 52. 两个链表的第一个公共节点
  9. Sigma Function LightOJ - 1336[约数和定理]
  10. matlab计算多张图像的灰度直方图_MATLAB图像处理基本操作