当前位置: 首页 > 科技观察

吃透Kafka底层通信机制后,我把系统网络性能提升了10倍以上

时间:2023-03-19 01:09:52 科技观察

在深入了解Kafka底层通信机制后,我将系统的网络性能提升了10多倍。网络通信机制应该如何设计才能保证与对等点通信时的最佳性能?即使通过出色的设计,性能也能提高10倍以上。在本文中,我们以Kafka为例,分析一下Kafka在客户端和服务端通信时,如何设计和优化一些底层网络通信相关的机制。1、客户端与服务端的交互如果我们使用kafka作为消息中间件,必然会有一个客户端作为生产者向他发送消息,这个大家应该都明白。对于Kafka,它支持分布式消息存储。这是什么意思?比如现在你有了一个“Topic”,你可以把一个“Topic”理解为一个消息数据的逻辑集合。比如现在你想把所有的订单数据发给一个“Topic”,那么这个“Topic”就叫做“OrderTopic”,里面包含了订单数据。那么这个“Topic”的数据可能非常大,不可能放在一台机器上吧?因此,我们可以将存储分散在多台Kafka机器上,每台机器可以存储一部分数据。这就是Kafka的分布式消息存储的机制。每个Kafka服务器称为Broker,负责管理一台机器上的数据。我们看下图:一个“Topic”可以拆分成多个“Partition”,每个“Partition”存储一部分数据,每个Partition可以放在不同的KafkaBroker机器上,从而实现数据的效果多台机器上的分散存储消失了。那么当client向KafkaBroker发送消息时,比如你限制“OrderTopic”的订单数据拆分成3个“Partitions”,那么这3个“Partitions”分别放在一个KafkaBroker上,这样就是说将所有订单数据分发给三个KafkaBrokers。这时候默认会采用负载均衡策略。例如,假设总共有30,000条订单数据,则将10,000条订单消息分发到每个Partition,从而使订单数据平均分配给3个Broker。在机器上。整个过程如下图所示:2.网络通信频繁导致性能低下的问题好。现在问题来了。例如,当客户端向KafkaBroker发送消息时,现在它要向Kafka发送订单。他怎么送过来的?订单消息是直接对应一个网络请求发送给Broker吗?如果这样做,将不可避免地导致与经纪人的频繁网络通信。频繁的网络通信每次都涉及复杂的网络连接和传输过程,进而导致客户端性能低下。让我举一个例子。例如,每次通过网络通信将订单发送给经纪人,需要1??0ms。因此,如果在一次网络通信中向经纪人发送订单,则每秒最多发送100个订单。想想看,这是真的吗?但是如果你每秒有10000个订单发送,此时你的发送性能将远远不能满足你的需求,即性能低下。看来你的系统给kafka下单的速度还是挺快的。慢的。3、批处理机制:多条消息打包成一个批处理。所以首先针对这个问题,Kafka做的第一个优化就是实现了批处理机制。意思就是他会在客户端放一个内存缓冲区,你每写一个订单,先放到内存缓冲区,然后在内存缓冲区,多个订单会打包成一个批次。比如Kafka默认规定的batchsize是16kb,也就是说默认情况下,如果你填了多个16kb大小的订单,就会变成一个batch,然后他会通过网络通信把这个batch发给broker.如果一个batch发送给broker,也是需要10ms,但是100个单可以一个batch下单,那么1秒可以发送100个batch吗?这个时候10000单能不能1秒发出去?而在将消息打包成一个batch的时候,有一个特别的地方。在输入批处理之前,您必须将消息发送到同一主题的同一分区。这个batch代表多条消息要发送到同一个Partition,这样batch就可以通过网络请求发送给broker,并对应写入一个Parititon。4.请求机制:多批打包成一个请求。事情就这样结束了吗?还没有!例如,如果我们手头有两个Topic,每个Topic有3个Partition,那么每个Broker会存储2个Partition吗?一个Partition属于Topic01,另一个Partition属于Topic02。现在假设对Topic01的Partition02形成了一个batch,对Topic02的Partition02也形成了一个batch,但这两个batch其实是发送给了同一个Broker,如上图中的第二个Broker。此时,是否还是网络请求发送一批过去?其实完全没有必要。这时候可以将发送给同一个Broker的多个batch打包成一个request,然后通过网络通信将一个request发送给那个Broker。假设一次网络通信还是10ms,那么这次网络通信会发送2批次。通过这种将多个batch打包成一个request一次性发送给Broker的方式,进一步提高了网络通信的效率和性能。其实batch机制+request机制就是想办法把很多数据打包,然后在一次网络通信中发送尽可能多的数据,这样可以增加单位时间内发送的数据量。单位时间内发送的数据量就是所谓的“吞吐量”,即单位时间内可以向broker发送多少数据。比如每秒可以发送3万条消息,代表客户端的“吞吐量”。所以,搞清楚这个原理,就可以学到这个非常好的设计思想。而且在面试的时候,如果和面试官聊kafka,也可以和面试官聊聊kafka底层如何有效提升网络通信的性能。最后再放一张图作为全文的总结。