0

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

这个是关于使用Kafka 作为唯一的存储库(事件),不需要数据库,另一个是关于每个服务使用一个数据库(MariaDB)+ 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 代理?想象一下,我想按用户/日期、状态等搜索订单。

4

1 回答 1

0

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

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

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

有关更多详细信息,请参阅这两个博客文章:

于 2017-02-09T19:20:26.460 回答