Kafka流不会返回正确的消息

时间:2017-03-30 20:57:40

标签: apache-kafka

我对Apache Kafka很新。

我正在构建的应用程序为传入的作业提供了一个主题“A”。 工作是一个简单的json {“jobId”:1,“processedIds”:[],“ids”:[1,2]}

然后在听取主题“A”

的听众中处理每个作业的id

所以,例如对于上述工作, 将处理ID 1,并将以下消息发送到主题“A”: {“jobId”1,“processedIds”:[1],“ids”:[1,2]}

填充processedIds,我通过id从KafkaStreams商店获取作业,并将新的processedId附加到现有的集合。

然而, 当我在添加processedID后从Kstream获得作业时,返回的作业是初始作业 {“jobId”:1,“processedIds”:[],“ids”:[1,2]}

有人知道为什么吗?这似乎偶尔会发生,所以有时它的工作正常。

消费者配置属性: auto.offset.reset - 最早的 auto.commit.interval.ms - 1000

我通过增加和降低间隔尝试了不同的值。 我也尝试过auto.offset.reset -latest

这是在我运行集成测试时。对于同一应用程序中的另一个测试,我得到一个InvalidStateStoreException。我知道需要捕获错误并且需要重试对存储的访问,因为它可能在期间不可用重新平衡。我也看到,如果我在调试时运行测试,它会通过测试。所以我认为它也可能是某种时序问题?

Producer<String, Request> p = new KafkaProducer<String, Request>(props,new StringSerializer(),new JsonSerializer<Request>());   

//for each id in job    
Request r1 = new Request();
r1.setId("1");
r1.setJobId("1");
r1.setId(1L);
future = p.send(new ProducerRecord<String, Request>("ResultsTopic",r1.getId(),r1));
future.get();

Request r2 = new Request();
r2.setId("2");
r2.setJobId("1");
r1.setId(2L);
future = p.send(new ProducerRecord<String, Request>("ResultsTopic",r2.getId(),r2));
future.get();

p.flush();
p.close(500, TimeUnit.MILLISECONDS);

//Kafka listener method for incoming jobs topic - "ResultsTopic"
@Autowired
KafkaStreams all_job_stream;
String jobId = request.getJobId();
ReadOnlyKeyValueStore<String, Job> store = all_job_stream.store("AStore", QueryableStoreTypes.keyValueStore());   //this throws a InvalidStateStoreException


Job job = store.get(jobId); //if I add a sleep before this the test passes

job.getCompletedResponseIds().add(request.getIds());

jobKafkaTemplate.sendDefault(partitionSelectionStrategy.getPartition(job), job.getId(),job);

我想知道这两个问题是否相关。

我还在请求之间添加了一个倒计时锁存器。 任何指针都将受到赞赏。

0 个答案:

没有答案