流数据架构
Streaming data architecture
我想为我的以下项目设计最佳架构:我在任何设备(台式机、移动设备...)上都有一个应用程序 运行,用户可以在其中发布或接收与他们共享的其他用户的通知数据.
基本上,用户可以与其他用户分享他在应用程序上所做的事情,其他用户会实时收到更改通知,反之亦然。并且用户只能接收其他用户允许的通知。
例如,当用户在屏幕上移动小部件时,应用程序必须存储新的小部件位置,并实时通知其他用户这个新位置以在他们的屏幕上执行更改。对于这种需求,我会看到一个带有发布-订阅模式的事件驱动架构。但是,我想当应用程序需要检索用户列表以共享小部件时,我还需要处理同步请求-响应模式。
我快速浏览了 Streaming Data book by Manning,其中描述了流式数据架构,但我不知道这种架构是否符合我的需要。例如在实现部分的一个区别是事件源生产者也可以是我的应用程序中的事件消费者(在书中,事件源生产者是一个单独的 public 流 API 和真正的应用程序是唯一的消费者)
如果我稍微了解一下这本书,我的想法如下:用于数据摄取和数据访问的 WebSocket,类似代理的 Kafka 作为消息存储库,以及一个单独的分析服务,使用 Kafka 主题并将数据持久保存在数据库中。一个问题是我是否可以只使用一个 WebSocket 进行数据摄取和数据访问。
您会使用哪些详细的架构和工具来满足这些需求?
对于实现,我会考虑 javascript 用于客户端部分,Java 用于服务器部分。
这是 Kafka 的一个非常常见的用例(同时利用广播和存储元素)。这里有一些例子应该有所帮助,尽管上下文略有不同:
https://www.confluent.io/blog/building-a-microservices-ecosystem-with-kafka-streams-and-ksql/
在此示例中使用了 CQRS 模式,因此您对屏幕位置所做的更改将创建发送到 kafka 的事件,然后您创建一个视图服务,其他应用程序实例可以(长时间)轮询以获取更改。
您也可以使用 websocket 来实现。在 github 上有一些这样的实现,但我没有亲自尝试过其中的任何一个。一个复杂性是,如果你想扩展到许多节点,你需要一些方法来映射 Kafka 中的消息以打开 websockets(而在 REST 示例中映射到 kafka 分区的请求是自动处理的)。不过,开始使用单个服务器实现并不需要这种复杂性。
我想为我的以下项目设计最佳架构:我在任何设备(台式机、移动设备...)上都有一个应用程序 运行,用户可以在其中发布或接收与他们共享的其他用户的通知数据.
基本上,用户可以与其他用户分享他在应用程序上所做的事情,其他用户会实时收到更改通知,反之亦然。并且用户只能接收其他用户允许的通知。
例如,当用户在屏幕上移动小部件时,应用程序必须存储新的小部件位置,并实时通知其他用户这个新位置以在他们的屏幕上执行更改。对于这种需求,我会看到一个带有发布-订阅模式的事件驱动架构。但是,我想当应用程序需要检索用户列表以共享小部件时,我还需要处理同步请求-响应模式。
我快速浏览了 Streaming Data book by Manning,其中描述了流式数据架构,但我不知道这种架构是否符合我的需要。例如在实现部分的一个区别是事件源生产者也可以是我的应用程序中的事件消费者(在书中,事件源生产者是一个单独的 public 流 API 和真正的应用程序是唯一的消费者)
如果我稍微了解一下这本书,我的想法如下:用于数据摄取和数据访问的 WebSocket,类似代理的 Kafka 作为消息存储库,以及一个单独的分析服务,使用 Kafka 主题并将数据持久保存在数据库中。一个问题是我是否可以只使用一个 WebSocket 进行数据摄取和数据访问。
您会使用哪些详细的架构和工具来满足这些需求?
对于实现,我会考虑 javascript 用于客户端部分,Java 用于服务器部分。
这是 Kafka 的一个非常常见的用例(同时利用广播和存储元素)。这里有一些例子应该有所帮助,尽管上下文略有不同:
https://www.confluent.io/blog/building-a-microservices-ecosystem-with-kafka-streams-and-ksql/
在此示例中使用了 CQRS 模式,因此您对屏幕位置所做的更改将创建发送到 kafka 的事件,然后您创建一个视图服务,其他应用程序实例可以(长时间)轮询以获取更改。
您也可以使用 websocket 来实现。在 github 上有一些这样的实现,但我没有亲自尝试过其中的任何一个。一个复杂性是,如果你想扩展到许多节点,你需要一些方法来映射 Kafka 中的消息以打开 websockets(而在 REST 示例中映射到 kafka 分区的请求是自动处理的)。不过,开始使用单个服务器实现并不需要这种复杂性。