Kafka(二)场景分析

某项目使用

如何发布给用户,每个用户一个topic或流处理分析? –No
所在的流程节点,在告警分析后?如果在后面,那么发布有延迟;并行处理的?流分开处理了额么,如果分开同步处理,那么可以有单独的服务器再次拉取,费流量。–并行处理的

订阅分发考虑主要有两个因素,用户数量,事件更新的频率

解决方式有如下:

为了达到顺序的目的,msk的key是卡口设备的id,这样就能保证一个卡口下的事件到达同一个partition这样,在这个partition内就是有顺序的。为了保证以后提高吞吐量时候,partition的num导致的瓶颈,一般partition会有“预partition”的操作。

交通项目性能分析

人脸项目使用经验,kafka远没有达到性能使用的瓶颈。

官网推荐的测试一个benchmark:

Single producer thread, no replication
821,557 records/sec
(78.3 MB/sec)

消息大小是100byte大小,有80w每秒的写入速度。这里,测试只用一个小的100byte的消息是应为更能测试出records/sec,如果每个消息体积越大,在MB/sec上的吞吐量会有更好的数据。

读取上,一个简单的测试结果,同样是100byte大小:

Single Consumer
940,521 records/sec
(89.7 MB/sec)

机器配置如下:

Intel Xeon 2.5 GHz processor with six cores
Six 7200 RPM SATA drives
32GB of RAM
1Gb Ethernet

非常普通的机器,吞吐量写入有80w,读取有90w,远远满足于现在项目需求。项目中,写入大概数量级在1k左右,读取不会超过1w。

从IO方面上分析,如果一条消息1k,网卡90MB/s的速度,单千兆网卡有9w的吞吐量,也是没什么问题的。

交通项目使用流程

事件持久化

设备接入服务器->图片写入云存储->kafka(过车事件topic)->数据清洗->告警分析->入库

订阅发布

应用服务器订阅所有过车事件->web使用websocket连接服务器->应用服务器实时对过车数据分析推送到各个web

吞吐量kafka配置

默认情况下,Kafka根据传递消息的key来进行分区的分配,即hash(key) % ,如果消息没有key,Kafka几乎就是随机找一个分区发送无key的消息

如果你的分区数是N,那么最好线程数也保持为N,这样通常能够达到最大的吞吐量。

资源消耗

IO密集型,引用某互联网大厂kafka最佳实践中的一段:

不建议为kafka分配超过5g的heap,因为会消耗28-30g的文件系统缓存,而是考虑为kafka的读写预留充足的buffer。Buffer大小的快速计算方法是平均磁盘写入数量的30倍。推荐使用64GB及以上内存的服务器,低于32GB内存的机器可能会适得其反,导致不断依赖堆积机器来应付需求增长。(我们在生产环境使用的机器是64G内存的,但也看到LinkedIn用了大量28G内存的服务器。)

10w吞吐量,单台应该是不够了,按照上述描述,每个消息1k,读写一共只有10个,需要5+30+1k10w10 = 36G

topic 应该有多少 partition

参考:How to choose the number of topics/partitions in a Kafka cluster?

On the consumer side, Kafka always gives a single partition’s data to one consumer thread. Thus, the degree of parallelism in the consumer (within a consumer group) is bounded by the number of partitions being consumed.

这里有点,一个partition同一个时刻只给一个consumer进行消费,原因其实不复杂,最大利用磁盘顺序读取的速度么。

参考

Kafka设计解析(一)
某互联网大厂kafka最佳实践
Kafka下的生产消费者模式与订阅发布模式
How to choose the number of topics/partitions in a Kafka cluster?
Benchmarking Apache Kafka: 2 Million Writes Per Second (On Three Cheap Machines)

Table of Contents