我正在使用confluent_kafka软件包来使用Kafka。 我以这种方式创建主题:
var clock = $('#clock3').FlipClock(new Date("April 10, 2019 18:37:00"), {
clockFace: 'DailyCounter',
countdown: true,
callbacks: {
stop: function () {
$("#myButton3Show").hide();
$("#myButton3Hide").show();
}
}
});
有效。 (这将获得24820条消息,而不是25000条消息...) 我们可以检查它:
<div class="endgame2">
<img src="Pictures/endgame.png">
<div id="clock3"></div>
<a href="https://www.myvue.com/film/avengers-endgame" target="_blank" id="myButton3Show">About Movie</a>
<a href="https://www.myvue.com/film/avengers-endgame" target="_blank" id="myButton3Hide" style ="display: none">Buy Ticket on Vue</a>
</div>
现在我要消费:
from confluent_kafka import avro
from confluent_kafka.avro import AvroProducer
def my_producer():
bootstrap_servers=['my_adress.com:9092',
'my_adress.com:9092']
value_schema = avro.load('/home/ValueSchema.avsc')
avroProducer = AvroProducer({
'bootstrap.servers': bootstrap_servers[0]+','+bootstrap_servers[1],
'schema.registry.url':'http://my_adress.com:8081',
},
default_value_schema=value_schema
)
for i in range(0, 25000):
value = {"name":"Yuva","favorite_number":10,"favorite_color":"green","age":i*2}
avroProducer.produce(topic='my_topik14', value=value)
avroProducer.flush(0)
print('Finished!')
if __name__ == '__main__':
my_producer()
但是有一个问题: 我只会一一阅读邮件。 我的问题是如何阅读一批邮件? 我在Consumer config中尝试了不同的参数,但是它们没有任何作用!
我还在SO上找到了this question,并尝试了相同的参数-它仍然不起作用。
也请阅读。但这违反了先前的链接...
答案 0 :(得分:1)
您可以使用consume([num_messages=1][, timeout=-1])
方法进行操作。 API参考在这里:
对于AvroConsumer: https://docs.confluent.io/current/clients/confluent-kafka-python/index.html?highlight=avroconsumer#confluent_kafka.Consumer.consume
有关此问题的更多信息:
https://github.com/confluentinc/confluent-kafka-python/issues/252
答案 1 :(得分:0)
AvroConsumer没有consume
方法。但是很容易像Consume类(AvroConsumer的父类)中那样,自己实现此方法。
这是代码:
def consume_batch(self, num_messages=1, timeout=None):
"""
This is an overriden method from confluent_kafka.Consumer class. This handles batch of message
deserialization using avro schema
:param int num_messages: number of messages to read in one batch (default=1)
:param float timeout: Poll timeout in seconds (default: indefinite)
:returns: list of messages objects with deserialized key and value as dict objects
:rtype: Message
"""
messages_out = []
if timeout is None:
timeout = -1
messages = super(AvroConsumer, self).consume(num_messages=num_messages, timeout=timeout)
if messages is None:
return None
else:
for m in messages:
if not m.value() and not m.key():
return messages
if not m.error():
if m.value() is not None:
decoded_value = self._serializer.decode_message(m.value())
m.set_value(decoded_value)
if m.key() is not None:
decoded_key = self._serializer.decode_message(m.key())
m.set_key(decoded_key)
messages_out.append(m)
#print(len(message))
return messages_out
但是在此之后,我们进行测试,并且此方法不会提高任何性能。因此看起来只是为了更好的可用性。或者,我需要做一些其他的工作,而不是序列化单个消息,而是序列化整个批处理。