1、Kafka

Kafka 作为时下最流行的开源消息系统,被广泛地应用在数据缓冲、异步通信、汇集日志、系统解耦等方面。相比较于 RocketMQ 等其他常见消息系统,Kafka 在保障了大部分功能特性的同时,还提供了超一流的读写性能。

Kafka 是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下:

以时间复杂度为 O(1)的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能。

高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输。

支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输。

同时支持离线数据处理和实时数据处理。

Scale out:支持在线水平扩展。

很明显的看出 Kafka 的性能远超 RabbitMQ。不过这也是理所当然的,毕竟 2 个消息队列实现的协议是不一样的,处理消息的场景也大有不同。RabbitMQ 适合处理一些数据严谨的消

息,比如说支付消息,社交消息等不能丢失的数据。Kafka 是批量操作切不报证数据是否能完整的到达消费者端,所以适合一些大量的营销消息的场景。

2、RabbitMQ

RabbitMQ 是使用 Erlang 编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,

SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了 Broker 构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。

它支持开放的高级消息队列协议 (AMQP,Advanced Message Queuing Protocol),从根本上避

免了生产厂商的封闭,使用任何语言的各种客户都可以从中受益。这种协议提供了相当复杂的消息传输模式,所以基本上不需要 MassTransit 或 NServiceBus 的配合。它还具有“企业级”的适应性和稳定性。这些东西对我的客户来说十分的有吸引力。

3、ZeroMQ

号称最快的消息队列系统,尤其针对大吞吐量的需求场景。跟其它几个接受测试的产品不同,你不需要安装和运行一个消息服务器,或中间件。你只需要简单的引用 ZeroMQ 程序库,可以使用 NuGet 安装,然后你就可以愉快的在应用程序之间发送消息了。非常有趣的是,他们也同样使用这方式在任何利用 ZeroMQ 进行强大的进程内通信的语言里创建 Erlang 风格的这种执行角色。ZeroMQ 和其它的不是一个级别。它的性能惊人的高。公平的说,ZeroMQ 跟其它几个比起来像头

巨兽,尽管这样,结论很清楚:如果你希望一个应用程序发送消息越快越好,你选择 ZeroMQ。当你不太在意偶然会丢失某些消息的情况下更有价值。其中, Twitter 的 Storm 中使用 ZeroMQ 作为数据流的传输。

4、ActiveMQ

基于 JMS 协议。它有很长的历史,而且被广泛的使用。它还是跨平台的,给那些非微软平台的产品提供了一个天然的集成接入点。然而,它只有跑过了 MSMQ 才有可能被考虑。

ActiveMQ 是 Apache 下的一个子项目。 类似于 ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于 RabbitMQ,它少量代码就可以高效地实现高级应用场景。

5、Jafka

Jafka 是在 Kafka 之上孵化而来的,即 Kafka 的一个升级版。具有以下特性:快速持久化,可以在 O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到 10W/s 的吞吐速率;完全的分布式系统,Broker、Producer、 Consumer 都原生自动支持分布式,自动实现负载均衡;支持 Hadoop 数据并行加载,对于像 Hadoop 的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。

6、MSMQ

这是微软的产品里唯一被认为有价值的东西。对我的客户来说,如果 MSMQ 能证明可以应对这种任务,他们将选择使用它。关键是这个东西并不复杂,除了接收和发送,没有别的;它有一些硬性限制,比如最大消息体积是 4MB。然而,通过和一些像 MassTransit 或 NServiceBus 这样的软件的连接,它完全可以解决这些问题。

7、Redis

是一个 Key-Value 的 NoSQL 数据库,开发维护很活跃,虽然它是一个 Key-Value 数据库存储系统,但它本身支持 MQ 功能,所以完全可以当做一个轻量级的队列服务来使用。对于 RabbitMQ 和 Redis 的入队和出队操作,各执行 100 万次,每 10 万次记录一次执行时间。测试数据分为 128Bytes、512Bytes、1K 和 10K 四个不同大小的数据。实验表明:入队时,当数

据比较小时 Redis 的性能要高于 RabbitMQ,而如果数据大小超过了 10K,Redis 则慢的无法忍受;出队时,无论数据大小,Redis 都表现出非常好的性能,而 RabbitMQ 的出队性能则远低于 Redis。