仅读取来自kafka主题的特定信息

时间:2019-02-18 07:22:08

标签: apache-kafka kafka-consumer-api kafka-python

场景:

我正在将数据JSON对象数据写入kafka主题,同时阅读,我想根据消息中存在的值读取一组特定的消息。我正在使用kafka-python库。

示例消息:

{flow_status: "completed", value: 1, active: yes}
{flow_status:"failure",value 2, active:yes}

在这里,我只想阅读flow_Status完成的消息。

4 个答案:

答案 0 :(得分:1)

在卡夫卡,不可能做那样的事情。 使用者从最新的提交偏移量开始(或者从头开始,或者以特定的偏移量进行查找)一个接一个地消耗消息。 根据您的用例,您可能在场景中会有不同的流程:将要执行流程的消息放入一个主题,然后处理该操作的应用程序,然后将结果(完成或失败)写在两个不同的主题中:这样,您就可以将所有工作从失败中分离出来。 另一种方法是使用Kafka Streams应用程序进行过滤,但要考虑到它只是一个糖,实际上,Streams应用程序将始终读取所有消息,但允许您轻松过滤消息。

答案 1 :(得分:0)

您可以创建两个不同的主题;一个用于完成,另一个用于故障状态。然后阅读已完成主题中的消息以进行处理。

否则,如果希望它们位于单个主题中,并且只想阅读完整的主题,我相信您需要全部阅读它们,并使用简单的if-else条件忽略失败的主题。

答案 2 :(得分:0)

Kafka消费者不预先支持这种功能。您将必须按顺序使用所有事件,过滤掉状态已完成的事件并将其放在某个位置。相反,您可以考虑使用Kafka Streams应用程序,您可以在其中将数据读取为流,并过滤flow_status =“ completed”的事件并在某些输出主题或其他目标中发布。

示例:

KStream<String,JsonNode> inputStream= builder.stream(inputTopic);
KStream<String,JsonNode> completedFlowStream = inputStream.filter(value-> value.get("flow_status").equals("completed"));

P.S。 Kafka尚未发布适用于KStream的Python API的正式版本,但有一个开源项目:https://github.com/wintoncode/winton-kafka-streams

答案 3 :(得分:0)

到目前为止,在代理端尚无法实现此功能,apache kafka已公开了一个Jira功能请求以实现此功能,您可以在此处进行跟踪,我希望他们能在不久的将来实现此功能: https://issues.apache.org/jira/browse/KAFKA-6020

我觉得最好的方法是使用RecordFilterStrategy(Java / spring)接口并在使用者端对其进行过滤。