【问题标题】:Retrieve data from an event driven system从事件驱动系统中检索数据
【发布时间】:2020-09-08 11:16:28
【问题描述】:

我目前正在开发一个需要异步工作的系统,所以我决定是时候尝试一下事件驱动架构了。大部分功能都是 CRUD

不同的部分是:

  • 使用 websocket 连接与 API 网关通信的 UI
  • 网关接收负载并创建带有负载的消息进入 Kafka 集群
  • 服务使用消息、验证实体并将其存储在数据库中。事件被推送到 Kafka 以供网关使用并返回 UI

创建、更新和删除非常简单。

但是,当我通常使用 HTTP GET 调用检索数据时,事情变得有点棘手。我怎样才能正确检索这些数据?我是否创建请求事件,或者我有哪些选项?数据库中的数据还需要通过服务“可搜索”和“可分页” - 通常我会为此使用查询字符串。我发现我的“请求数据事件”变得非常庞大,并且包含很多关于请求数据的逻辑。基本上,现在的流程与创建、更新等相同。将事件推送到 Kafka,其中包含有关应查询哪些数据的信息。

以事件驱动的方式处理数据读取的正确方法是什么?

如何让我的数据可搜索? (比如获取所有具有资源 x 外键或包含 name = "xyz" 的资源)

【问题讨论】:

  • 您说要求系统是asynchronous - 这背后的商业原因是什么?对于阅读,您最好从 API Gateway 查询数据库(也许通过一些薄层来抽象持久性细节)。如果业务需求是性能/可扩展性,您可以使用其他工具(缓存、只读数据库镜像等)来解决这个问题,这些工具比通过事件执行此操作更简单、更高效。

标签: events apache-kafka event-handling event-driven event-driven-design


【解决方案1】:

根据您的业务需求有多种选择:

选项 A:

  • 您可以在“写入时”查询和分发数据。这意味着在将数据放入 Kafka 集群之前,您可以保留连接客户端的地图并根据他们的兴趣将数据分发给这些客户端。
  • 此外,您还可以根据兴趣使用此连接客户端地图,为这些客户端订阅 Kafka 中的相关主题。
  • 如果需要,您还可以考虑服务器发送事件并将入口 websocket 连接与客户端更新分开

选项 B:

  • 您可以定期检查数据库中提到的查询,并根据客户的兴趣将结果流式传输给客户。
  • 如果您需要将这些查询扩展到多个副本,您可以考虑对这些查询进行分布式调度。

选项 C:

  • 您还可以考虑使用 GCP Firestore 之类的技术,并在写入时间或读取时间写入查询结果,然后让 Firestore 处理分发。

您还可以组合这些选项并创建混合方法。

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2011-06-07
    • 2010-10-28
    • 2011-04-23
    相关资源
    最近更新 更多