【问题标题】:How to query the event repository in a microservice Event Sourcing architecture with Spring Cloud Stream Kafka如何使用 Spring Cloud Stream Kafka 在微服务事件溯源架构中查询事件存储库
【发布时间】:2017-06-27 19:00:56
【问题描述】:

澄清:请注意,此问题与此问题不同:How to implement a microservice Event Driven architecture with Spring Cloud Stream Kafka and Database per service

这个是关于使用Kafka as the only repository (of events),不需要DB,另一个是关于使用Database (MariaDB) per service + Kafka

我想实现一个事件溯源架构来处理分布式事务:

OrdersService <------------> | Kafka Event Store | <------------>PaymentsService
                subscribe/                           subscribe/
                   find                                 find

OrdersService 接收订单请求并将新订单存储在代理中。

private OrderBusiness orderBusiness;    

@PostMapping
public Order createOrder(@RequestBody Order order){
    logger.debug("createOrder()");
    //do whatever
    //Publish the new Order with state = pending
    order.setState(PENDING);
    try{       
       orderSource.output().send(MessageBuilder.withPayload(order).build());
    }catch(Exception e){
        logger.error("{}", e);
    }
    return order;
}

这是我的主要疑问:如何查询 Kafka 代理?想象一下,我想按用户/日期、状态等搜索订单。

【问题讨论】:

标签: apache-kafka spring-cloud microservices spring-cloud-stream spring-kafka


【解决方案1】:

简短回答:您无法查询代理,但您可以利用 Kafka 的 Streams API 和“交互式查询”。

长答案: 阅读 Kafka 主题的访问模式是线性扫描,而不是随机查找。当然,您也可以随时通过#seek() 重新定位,但只能通过offsettime。主题也被分片成分区,数据(默认情况下)按键进行哈希分区(数据模型是键值对)。所以有一个键的概念。

但是,您可以使用 Kafka 的 Streams API,它允许您构建一个保存当前状态的应用程序——基于作为基本事实的 Kafka 主题——作为物化视图(基本上是缓存)。 "Interactive Queries" 允许你查询这个物化视图。

更多详情请看这两篇博文:

【讨论】:

  • 补充一下 Matthias 的上述观点,我们将在即将发布的 Spring Kafka 和 Spring Cloud Stream 版本中直接支持 KStream。
  • 太棒了!谢谢你们的信息!
猜你喜欢
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2021-10-01
  • 2018-06-25
  • 1970-01-01
  • 2017-04-18
  • 2019-02-01
相关资源
最近更新 更多