BufferError:本地:Python中的队列已满

BufferError:本地:Python中的队列已满,python,apache-kafka,Python,Apache Kafka,错误:- import logging from confluent_kafka import Producer import os logger = logging.getLogger("main") BOOTSTRAP_SERVERS = os.environ['BOOTSTRAP_SERVERS'] APPLICATION_ID = os.getenv('APPLICATION_ID', default = "nke-data-source") RECONNECT_BACKOFF_MS

错误:-

import logging
from confluent_kafka import Producer
import os

logger = logging.getLogger("main")

BOOTSTRAP_SERVERS = os.environ['BOOTSTRAP_SERVERS']
APPLICATION_ID = os.getenv('APPLICATION_ID', default = "nke-data-source")
RECONNECT_BACKOFF_MS = os.getenv('RECONNECT_BACKOFF_MS', default = 1000)
REQUEST_TIMEOUT_MS = os.getenv('REQUEST_TIMEOUT_MS', default = 40000)
ACKS = os.getenv('ACKS', default = "all")
RETRIES = os.getenv('RETRIES', default = 15)
RETRY_BACK_OFF = os.getenv('RETRY_BACK_OFF', default = 1000)
MAX_IN_FLIGHT_REQUESTS = os.getenv('MAX_IN_FLIGHT_REQUESTS', default = 1)
topic = os.getenv('OUTBOUND_TOPIC', default = "tti-nke-raw")

p = Producer({'bootstrap.servers': BOOTSTRAP_SERVERS, 
    'client.id': APPLICATION_ID, 
    'reconnect.backoff.ms': RECONNECT_BACKOFF_MS,
    'request.timeout.ms': REQUEST_TIMEOUT_MS,
    'acks': ACKS,
    'retries': RETRIES,
    'retry.backoff.ms': RETRY_BACK_OFF,
    'max.in.flight.requests.per.connection': MAX_IN_FLIGHT_REQUESTS,
    'compression.type': "lz4"})

def send(key, event):
    try:
        logger.info("Sending key: [{0}] value: [{1}]".format(key, event))
        p.produce(topic=topic, value=event.encode('utf-8'), key=key)
    except Exception:
        logger.error("error sending events to kafka", exc_info=True)


有人能帮我吗,因为我是python新手

这个
队列
是在
librdkafka
库中实现的(它绑定到
confluent_kafka

有一个内部的
队列
,用于接收生产者交付报告并等待产品处理它们(大多数情况下什么也不做),但您需要触发这种通过队列的机制,可以通过调用
poll来简单调用该队列

您应该在每次制作后调用
producer.poll(0)
因此,改变:

p.product(主题=主题,值=事件.encode('utf-8'),键=键)
进入:

p.product(主题=主题,值=事件.encode('utf-8'),键=键)
p、 民意测验(0)
这将触发队列清理,不必担心性能,因为这是一个非常简单的函数,实际上并不像librdkafka的作者所写的那样:

poll()调用成本低,不会对性能产生影响,因此请将其添加到producer循环中

基本上它是做什么的:

定期调用poll(),为生产者的交付报告回调提供服务


考虑一下在这篇文章中读到这一点

你介意发布整个回溯吗?@DanielWalker Update我想我必须更新我的kafka队列大小,你能帮我增加吗?你可以尝试增加
缓冲区。内存
(默认32MB),但一个更大的问题是,为什么它会变满。IDK它工作正常,正在消耗数据包,但不知何故它不是空的
Traceback (most recent call last):
BufferError: Local: Queue full
File "/app/sender.py", line 30, in send
p.produce(topic=topic, value=event.encode('utf-8'), key=key)