Apache Kafka 不平衡集群逻辑

时间:2021-07-12 01:27:30

标签: python apache-kafka kafka-python

我们有一个需求,我们需要通过将 3 个代理集群的流量分配(例如 80 % 到 Broker 1 15 % 到 Broker 2 5 % 到 Broker 3 的流量分配)有目的地不平衡 Kafka 集群,并发送消息给根据broker的流量分布分配给broker。

为了使用 kafka-python 在 python 编程中实现这个逻辑,我们从主函数中调用了生产不平衡消息函数。下面提供了实现逻辑的代码示例:-

主要功能

def mf():
   .
   .
   . 
    # create a topic if the topic doesn't exists. Tps_crtn will create new topic if no existing topics found else, will send messages to the existing topics, as usual.
    tpc_list = tps_crtn(base_topic_name=bt, no_of_topics=int(ntp), 
                    topic_partn=int(ptp), 
                    repicas_per_partn=int(rpp))
    #traffic distribution list
    dl = [80,15,5]
    while True:
        
      for ix, topic in enumerate (tpc_list):
        produce_unbalanced_message(topic_name=topic,
         no_of_msgs=int(round((int(nm) * (float(dl[ix])/100.0)))),
         max_wait_time=float(mwt)
if __name__ == "__main__":
    mf()

main 函数调用下面提到的 Producer 发送函数,以便向主题列表中的每个主题发送消息。

Unbalance Produce消息功能

def produce_unbalanced_message(topic_name='test-topic',
             no_of_msgs=-1,
             max_wait_time=2):
kafka_admin_client: KafkaAdminClient = KafkaAdminClient(
    bootstrap_servers='10.22.151.16:9100'
    )
. 
.
# List of all node ids in the cluster
LOG.info("Fetch the existing Kafka node list")
nodeids: List[int] = [node.nodeId for node in kafka_admin_client._client.cluster.brokers()]
for n in nodeids:
print(n)
.
.
.
# sending unbalanced messages to Kafka
producer.send(topic_name,
              key=key,
              value=message)
.
.

根据要求,消息应该根据broker nos和相应的流量分发列表而不是主题列表发送。我们从produce_unbalanced_message 函数中的nodeids 列表中获得的broker nos。

但是,在通过遵循流量分布列表参数测试超过三个主题计数的代码时,我们正在获取索引越界错误。原因是我们一增加它们的值就在主题列表中,流量列表分布值不匹配,因为它们是根据代理设置的。

任何人都可以建议应该尝试哪些更改,以便根据从 nodeids 列表和相应的流量分发列表中获得的代理编号而不是根据主题列表发送消息?

1 个答案:

答案 0 :(得分:0)

<块引用>

流量列表分布值不匹配,因为它们是根据代理设置的

您将两个列表结合在一起。如果您拥有比“分发列表”更多/更少的主题,那么您不能使用一个列表的索引来访问另一个。

IMO,如果你有一个静态定义的 if 块,它会更易读,因为没有真正需要获取主题列表来创建一个不平衡的集群。

如果您想要 100% 的分布,只需使用随机范围

import random

while True:
   value = random.random()
   topic = None
   if 0 <= value < 0.80:
        topic = 't1'
   elif 0.80 <= value < 0.95:
        topic = 't2'
   else:
        topic = 't3' 
   
   print('Produce to topic ' + topic)

如果您真的希望它“不平衡”,您也需要验证主题是否只有一个副本并且由不同的代理托管

相关问题