KafKa 关键技术点

2019-03-06 16:02|来源: 网路

1、zero-copy

在Kafka上,有两个原因可能导致低效:1)太多的网络请求 2)过多的字节拷贝。

为了提高效率,Kafka把message分成一组一组的,每次请求会把一组message发给相应的consumer。

此外, 为了减少字节拷贝,采用了sendfile系统调用。为了理解sendfile原理,先说一下传统的利用socket发送文件要进行拷贝:


Sendfile系统调用:



2、Exactly once message transfer

怎样记录每个consumer处理的信息的状态?在Kafka中仅保存了每个consumer已经处理数据的offset。

这样有两个好处:1)保存的数据量少 2)当consumer出错时,重新启动consumer处理数据时,只需从最近的offset开始处理数据即可。


3、Push/pull

作为一个消息系统,Kafka遵循了传统的方式,选择由Producerbroker push消息并由Consumerbroker pull消息。

一些logging-centric system,比如FacebookScribeClouderaFlume,采用push模式。事实上,push模式和pull模式各有优劣。

push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成Consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据Consumer的消费能力以适当的速率消费消息。

对于Kafka而言,pull模式更合适。pull模式可简化broker的设计,Consumer可自主控制消费消息的速率,同时Consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。


4、负载均衡和容错

Producer和broker之间没有负载均衡机制。

broker和consumer之间利用zookeeper进行负载均衡。所有broker和consumer都会在zookeeper中进行注册,且zookeeper会保存他们的一些元数据信息。如果某个broker和consumer发生了变化,所有其他的broker和consumer都会得到通知。


转自:http://dongxicheng.org/search-engine/kafka/

相关问答

更多

不同版本之间的Kafka MirrorMaker与时间戳(Kafka MirrorMaker between different versions with timestamp)

您可以使用mirrormaker 0.8将数据带入1.0群集,然后使用1.0版本和群集内镜像通过kafka流应用程序或镜像消息处理程序进行转换。 这是一个示例消息处理程序。 https://github.com/gwenshap/kafka-examples/blob/master/MirrorMakerHandler/src/main/java/com/shapira/examples/TopicSwitchingHandler.java 无论哪种方式,如果你想在消息中使用时间戳,你必须先将它带 ...

mysql传入到Kafka中的数据结构如何查看

private function loaderHandler(event:*):void { switch(event.type) { case Event.COMPLETE: trace(_loader.data.result); break; case Event.OPEN: trace("open: " + event); break; case ProgressEvent.PROGRESS: trace("progress: " + event); break;

Apache Flink,比Kafka分区更多的线程(Apache Flink, more threads than Kafka partitions)

这在Flink非常简单。 您可以使用setParallelism()方法指定每个运算符的并行度: DataStream<String> rawEvents = env .addSource(new FlinkKafkaConsumer010("topic", new SimpleStringSchema(), props)); DataSteam<String> mappedEvents = rawEvents .flatMap(new Tokenizer()) .setParall ...

如何将单个节点Kafka扩展到多个节点集群?(How to scale single node Kafka to multiple node cluster?)

要扩展Kafka,如果需要使用kafka-topics.sh,则必须为主题添加更多分区。 然后使用kafka-reassign-partitions.sh将分区重新分配给新的代理。 重新分配实用程序将自动复制和分发您的数据。 您可以为整个主题或一组选择性分区执行此操作。 完整的文档在这里 。 请看第6节。 To scale Kafka you will have to add more partitions to topics if needed to using kafka-topics.sh. ...

kafka 停止

脚本应该是放在 /etc/init.d/ 目录下吧 例如 /etc/init.d/kafka-server stop 或是你把 kafka-server-stop.sh 内容贴上来看看

相关文章

更多

最近更新

更多