我使用Kafka 2.12和kafka-python模块作为Kafka客户端。我正在尝试测试一个简单的制作人:
class Producer(Process):
daemon = True
def run(self):
producer = KafkaProducer(bootstrap_servers='kafka:9092')
print("Sending messages...")
producer.send('topic', json.dumps(message).encode('utf-8'))
当实例化此过程时,消费者永远不会收到该消息
如果我刷新生成器并更改linger_ms参数(使其同步),消息将由消费者发送和读取:
class Producer(Process):
daemon = True
def run(self):
producer = KafkaProducer(bootstrap_servers='kafka:9092', linger_ms=10)
print("Sending messages...")
producer.send('topic', json.dumps(message).encode('utf-8'))
producer.flush()
在之前的Kafka版本中,有一个param queue.buffering.max.ms来指定生产者在队列中发送消息之前等待多长时间,但最新版本中没有它(kafka-python 1.3。 3)。我怎么能在较新的Kafka版本中指定这个以保持我的通信异常?
谢谢!
答案 0 :(得分:1)
正如您所观察到的,消息排队等待异步发送,并且无法保证它会立即发送。因此,如果要强制将消息发送到代理,则需要显式调用producer.flush()
,它将阻塞,直到发送消息为止(尽管flush()
不保证确认消息)。
注意:由于flush()
是阻止呼叫,因此通常仅推荐用于低吞吐量系统或应用程序关闭。对于大容量系统,同步发送与异步发送的吞吐量命中通常是不可行的。我的经验是生产者通常很快发送而不需要调用flush(),除了测试套件/开发你需要它立即发生的地方。
我非常确定param queue.buffering.max.ms
已被linger_ms
取代:https://kafka-python.readthedocs.io/en/master/apidoc/KafkaProducer.html#kafka.KafkaProducer
因此,您已经在工作示例中使用了该参数。
答案 1 :(得分:0)
producer = KafkaProducer(bootstrap_servers='kafkaIp:kafkaPort')
producer.send("topic_name", b'Your string here')
producer.flush()
使用发送和刷新。