当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring Cloud Stream Kafka在微服务事件源架构中查询事件存储库

孙斌
2023-03-14

澄清:请注意,这个问题与这个问题不同:如何使用Spring Cloud Stream Kafka和每个服务的数据库实现微服务事件驱动架构

这一个是关于使用Kafka作为唯一的存储库(事件),不需要DB,另一个是关于使用每个服务的数据库(MariaDB)。

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

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经纪人?假设我想按用户/日期、状态等搜索订单。

共有1个答案

禹德水
2023-03-14

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

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

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

有关更多详细信息,请参阅以下两篇博文:

  • https://www.confluent.io/blog/unifying-stream-processing-and-interactive-queries-in-apache-kafka/
 类似资料:
  • 据我目前的一点经验所知,“微服务”的核心概念之一是它依赖于自己的数据库,独立于其他微服务。 深入研究如何在微服务系统中处理分布式事务,最好的策略似乎是事件源模式,其核心是事件存储。 不同微服务之间是否共享事件存储?或者每个微服务都有多个独立的事件存储数据库和一个公共事件代理? 如果第一个选项是解决方案,那么使用CQRS,我现在可以假设每个微服务的数据库都是作为查询端的,而共享事件存储在命令端。这是

  • 事件源和CQR如何帮助实现微服务的解耦架构。 我们可以让微服务拥有自己的数据,其他人通过服务访问数据,即使是通过传统的持久性手段。不是吗?

  • 我已经意识到事件源、CQRS、DDD和微服务有一段时间了,现在我想尝试并开始实施一些东西并尝试一些东西。 我一直在研究CQRS的技术方面,我理解其中的DDD概念。写入端如何处理来自UI的命令并发布其中的事件,以及读取端如何处理事件并在其上创建投影。 我遇到的困难是沟通 所以我想重点关注eventstore(这一个:https://eventstore.com/不那么模棱两可)。这就是我想要使用的,

  • 问题内容: 我正在尝试使用SSE将JSON数据发送到浏览器,但似乎无法正确处理,而且我也不知道为什么。 服务器端看起来像这样: 如您所见,我已经注释掉了帖子内容,但最终我希望将testdata用作JSON本身,如下所示: 客户端看起来像这样: 我看到控制台日志,但 没有看到警报。 问题答案: 尝试发送适当的JSON(输出中未引用): 但最好:

  • 这个问题类似于将Kafka用作CQRS EventStore。好主意?,但更具体的实现。当我有数千个事件“源”(DDD中的聚合根)时,如何使用kafka作为事件存储?正如我在链接问题和其他一些地方读到的,我会有每个来源的主题的问题。如果我将事件按类型拆分到主题中,它将更容易使用和存储,但我需要访问特定源的事件流。如何用Kafka做事件来源?

  • 我一直在读关于微服务和事件来源的文章,以及它是如何将服务从另一个服务中分离出来的。有两个概念我不清楚。首先,如果在微服务体系结构中,每个服务都可以独立开发,我们如何解释服务间的通信依赖? 例如,如果服务A和服务B需要通信,那么A需要将一个事件发送到一个中央总线,而B需要监听该事件并根据该事件采取行动,但这似乎会产生很多依赖关系。现在,如果我正在开发服务B,我需要知道服务A可以生成的所有事件。此外,