【http://cloudate.net/?p=1165】2015/04/25  |  消息队列 |  罗伯特

消息队列中间件是互联网行业不可或缺的一项基本技术,在高并发消峰,非关键业务异步化,通知系统,监控数据推送等场景下是必不可少的,下文为转载文章,具体出处不详。

个人很喜欢ZeroMQ,非企业级的消息中间件,具有及低延迟-微秒级,使用简单灵活可嵌入等特性,性能报告请参考官网:
http://zeromq.org/results:more-precise-0mq-tests

消息中间件是一种由消息传送机制或消息队列模式组成的中间件技术,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。目前业界有很多的MQ产品,像RabbitMQ、ActiveMQ、ZeroMQ等都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?本文针对以下几种消息队列产品作了评估比较:RabbitMQ、ZeroMQ、ActiveMQ、MSMQ、Redis、memcacheQ

题外话:这里我们可以先思考个小问题“Web应用中为什么会需要消息队列服务?”
在高并发环境下,由于来不及同步处理,请求往往会发生堵塞(主要原因),比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。

RabbitMQ
是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。如需配置RabbitMQ则需要在目标机器上安装Erlang环境。

ØMQ(ZeroMQ)
号称最快的消息队列系统,尤其针对大吞吐量的需求场景。是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。

ØMQ(ZeroMQ)能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演了这个服务角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果down机,数据将会丢失。其中,Twitter的Storm中使用ZeroMQ作为数据流的传输。ZeroMQ非常灵活,但是你必须学习它的80页的手册(如果你要写一个分布式系统,一定要阅读它)。

ZeroMQ没有中间件架构,不需要任何服务进程和运行。事实上,你的应用程序端点扮演了这个服务角色。这让部署起来非常简单,但担心的是,你没有地方可以观察它是否有问题出现。就目前了解到的,ZeroMQ仅提供非持久性的队列。你可以在需要的地方实现自己的审计和数据恢复功能。MSMQ
这是微软的产品里唯一被认为有价值的东西。如果MSMQ能证明可以应对这种任务,他们将选择使用它。关键是这个东西并不复杂,除了接收和发送,没有别的;它有一些硬性限制,比如最大消息体积是4MB。然而,通过和一些像MassTransit 或 NServiceBus这样的软件的连接,它完全可以解决这些问题。

Jafka/Kafka
kafka(能将消息分散到不同的节点上)是LinkedIn于2010年12月开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现复杂均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制来统一了在线和离线的消息处理,这一点也是本课题所研究系统所看重的。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。

Apache ActiveMQ
ActiveMQ居于两者(RabbitMQ & ZeroMQ)之间,类似于ZemoMQ,它可以部署于代理模式和P2P模式。类似于RabbitMQ,它易于实现高级场景,而且只需付出低消耗。
ActiveMQ被誉为Java世界的中坚力量。它有很长的历史,而且被广泛的使用。它还是跨平台的,给那些非微软平台的产品提供了一个天然的集成接入点。然而,它只有跑过了MSMQ才有可能被考虑。如需配置ActiveMQ则需要在目标机器上安装Java环境。

需要注意一点的是ActiveMQ的下一代产品为Apollo,Apollo以ActiveMQ原型为基础,是一个更快、更可靠、更易于维护的消息代理工具。Apache称Apollo为最快、最强健的STOMP(Streaming Text Orientated Message Protocol,流文本定向消息协议)服务器。
Apollo的特性如下:
支持Stomp 1.0和Stomp 1.1协议
主题和队列
队列浏览器
主题持久订阅
镜像队列
可靠的消息传递
消息过期和交换
消息选择器
JAAS验证
基于ACL的授权
支持SSL/TLS,证书验证
REST Management API

Redis
是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

MemcacheQ
持久化消息队列memcacheq(简称mcq)是一个轻量级的消息队列,MemcacheQ的特性:
1 简单易用
2 处理速度快
3 多条队列
4 并发性能好
5 与memcache的协议兼容。这就意味着只要装了memcache的extension就可以了,不需要额外的插件。
6 在zend framework中使用也很方便。


最终,这几个产品:
1. 都有各自客户端API或支持多种编程语言;
2. 都有大量的文档;
3. 都提供了积极的支持。
4. ActiveMQ、RabbitMQ、MSMQ、Redis都需要启动服务进程,这些都可以监控和配置,其他几个就有问题了
5. 都相对提供了良好的可靠性(一致性)、扩展性和负载均衡,当然还有性能

这里就不瞎扯了,下面附上一组从网上截取的测试结果。显示的是发送和接受的每秒钟的消息数。整个过程共产生1百万条1K的消息。测试的执行是在一个Windows Vista单机上进行的。

就像你看到的,ZeroMQ和其它的不是一个级别。它的性能惊人的高。尽管这样,但这个产品不提供消息持久化、无法方便存储及监控中间过程,需要自己实现审计和数据恢复,因此在易用性和HA上不是令人满意。结论很清楚:如果你希望一个应用程序发送消息越快越好,你选择ZeroMQ。当你不太在意偶然会丢失某些消息的情况下更有价值。

