如何配置Apache Kafka在指定时间发送数据?

时间:2017-12-08 11:07:42

标签: apache-kafka kafka-consumer-api

让我们考虑以下使用Apache Kafka的抽象模式:

sendkeys

可以配置Kafka在指定时间向客户发送消息吗?

第二个问题是从客户那里向Kafka回滚消息是真的吗?

4 个答案:

答案 0 :(得分:1)

消费者从卡夫卡那里传递消息;卡夫卡不推("发送")他们。因此,您的消费者可以在需要时提取数据。

答案 1 :(得分:1)

正如其他人已经回复的那样,卡夫卡不会向消费者发送消息,但消费者会从卡夫卡那里传递消息;这意味着您需要编写您的消费者,以便在特定时间(或间隔)从Kafka主题中提取消息。 关于回滚你的意思是什么?也许该消费者从Kafka获取消息但后来又想重新阅读相同的消息,因为在第一次处理期间发生了错误?如果是,有关Kafka的两个方面需要考虑:

  • Kafka保留了可以配置的消息(即使是几天),这意味着当消费者获取消息时,他们不会从主题分区中删除
  • 当消费者获取消息时,它必须提交偏移量,以便它可以跟踪从主题分区读取的最新消息。此提交可以自动或手动完成,这样您只有在流程顺利的情况下才能提交偏移量。在任何情况下,您都可以重新加上流并决定从特定偏移量重新开始读取主题分区。

答案 2 :(得分:1)

如果我收到问题,您希望在特定时间点向客户发送数据。如果对Apache Kafka使用Lenses,则可以像

一样简单

#cron the following to execute daily at 24:00 curl -XGET http://lenses-host:port/api/sql/data?sql=SELECT * from topicA WHERE customer = 'customerA WHERE _ts > 'yyyy-mm-dd hh:mm:ss'' > customerA.json send info@customerA.com customerA.json

因此,要回答问题的第一部分,您需要构建消费者逻辑。 Kafka不支持回滚,但您可以轻松地执行以下操作:

INSERT INTO topicB SELECT * from topicA WHERE _ts < '2017-12-10 00:00:00'

因此,您可以轻松地从另一个主题创建新主题,但没有回滚语义。

答案 3 :(得分:0)

扩展到Robin,

Kafka不会向消费者推送消息,消费者需要从Kafka提取消息。

查看下面的python片段以阅读来自Kafka的消息:

running = True
while running:
    msg = c.poll(timeout=1.0)
    if not msg.error():
        print('Received message: %s' % msg.value().decode('utf-8'))
    elif msg.error().code() != KafkaError._PARTITION_EOF:
        print(msg.error())
        running = False

在上面的代码段msg = c.poll(timeout=1.0)用于每秒从Kafka中提取消息。如果你想将超时增加到任何秒数。这意味着Kafka消费者消费者将从每个时间间隔中提取消息。

如果你想做日程安排,你必须在日程安排时间调用poll方法。

注意:session.timeout.ms应大于轮询时间