我对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);
我想知道这两个问题是否相关。
我还在请求之间添加了一个倒计时锁存器。 任何指针都将受到赞赏。