首页 > 解决方案 > 具有响应式编程和流数据到客户端的可扩展事件驱动架构

问题描述

我是响应式编程的新手,我正在尝试学习 Spring WebFlux、响应式流等。我仍在尝试理解我无法在脑海中收集碎片的概念。

其实我有一个目的:

客户端可以通过 SSE(服务器端事件)或 WebSocket 连接到我的后端服务。(无法决定)

客户可以发送事件数据,我想实时处理事件。我想将业务逻辑与事件一起使用。如果我的业务逻辑正常工作,我想通知相关连接的客户端并向他们发送数据。

例子:

Client1:发送带有 userId、city、age 的事件

Client2:发送带有 userId、city、age 的事件

我的业务逻辑有效,我注意到他们在同一个年龄范围和同一个城市,我想通知他们,可能有很多客户,但只有 client1 和 client2 匹配。所以我可以向相关连接的客户发送数据. 当客户的事件相互触发时,应该有一个事件驱动的系统。(如果它不是一个事件驱动的系统,我应该检查它们是否应该匹配,就像客户端在某个时间间隔内要求一些我不想要的东西,因为它耗尽了服务器......)

所以我的问题是:我可以使用响应式编程来做到这一点吗?如果是我的业务逻辑有效,请发送相关连接的客户端来匹配事件!这样,其他连接的客户端不受影响。

我在互联网上查看并发现了这个:Tailable Cursor With WebFlux。

我能够做到 MongoDB 的保存事件,MongoDB 使用相关过滤器连续返回数据。如果插入了任何新文档,它会通过 Flux 通知。但我不知道这是否是一个好习惯,因为与 MongoDB 的连接将保持打开状态。

还有一个问题:如果我的应用程序扩展到 4-5 个实例,它应该相互通信并正确匹配!在我的示例中,client1 和 client2 应该连接到我的应用程序的同一个实例。否则,他们无法匹配,对吧?我认为,如果我在反应式编程中使用 Sink,它会存在于内存中。所以每个应用程序都将负责连接的客户端广告发布自己的订阅者,这会导致匹配错误或丢失。

可能使用 Reactive Redis 或 Reactive Apache Kafka ..?? Redis 保持在线用户,Kafka 使用密钥获取实例内的事件.. 像获取 cityId 和订单保证.. 我真的需要吗?

反应式微服务实际上被认为是事件驱动的解决方案吗?它们不只是提高传统请求-响应系统性能的一种方式吗?

很快,我想通过查看用户的事件来通知相关的连接客户端何时匹配彼此!使用可扩展的应用程序系统做到这一点..

我的头脑很困惑,任何帮助将不胜感激。谢谢!

标签: redisreactive-programmingspring-webfluxevent-driven-design

解决方案


推荐阅读