为什么是kafka?

MQ在分布式场景下的应用已经非常广泛了。但是在所有的MQ使用场景中,大多都要求不能丢消息,意味着必须有持久化的能力,传统行业常用的activemq、rabbitmq虽然有持久化能力,无奈的是性能太低,扩展性太差,对于互联网公司来说,要么就去基于他们去扩展,要么就是自己研发一个新的MQ,自从kafka横空出世,唤醒了人们对高性能   MQ的追求。实际上kafka0.8版本已经脱胎换骨,再也不只是适合日志收集的场景了,kafka在可靠性方面做了很多改进。实际上kafka已经可以用在企业级应用里面了。

如何达到高性能?

1、  顺序写

磁盘的IO是所有应用性能的万恶之源,磁盘的顺序写能达到几百M每秒,而随机写只有几十K,如果是一个千兆网卡,真实性能也就百M左右,可见,磁盘顺序写的威力巨大。

2、  零拷贝

某些情况下,数据的传输是不需要经过应用程序的,可以减少数据在用户空间和系统空间的缓冲区进行copy,降低对cpu和网卡的消耗,这样可以获得很好的性能,Linux下提供此功能的系统调用主要有sendfile、mmap、splice。

3、  扩展性

如果要想突破单机的性能,必须拥有良好的扩展性,kafka可以在topic下建立partition,partition才是kafka的最小单位,这样就意味着同一个topic可以持久化到N台物理机上,只要有足够的分区。Kafka天生的分布式特性,几乎可以无限的扩展。

实际上,kafka的吞吐量可以达到几万TPS,性能非常高。并且扩展性如此高,在大并发、大数据量的场景下非常适合。

怎么保证不丢消息?

丢消息主要有以下几个地方:

1、生产者发送消息。Kafka是采用ack机制保障的,如果消息没法送成功,也不会返回ack,所以,只要在生产者端做好重试机制就好。如何做好重试机制,又是一个非常大的话题,此处不扩展开来。Kafka服务端收到消息后可以直接复制到其他分片,成功后再通知生产者确定收到消息。就算不做同步的持久化,如果有三个节点,除非三个物理机同时宕机才会丢失数据。注意,这里如果仅仅是kafka进程挂掉是不会丢数据的,操作系统会把数据持久化到磁盘。

2、Kafka存储的消息会不会丢失?kafka有定时删除策略,不以是否消费为前提,也就意味着没有经过消费的消息删除后就丢了,因为磁盘足够大,几天不删应该不是问题,如果几天的数据没有被消费你都没发现,那只能怪你的监控系统太弱,或者你的应用量太小,出问题都没人发现,那也没有必要使用kafka。

3、消费消息。如果使用high level的api,所有消费者的信息都是存储在zookeeper中的,zookeeper的可靠性此处不必赘述。如果采用simple api,offset的可靠性要依赖于存储,务必小心。最好做充足的备份方案。无论哪种方式,如果不能正常消费,你可以不去移动offset,这个地方完全可以自己控制。

有重复的消息怎么办?

虽然这样造成了重复消息的问题,但是这是很难避免的,试想,像activeMQ那样,就算在服务端做了去重,消费时一样有可能会重复消费,不只是在MQ中,就算你调用一个普通的服务接口,也有可能重复调用,最好的办法是通过业务尽量实现幂等性。例如增加唯一键。

从这些角度考虑,在互联网和大并发的企业级应用中,kafka会越来越重要,会被更多的人重视,就算是不用kafka,也会有跟kafka类似的架构模式、原理差不多的MQ,类似于rocketMQ。现在差的,就是被更多的企业使用,更复杂的场景证明。

时间: 2024-10-21 01:47:59

为什么是kafka?的相关文章

Kafka----Apache Kafka官网首页

Apache Kafka  是发布-订阅机制的消息系统,可以认为具有分布式日志提交功能. Fast-快速 一个单独的Kafka  broker每秒可以处理来自成千上万个客户端的数百兆字节的读写操作. Scalable-可扩展性 对于大规模系统来说,一个单独的kafka集群从设计上就实现了数据中心的功能,而且无需宕机就能提供弹性而又透明的扩展,在数据存储方式上,kafka采用了分区设计理念,它通过将数据分别存储在集群中服务器这种方式,使得集群存储能力远大于单个服务器,这样也使得消费者可以从集群中不

rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较

Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的读写性能. 针对Kafka性能方面进行简单分析,相关数据请参考:https://segmentfault.com/a/1190000003985468,下面介绍一下Kafka的架构和涉及到的名词: Topic:用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Parti

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)

问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? 4.partitions设计的目的的根本原因是什么? 一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现.k

kafka producer实例及原理分析

1.前言 首先,描述下应用场景: 假设,公司有一款游戏,需要做行为统计分析,数据的源头来自日志,由于用户行为非常多,导致日志量非常大.将日志数据插入数据库然后再进行分析,已经满足不了.最好的办法是存日志,然后通过对日志的分析,计算出有用的数据.我们采用kafka这种分布式日志系统来实现这一过程. 步骤如下: 搭建KAFKA系统运行环境 如果你还没有搭建起来,可以参考我的博客: http://zhangfengzhe.blog.51cto.com/8855103/1556650 设计数据存储格式

windows 下部署kafka 日记 转

windows 下部署kafka 日记 转一.下载去apache 的官网(http://kafka.apache.org/downloads.html)下载最新的二进制版的压缩包.目前的最新版本是kafka_2.11-0.8.2.1.tgz.二.解压直接解压到D 盘根目录下.三.修改配置文件注意版本不同,可能配置文件不同.请参照实际情况修改.1.修改log4j.properties 文件中的“kafka.logs.dir=logs ”为“kafka.logs.dir=/tmp/logs”.2.修

Kafka Server写数据的时候报错org.apache.kafka.common.errors.RecordTooLargeException

向Kafka中输入数据,抛异常org.apache.kafka.common.errors.RecordTooLargeException 官网两个参数描述如下: message.max.bytes The maximum size of message that the server can receive int 1000012 [0,...] high fetch.message.max.bytes 1024 * 1024 The number of byes of messages to

kafka Consumer分区数与多线程消费topic

单线程消费数据适合在本地跑. 参考文档: http://kafka.apache.org/documentation.html 对于一个topic,可以发送给若干个partitions. partition在创建topic的时候就指定分区的数目. 分区.Offset.消费线程.group.id的关系 1)一组(类)消息通常由某个topic来归类,我们可以把这组消息"分发"给若干个分区(partition),每个分区的消息各不相同: 2)每个分区都维护着他自己的偏移量(Offset),记

kafka中处理超大消息的一些考虑

Kafka设计的初衷是迅速处理短小的消息,一般10K大小的消息吞吐性能最好(可参见LinkedIn的kafka性能测试).但有时候,我们需要处理更大的消息,比如XML文档或JSON内容,一个消息差不多有10-100M,这种情况下,Kakfa应该如何处理? 针对这个问题,有以下几个建议: 最好的方法是不直接传送这些大的数据.如果有共享存储,如NAS, HDFS, S3等,可以把这些大的文件存放到共享存储,然后使用Kafka来传送文件的位置信息. 第二个方法是,将大的消息数据切片或切块,在生产端将数

跟我一起学kafka(一)

从昨天下午接到新任务,要采集一个法院网站得所有公告,大概是需要采集这个网站得所有公告列表里得所有txt内容,txt文件里边是一件件赤裸裸得案件,记录这案由,原告被告等相关属性(不知道该叫什么就称之为属性吧,汗),把这些文件放到本地某个目录,并把一个案件作为一条数据放入数据库中.本以为很轻松得用Jsoup就可以完成,但是我还是低估了政府部门填写数据得人得不规范性,你妹啊,一会英文冒号,一会中文冒号,一会当事人,一会原告人得......气死我了,昨天晚回家了一个钟头,今天又忙活到下午3点才算采集完毕

kafka无法发送消息问题处理

背景 在服务器上搭建了一个单机环境的kafka broker,在服务器上使用命令生产消息时,一切正常.当在本地使用JAVA程序发送消息时,一直出错. 抛出的错误为: Exception in thread "main" Failed to send requests for topics test with correlation ids in [0,12] kafka.common.FailedToSendMessageException: Failed to send messag