本文博主未来往事更希望(也不是很希望很希望)选择使用的是Rabbit,Rabbitmq内置了ha,如果组建cluster,负载均衡之类的问题就无需担忧了同时可以设置队列镜像。但这种事情是应该做更多的测试,你最终会有一个最爱,我所听到的、读到的各种关于Rabbit的事情让我觉得它应该是最佳选择。

其他一些队列列表,这里就不再一一分析,如果需要了解更多可自行google。

转载于:https://www.cnblogs.com/lsx1993/p/4657897.html

消息队列中间件的技术选型分析相关推荐

  1. 浅谈消息队列及常见的分布式消息队列中间件

    背景 分布式消息队列中间件是是大型分布式系统不可缺少的中间件,通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理消息前不需要等待接收此消息.所以消息队列主要解决应用耦合.异步消 ...

  2. 消息中间件系列(七):如何从0到1设计一个消息队列中间件

    消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一. 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要. 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具 ...

  3. python消息队列中间件_常见的消息队列中间件介绍

    题目 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 什么是消息队列 在正式介绍和对比Kafka. ...

  4. 使用kafka消息队列中间件实现跨进程,跨服务器的高并发消息通讯

    作者 | 陈屹       责编 | 欧阳姝黎 近来工作上接收到一项任务,实现c++后台服务器程序,要求它能承载千万级别的DAU读写请求.目前实现千万级高并发海量数据请求的服务器设计在"套路 ...

  5. MQ消息队列中间件:

    MQ消息队列中间件: 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应. 异步通讯:就像发信息,不需要马上回复. 同步调用的优点: 时效性较强,可以立即得到结果 同步调用的问题: ...

  6. rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...

    概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...

  7. c#开源消息队列中间件EQueue 教程

    一.简介 EQueue是一个参照RocketMQ实现的开源消息队列中间件,具体可以参看作者的文章<分享一个c#写的开源分布式消息队列equeue>.项目开源地址:https://githu ...

  8. ActiveMQ RabbitMQ RokcetMQ Kafka实战 消息队列中间件视频教程

    附上消息队列中间件百度网盘连接: 链接: https://pan.baidu.com/s/1FFZQ5w17e1TlLDSF7yhzmA 密码: hr63 转载于:https://www.cnblog ...

  9. 基于硬件的消息队列中间件 Solace 简介之二

    小短篇介绍关于Solace https://blog.csdn.net/aqudgv83/article/details/79495489 . 前面简单介绍了Solace来自于哪家公司, 主要能做哪些 ...

  10. 消息队列中间件 Message Queue 简称:MQ

    一.什么是消息队列? 消息队列,一般我们会简称它为MQ(Message Queue) 队列是一种先进先出的数据结构. 现有常用的开源消息中间件有Kafka.CMQ.JBoss Messaging.JO ...

最新文章

  1. 顺序表-顺序表的基本操作(插入元素+删除元素)
  2. python重复执行函数_Python threading 单线程 timer重复调用函数
  3. 关于Linux发行版本RedHat9中文输入法使用问题的说明
  4. json添加元素 vue_详解通过JSON数据使用VUE.JS
  5. 为什么博导都希望,自己的博士生毕业也去高校当老师?
  6. Java私塾的一些基础练习题(一)
  7. python变量类型之间转换_【Python】Python 变量类型(变量赋值,数据类型,数据转换)...
  8. 毕业设计一周一记06
  9. weblogic 文件打开数_WebLogic任意文件上传漏洞(CVE20192618)复现
  10. java ee 设计模式_Java EE 设计模式解析与应用_源雷技术空间
  11. 【学习笔记】matlab进行数字信号处理(二)信号的相关分析及幅值分析
  12. 计算机在录制声音过程中流向,Bandicam中录制电脑声音的具体流程介绍
  13. ubuntu双系统怎么完全删除ubuntu系统(主要是删除引导)
  14. “分集”与“复用”辨析
  15. 如何获取公众号二维码
  16. python3识别图中的文字_Python3调用百度AI识别图片中的文字功能示例【测试可用】...
  17. threejs中几种挖洞方式
  18. 【MATLAB】绘制矢量场图
  19. 马斯克推荐的「50种认知偏差」,这是我见过的最爆笑的解读!
  20. Kubernetes 部署高可用集群(二进制,v1.18)下

热门文章

  1. 反编译那些事儿(三)—那些看似没用到的全局变量和那些使用了动态参数的方法
  2. SQLite(3) Windows安装小结
  3. 荣耀智慧屏 55英寸屏幕 搭载鸿蒙OS,3799元起!荣耀智慧屏发布:55英寸4K全面屏+首发鸿蒙OS+无广告...
  4. FISCO BCOS(三)——— 部署及调用HelloWorld合约
  5. 计算机管理创建超级用户,win10家庭版怎么开启Administrator超级管理员帐户
  6. 使用jdk1.8 新特性stream实现多级分类
  7. java如何定义构造函数,java 方法定义,方法重载,构造函数
  8. php查询mysql语句_PHP之路——MySql查询语句
  9. 微型计算机硬件认识和拆装,微型计算机系统硬件组成及外设认识.doc
  10. android 图片方向,Android图片处理:识别图像方向并显示实例教程