10分钟带你逆袭Kafka!( 二 )


⑤可恢复性:系统的一部分组件失效时,不会影响到整个系统 。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理 。 
⑥顺序保证:在大多使用场景下,数据处理的顺序都很重要 。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理 。Kafka 保证一个 Partition 内的消息的有序性 。 
⑦缓冲:在任何重要的系统中,都会有需要不同的处理时间的元素 。例如,加载一张图片比应用过滤器花费更少的时间 。 消息队列通过一个缓冲层来帮助任务最高效率的执行,写入队列的处理会尽可能的快速 。该缓冲有助于控制和优化数据流经过系统的速度 。 
⑧异步通信:很多时候,用户不想也不需要立即处理消息 。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它 。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们 。 
Kafka 于其他 MQ 对比如下: 
①RabbitMQ:RabbitMQ 是使用 Erlang 编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,SMTP,STOMP,也正因如此,它非常重量级,更适合于企业级的开发 。 同时实现了 Broker 构架,这意味着消息在发送给客户端时先在中心队列排队 。对路由,负载均衡或者数据持久化都有很好的支持 。 
②redis:Redis 是一个基于 Key-Value 对的 NoSQL 数据库,开发维护很活跃 。 虽然它是一个 Key-Value 数据库存储系统,但它本身支持 MQ 功能,所以完全可以当做一个轻量级的队列服务来使用 。 对于 RabbitMQ 和 Redis 的入队和出队操作,各执行 100 万次,每 10 万次记录一次执行时间 。测试数据分为 128Bytes、512Bytes、1K 和 10K 四个不同大小的数据 。 实验表明:入队时,当数据比较小时 Redis 的性能要高于 RabbitMQ,而如果数据大小超过了 10K,Redis 则慢的无法忍受;出队时,无论数据大小,Redis 都表现出非常好的性能,而 RabbitMQ 的出队性能则远低于 Redis 。 
③ZeroMQ:ZeroMQ 号称最快的消息队列系统,尤其针对大吞吐量的需求场景 。 ZeroMQ 能够实现 RabbitMQ 不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这 MQ 能够应用成功的挑战 。 ZeroMQ 具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演这个服务器角色 。 你只需要简单的引用 ZeroMQ 程序库,可以使用 NuGet 安装,然后你就可以愉快的在应用程序之间发送消息了 。 但是 ZeroMQ 仅提供非持久性的队列,也就是说如果宕机,数据将会丢失 。其中,Twitter 的 Storm 0.9.0 以前的版本中默认使用 ZeroMQ 作为数据流的传输(Storm 从 0.9 版本开始同时支持 ZeroMQ 和 Netty 作为传输模块) 。 
④ActiveMQ:ActiveMQ 是 Apache 下的一个子项目 。类似于 ZeroMQ,它能够以代理人和点对点的技术实现队列 。同时类似于 RabbitMQ,它少量代码就可以高效地实现高级应用场景 。 
⑤Kafka/Jafka:Kafka 是 Apache 下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而 Jafka 是在 Kafka 之上孵化而来的,即 Kafka 的一个升级版 。 具有以下特性:

  • 快速持久化,可以在 O(1) 的系统开销下进行消息持久化 。
  • 高吞吐,在一台普通的服务器上既可以达到 10W/s 的吞吐速率 。
  • 完全的分布式系统,Broker、Producer、Consumer 都原生自动支持分布式,自动实现负载均衡 。
  • 支持 Hadoop 数据并行加载,对于像 Hadoop 的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案 。
 Kafka 通过 Hadoop 的并行加载机制统一了在线和离线的消息处理 。Apache Kafka 相对于 ActiveMQ 是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统 。 
Kafka的几种重要角色如下: 
①Kafka 作为存储系统:任何允许发布与使用无关的消息发布的消息队列都有效地充当了运行中消息的存储系统 。Kafka 的不同之处在于它是一个非常好的存储系统 。 
写入 Kafka 的数据将写入磁盘并进行复制以实现容错功能 。Kafka 允许生产者等待确认,以便直到完全复制并确保即使写入服务器失败的情况下写入也不会完成 。
 
Kafka 的磁盘结构可以很好地扩展使用-无论服务器上有 50KB 还是 50TB 的持久数据,Kafka 都将执行相同的操作 。


推荐阅读