让我们考虑以下使用Apache Kafka的抽象模式:
sendkeys
可以配置Kafka在指定时间向客户发送消息吗?
第二个问题是从客户那里向Kafka回滚消息是真的吗?
答案 0 :(得分:1)
消费者从卡夫卡那里传递消息;卡夫卡不推("发送")他们。因此,您的消费者可以在需要时提取数据。
答案 1 :(得分:1)
正如其他人已经回复的那样,卡夫卡不会向消费者发送消息,但消费者会从卡夫卡那里传递消息;这意味着您需要编写您的消费者,以便在特定时间(或间隔)从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应大于轮询时间