目前业界有很多MQ产品,我们作如下对比:
RabbitMQ
是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了一个经纪人(Broker)构架,这意味着消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。
Redis
是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。(个人觉得一下数据在入队的10k时不太合理)
|
入队 |
出队 |
||||||
|
128B |
512B |
1K |
10K |
128B |
512B |
1K |
10K |
Redis |
16088 |
15961 |
17094 |
25 |
15955 |
20449 |
18098 |
9355 |
RabbitMQ |
10627 |
9916 |
9370 |
2366 |
3219 |
3174 |
2982 |
1588 |
ZeroMQ
号称最快的消息队列系统,尤其针对大吞吐量的需求场景。ZMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演了这个服务角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果down机,数据将会丢失。其中,Twitter的Storm中使用ZeroMQ作为数据流的传输。
ActiveMQ
是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。
Jafka/Kafka
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现复杂均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制来统一了在线和离线的消息处理,这一点也是本课题所研究系统所看重的。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。
其他一些队列列表HornetQ、Apache Qpid、Sparrow、Starling、Kestrel、Beanstalkd、Amazon SQS就不再一一分析。
相关推荐
2. **常用 Message Queue 对比** - **RabbitMQ**:支持发布订阅模式,支持持久化和集群,但不支持事务,消息可能丢失。 - **RocketMQ**:基于Java开发,支持AMQP协议,提供消息队列的集群工作流程,消息理论上不会...
#### 二、为什么使用消息队列(Message Queue) 消息队列作为中间件的一种,在现代分布式系统中扮演着重要角色。下面列举了一些使用消息队列的主要原因: 1. **解耦**:消息队列插入了一个基于数据的接口层,使得...
- **MQ(Message Queue)**:消息队列,用于实现服务间的异步通信,提高系统的解耦性和可扩展性。 3. **如何选择RPC框架** - **I/O、线程调度模型**:不同的RPC框架采用不同的I/O模型(如NIO、AIO等),以及线程...
本文详细介绍了RabbitMQ消息队列的基本概念及其优缺点,并对比分析了几种常用的消息队列产品。此外,还深入探讨了RabbitMQ内部的工作机制,包括各个组件的功能和交互方式。对于想要深入了解RabbitMQ或准备相关面试的...
- **消息队列(message queue):** 多进程之间传递消息。 综上所述,通过本次课程设计,学生不仅能够深入了解计算机操作系统中的核心概念和技术,还能通过具体的编程实践加深对这些理论知识的理解。这对于培养学生的...
- **消息循环机制**:Looper、MessageQueue和Handler三者共同构成了Android的消息循环机制。 - **IdleHandler**:在消息队列为空时被调用,可用于执行一些后台任务。 #### 8. 设计模式中的单例模式 - **懒汉式**:...
- **Collection**:是Java集合框架的一部分,包括`List`、`Set`和`Queue`等子接口。 - **Collections**:工具类,提供了一系列静态方法用于操作集合,如排序、查找等。 #### 11. HashMap与Hashtable的对比 - **...
- Looper与MessageQueue **2.15 创建意图过滤器(Chapter 21: Creating Intent Filters)** - **知识点:** - IntentFilter的作用 - 广播接收器注册 - 动态与静态注册的区别 **2.16 启动活动和子活动...
- **3.3 消息队列(MESSAGE QUEUE)** - **队列管理**:介绍了消息队列的管理机制,包括消息的发送与接收过程。 - **3.4 中断** - **中断处理**:讨论了中断在uC/OS-II中的作用及其处理机制。 - **3.5 中断延迟** ...
- 强引用是最常用的引用类型,只要强引用存在,垃圾收集器就不会回收掉被引用的对象。 - 软引用用来描述一些还有用但并非必需的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收...