私たちは、画像を受け取り、関連する情報を送り返すリアルタイム製品を作成しています。スケーラビリティの目的で、Kafka を使用して Kubenertes ノード間のワークロードのバランスをとることにしました。
フロントエンド -> MainWorker -> Kafka (1) -> ワーカー -> Kafka (2) -> MainWorker -> フロントエンド
何らかの理由で、Kafka (1) と kafka (2) の場合、プロデューサーとコンシューマーの間で予期しない 80 ~ 100 ミリ秒が発生します。
レイテンシーは、ローカルにデプロイされたものとクラウドにデプロイされたもので同じです
プロデューサー 1
client = KafkaClient(hosts=kafka_url)
topic = client.topics['frames']
producer = topic.get_producer(min_queued_messages=1)
data = {"frame": message,"uid": self.user, "size": len(message), "time": str(start)}
data = json.dumps(data, separators=(',', ':'))
data = data.encode()
producer.produce(data)
プロデューサー/コンシューマー 2
consumer = topic.get_balanced_consumer(consumer_group='detection', zookeeper_connect=zookeeper_url, auto_commit_enable=True, reset_offset_on_start=True)
while True:
message = consumer.consume()
if message is None:
continue
start = time.time()
message = json.loads(message.value.decode('utf-8'))
before = datetime.datetime.strptime(message["time"], '%Y-%m-%d %H:%M:%S.%f')
after = datetime.datetime.now()
print(f"Bouncing 1: {int((after - before).total_seconds() * 1000)}ms")
...
producer.produce(response_json.encode('utf-8'))
遅延を減らすためにいくつかのことを試みましたが、これは遅延に影響を与えていないようです. プロデューサとコンシューマの両方のレイテンシが最小である必要があります。スループットは気にしません。