发布与订阅消息系统
数据(消息)的发送者(发布者)不会直接把消息发送给接收者,这是发布与订阅消息系统的一个特点。发布者以某种方式对消息进行分类,接收者(订阅者)订阅它们,
以便接收特定类型的消息。发布与订阅系统一般会有一个 broker,也就是发布消息的中心点。
Kafka 登场
在0.10版本之前, Kafka仅仅作为一个消息系统,主要用来解决应用解决、 异步消息 、 流量削峰等问题。 不过在0.10版本之后, Kafka提供了连接器与流处理的能力,它也从分布式的消息系统逐渐成为
一个流式的数据平台 。
消息和批次
Kafka 的数据单元被称为消息 。消息由字节数组组成,所以对于 Kafka 来说,消息里的数据没有特别的格式或含义。消息可以有一个可选的元数据 ,
也就是键。键也是一个字节数组,与消息一样,对于 Kafka 来说也没有特殊的含义。 当消息以一种可控的方式写入不同的分区时,会用到键。最简单的例子就是为键生成一个一致
性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区。这样可以保证具有相同键的消息总是被写到相同的分区上。
为了提高效率,消息被分批次写入 Kafka 。 批次就是一组消息,这些消息属于同一个主题和分区。如果每一个消息都单独穿行于网络,会导致大量的网络开销,把消息分成批次传
输可以减少网络开销。不过,这要在时间延迟和吞吐量之间作出权衡:批次越大,单位时间内处理的消息就越多,单个消息的传输时间就越长。批次数据会被压缩,这样可以提升
数据的传输和存储能力,但要做更多的计算处理。
模式
对于 Kafka 来说,消息不过是晦涩难懂的字节数组,所以有人建议用一些额外的结构来定义消息内容,让它们更易于理解。根据应用程序的需求, 消息模式 ( schema)有许多
可用的选项。像 JSON 和 XML 这些简单的系统,不仅易用,而且可读性好。不过,它们缺乏强类型处理能力,不同版本之间的兼容性也不是很好。 Kafka 的许多开发者喜欢使用
Apache Avro , 它最初是为 Hadoop 开发的一款序列化框架。 Avro 提供了一种紧凑的序列化格式,模式和消息体是分开的,当模式发生变化时,不需要重新生成代码它还支持强类
型和模式进化,其版本既向前兼容, 也向后兼容。数据格式的一致性对于 Kafka 来说很重要,它消除了消息读写操作之间的辑合性。
如果读写操作紧密地桐合在一起,消息订阅者需要