1

我想为我的以下项目设计最佳架构:我有一个在任何设备(台式机、移动设备......)上运行的应用程序,用户可以在其中发布或接收与其他用户共享数据的通知。

基本上,用户可以与其他用户共享他在应用程序上所做的事情,实时通知其他用户更改,反之亦然。并且用户只能接收其他用户允许的通知。

例如,当用户在屏幕上移动小部件时,应用程序必须存储新的小部件位置,并实时通知其他用户这个新位置以在他们的屏幕上执行更改。对于这种需求,我会看到一个具有发布-订阅模式的事件驱动架构。但是,我想当应用程序需要检索用户列表以共享小部件时,我还需要处理同步请求-响应模式。

我快速浏览了 Manning 的 Streaming Data book,其中描述了流数据架构,但我不知道这种架构是否适合我的需求。例如在实现部分的一个区别是事件源生产者也可以是我的应用程序中的事件消费者(在书中,事件源生产者是一个单独的公共流 API,真正的应用程序是唯一的消费者)

如果我遵循这本书的想法,我的想法如下:用于数据摄取和数据访问的 WebSocket,作为消息存储库的类似代理的 Kafka,以及使用 Kafka 主题并将数据持久保存在数据库中的单独分析服务。一个疑问是我是否只能使用一个 WebSocket 来进行数据摄取和数据访问。

您将使用哪些详细的架构和工具来满足这些需求?

对于实现,我会考虑将 javascript 用于客户端部分,将 Java 用于服务器部分。

4

1 回答 1

1

这是 Kafka 的一个非常常见的用例(同时利用广播和存储元素)。尽管上下文略有不同,但这里有一些示例应该有所帮助:

https://github.com/confluentinc/kafka-streams-examples/tree/4.0.0-post/src/main/java/io/confluent/examples/streams/microservices

https://www.confluent.io/blog/building-a-microservices-ecosystem-with-kafka-streams-and-ksql/

在此示例中使用了 CQRS 模式,因此您对屏幕位置所做的更改将创建发送到 kafka 的事件,然后您创建一个视图服务,其他应用程序实例可以(长)轮询以获取更改。

您也可以使用 websocket 来实现它。github上有一些实现,但我个人没有尝试过。一个复杂性是,如果你想扩展到许多节点,你需要一些方法来映射 Kafka 中的消息以打开 websockets(而在 REST 示例中将请求映射到 kafka 分区是自动处理的)。不过,开始使用单个服务器实现不需要这种复杂性。

于 2018-01-02T13:32:44.557 回答