【问题标题】:Streaming data architecture流式数据架构
【发布时间】:2018-05-24 04:17:04
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 多个用户是否可以编辑同一个屏幕,例如 Google Docs?还是只有一个用户是特定屏幕的“作者”,而所有其他用户都只是“读者”?
  • @AdiLevin 所有用户都可以编辑。

标签: java architecture real-time event-driven-design


【解决方案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 分区是自动处理的)。不过,开始使用单个服务器实现不需要这种复杂性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2014-06-27
    • 2016-08-02
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多