kafka

- kafka主要由3种类型的角色构成:消息生产者,代理服务器和消息消费者。生产者决定topic,并传入代理服务器集群,代理服务器集群在磁盘存储维护各种topic的消息队列,订阅了某个topic的消息消费者从代理服务器集群中pull新产生的消息进行处理。这是典型的pub-sub类型的消息服务。

- 对于某个topic,支持进行数据分片(即topic内部再分成多个消息队列),每个数据分片是有序的,不可更改的尾部追加消息队列,生产者可以指定消息的数据分片,具体方式可以是Round robin随机分配,也可以是逻辑分配,比如按照用户uid hash分配,保证相同用户的进入相同队列。

- 对于某个数据分片,它的存储是通过一系列的切割成固定大小的文件来存储的,没错,是文件不是内存,而内存维护每个文件首个消息offset。所以消费者读消息,会指定消息对应的offset及读取内容大小信息,根据索引查找到对应的文件。这里也需要注意,消息系统中用户读到了队列中的哪个消息,这不是代理服务器维护,而是消费者各自维护,这样简化了设计。代理服务器能做到无状态,容错性和可扩展性很好。

- 消息存在文件的好处是天然具有持久话能力,但是基于文件的读取岂不是效率很低?这里的关键是,kafka将读写操作尽可能的转换为顺序读写,即连续读写整块数据。数据表明,一定条件下,顺序写的性能比随机写高出6000倍,再加上预读,迟写的操作系统优化,其文件读写的效率不比内存的差。

    那么如何做到呢?比如文件写入采用尾部追加写,而文件内容的网络传输采用了linux的sendfile调用,即从文件系统直接到网卡缓存,跳过了磁盘到->内核页缓存->应用空间缓存->socket缓存->网卡缓存的路径。

posted @ 2018-11-18 22:59  jiangz222  阅读(142)  评论(0编辑  收藏  举报