可以将自定义数据返回给Kafka Producer

时间:2017-11-28 07:52:05

标签: java rest spring-boot apache-kafka spring-kafka

我正在学习kafka,我想将我的应用程序拆分为2个微服务。 首先将所有传入的消息从KafkaConsumer保存到数据库,然后按给定的id选择实体。 其次提供REST api来保存和获取实体。 他们之间的互动提供了卡夫卡。 如何在REST api中使用kafka从db接收存储的ID? 以下是调用POST请求的生产者示例代码。

 public void sendToKafka(MyObject myobject) throws ExecutionException, InterruptedException {
    LOGGER.info("sending payload='{}' to topic='{}'", myobject, myTopic);
    byte[] bytes = parseObjectToByte(myobject);
    ListenableFuture<SendResult<String, byte[]>> resultFuture = kafkaTemplate.send(topicSave, bytes);
    SendResult<String, byte[]> result = resultFuture.get();
    LOGGER.info(result.toString());
}

和Consumer,将myObject保存到数据库

@KafkaListener(topics = "${kafka.topic.mytopic}")
public void saveMyObject(byte[] value) {
    MyObject myobject = parseToMyObject(value);
    LOGGER.info("received myobject='{}'", myobject);
    MyObject myobjectSaved = myObjectRepository.insert(myobject);
}

我正在使用spring-kafka和spring-boot。 Rest api有两种方法: POST - 保存myObject 获取 - 按ID返回保存的对象。 有可能用kafka或者我必须直接连接这个微服务吗?谢谢。

1 个答案:

答案 0 :(得分:2)

我不确定我是否完全理解你的问题,但是如果你想向kafka发送消息,并等待这个消息被一些微服务消费和处理,然后微服务会将一些信息(一个主键)返回给发送者。如果不在架构中添加更多内容,就无法做到这一点。

发送给kafka的消息是“一次又一次忘记”,从发送者的角度来看,您对此消息将会发生什么一无所知(如果,时间,频率以及将消耗多少消费者。)

在您的方案中,消费者微服务还可以在另一个kafka主题中发送带有主键的消息,如果您需要该信息,则可以使用该消息。

记住Kafka用于解耦您的体系结构并引入异步消息处理,如果您需要同步获得消费者的响应,而您可能正在使用错误的解决方案。