Kafka从app

时间:2017-08-11 09:14:20

标签: java stream apache-kafka apache-kafka-streams

我对Kafka和Kafka Streams很新,所以请耐心等待。我想知道我是否走在正确的轨道上。

我现在正在写一个Kafka主题,并尝试通过休息服务访问数据。原始数据类型需要在访问之前进行转换。

到目前为止我所做的是将原始数据写入主题的制作人。

1。)现在我想要流App(应该是在容器中运行的jar),它只是转换我想要的形状的数据。遵循物化视图范例。

简化版1.)

    KStreamBuilder builder = new KStreamBuilder();

    KStream<String, String> source = 
    builder.stream("my-raw-data-topic");

    KafkaStreams streams = new KafkaStreams(builder,props);
    KTable<String, Long> t =  source.groupByKey().count("My-Table");
    streams.start();

2。)另一个流App(应该是一个在容器中运行的jar)只是将KTable保存为某种存储库,可以通过包装休息服务访问

在这里,我有点坚持使用api的正确方法。 访问和查询KTable的最小值是多少?我是否需要再次将转换拓扑分配给构建器?

KStreamBuilder builder = new KStreamBuilder();
KTable table = builder.table("My-Table"); //Casting?
KafkaStreams streams = new KafkaStreams(builder, props);

RestService service = new RestService(table); 
// Use the Table as Repository which is wrapped by a Rest-Service and gets updated reactivly 

现在这是伪代码

我在正确的道路上吗?将 1。) 2分开是否有意义。)?这是使用流来实现视图的缩进方式吗?对我来说,在我看到更多流量的情况下,通过容器独立地扩大写入和读取将是有益的。

如何在 1。) 2的崩溃时处理KTable的重新填充。)。这是通过复制到流API来完成的,还是我需要通过代码解决的问题。比如重置光标并回复事件?

1 个答案:

答案 0 :(得分:0)

几点意见:

在您的代码段(1)中,在将构建器交给KafkaStreams构造函数后修改拓扑:

KafkaStreams streams = new KafkaStreams(builder,props);
// don't modify builder anymore!

您不应该这样做,但首先要指定拓扑,然后再创建KafkaStreams实例。

关于将您的应用程序拆分为两个。这可以独立地扩展两个部分。但总的来说很难说。但是,如果你同时吐出两者,第一个需要将转换后的日期写入输出主题,第二个应该将此输出主题读作表(builder.table("output-topic-of-transformation")来提供REST请求。

要访问KTable的商店,您需要通过提供的商店名称获取查询句柄:

ReadOnlyKeyValueStore keyValueStore =
streams.store("My-Table", QueryableStoreTypes.keyValueStore());

有关详细信息,请参阅文档:

http://docs.confluent.io/current/streams/developer-guide.html#interactive-queries