kafka概念相关

Kafka的核心功能:高性能的消息发送与高性能的消息消费。
kafka下载地址
创建topic:

./kafka-topics.sh --create --zookeeper localhost:2181 --topic test --partitions 1 --replication-factor 1

查看topic详情(查看分区数,副本数)

./kafka-topics.sh --describe --zookeeper localhost:2181 --topic test

发送消息到某个topic:

./kafka-console-producer.sh --broker-list localhost:9092 --topic test

消费某个topic的消息

./kafka-console-consumer.sh --bootstrap-server 172.17.2.154:9092 --topic test --from-beginning

设计一个消息引擎系统时需要考虑的两个重要因素

  • 消息设计:消息主体本身一般都是结构化得设计
  • 传输协议设计:AMQP,Web Service+SOAP,Protocol Buffers

进程间通信(inter process communication)

kafka消费模式

  • 点对点模式(point-to-point)
  • 发布订阅模式(publish-subscribe):发布/订阅模式有主题(topic)的概念

Java消息服务(Java Message Service,JMS)
一套API规范,提供了很多接口用于实现分布式系统间的消息传递,JMS同时支持点对点模式和发布订阅模式。很多主流的消息引擎系统(ActiveMQ,RabbitMQ,Kafka)都支持JMS规范。Kafka并没有完全遵照JMS规范。
Kafka设计时考虑的四个问题

  • 吞吐量/延时
    吞吐量是某种处理能力的最大值,对于kafka而言,它的吞吐量就是每秒能够处理的消息数或者每秒能够处理的字节数。
    对于kafka而言,延时可以表示客户端发起请求与服务器处理请求并发送响应给客户端之间的这一段时间。
    吞吐量和延时在kafka的设计是一个矛盾体(理解批处理的概念)
  • 消息持久化
  • 负载均衡和故障转移
  • 伸缩性
    kafka会持久化所有数据到磁盘,但本质上每次写入操作系统其实都只是把数据写入到操作系统的页缓存(page cache),然后又操作系统自行决定什么时候把页缓存的数据写回磁盘上。优势:
    1.页缓存是在内存中分配的,所以消息写入熟读非常快。
    2.kafka不必与底层的文件系统打交道,所有繁琐的I/O操作都交由操作系统来处理
    3.kafka写入操作采用追加写入(append)的方式,避免了磁盘随机写操作。kafka在设计时才用了追加写入消息的方式,即只能在日志文件末尾追加写入新的消息,且不允许修改已写入的消息。

零拷贝(Zero Copy)技术
Kafka在读取消息时会首先尝试从OS的页缓存中读取,如果命中便把消息经页缓存直接发送到网络的 Socket上。

直接存储器访问技术(Direct Memory Access,DMA)执行I/O操作

kafka将所有数据都立即写入文件系统的持久化日志中,之后kafka服务器才会返回结果给客户端通知他们消息已被成功写入。

kafka其他解决方案

  • 负载均衡:leader选举算法,可以在集群的所有机器上以均等就分散各个partition的leader
  • 故障转移:通过"心跳"或"会话"机制,即只要主服务器与备份服务器之间的心跳无法维持或主服务器注册到服务中心的会话超时过期了,集群自动启动某个备份服务器来替代主服务器的工作。kafka使用会话机制,kafka服务器启动后会以会话的形式把自己注册到zookeeper上。

消息持久化->kafka高可靠性。
负载均衡和使用文件系统的独特设计->高吞吐量
故障转移:->实现高可用性
启动新的kafka注册到zookeeper中即可->伸缩性
kafka服务器->broker

分区(partition)副本(replication)

kafka采用topic-partition-message的三级结构来分散负载,partition是不可修改的有序消息序列,每个partition有自己专属的partition号,通常是从0开始。该序列号被称为位移(offset),kafka的partition实际上并没有太多的业务含义,它的引入就是单纯的为了提升系统的吞吐量。

kafka的一条消息其实就是一个<topic,partition,offset>三元组(tuple),通过该元祖值可以在kafka集群中找到位移对应的那条消息

冗余机制
备份多份日志。这些备份日志被称为副本(replica),存在的唯一目的就是防止数据丢失。副本分为两类:领导者副本(leader replica)和追随者副本(follower replica),follower relica是不能提供服务给客户端的,它只是被动地向领导者副本获取数据,而一旦leader replica所在的broker宕机,kafka会从剩余的replica中选举出新的leader继续提供服务。kafka保证同一个partition的多个replica一定不会分配在同一台broker上
kafka只保证在ISR(in-sync replica,与leader replica保持同步的replica集合)存活的情况下“已提交”的消息不会丢失。正常情况下,partition的所有replica(含leader replica)都应该与leader replica保持同步,即所有replica都在ISR中。因为各种原因,一小部分replica开始落后于leader replica的进度。当之后到一定程度时,kafka会将这些replica“剔”出ISR,相反的,当这些replica重新“追上”了leader的进度时,那么kafka会将他们加回到ISR中。这一切都是自动维护的,不需要人工干预。

构造KafkaProducer
至少指定bootstrap.servers,key.serializer和value.serializer
带宽相关概念

当前主流的网络都是使用以太网,带宽主要由两种1Gb/s和10Gb/s,即平时说的千兆网和万兆网。
group.id
消费者组,group.id。是唯一标识一个consumer group。对于某个group而言,订阅topic的每个分区只能分配给该group下的一个consumer示例(当然该分区还可以被分配给其他订阅该topic的消费者组)
Consumers label themselves with a consumer group name,and each record published to a topic is delivered to one consumer instance within each subscribing consumer group

猜你喜欢

转载自blog.csdn.net/sdkdeveloper/article/details/103786542