【问题标题】:Scaling Spring WebFlux with Tailable ReactiveMongo使用 Tailable ReactiveMongo 扩展 Spring WebFlux
【发布时间】:2020-07-20 19:13:03
【问题描述】:

我正在构建一个服务器发送事件端点,它将在很长一段时间内(1 小时以上)保持打开的连接,并持续实时发送事件。我正在使用响应式 Mongo 在所有应用程序实例之间共享所有数据库更新。据我在每个 HTTP 请求上看到的,一个新的 Mongo 连接是打开的。因为数据库连接池是有限的,所以这个不卖。使用默认设置在 500 个 http 请求(500 个打开的 SSE http 连接 => 500 个 DB 连接)时开始崩溃。

如何使用 Tailable 查询使其可扩展以处理每个实例 50000 多个并发 http 请求?奇怪的是,我没有在网上找到任何关于这个问题的信息。 java mongo 驱动程序中是否有内置功能可以在一个连接上共享查询?

简单地说,这是我正在测试的代码:一个简单的 GET 端点,它从 Tailable MongoDB 查询中返回一个 Flux 记录:

//controller endpoint
@GetMapping(value = "location/{id}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)    
Flux<Location> getLocationById(@PathVariable String id) {
    return locationsRepository.findById(id)
}

//repository
@Repository
public interface LocationsRepository extends ReactiveCrudRepository<Location,String> {
    @Tailable
    Flux<Location> findById(String id);
}

Mongo 有默认配置,当然location 是一个索引上限集合。

【问题讨论】:

    标签: mongodb scale spring-webflux reactive


    【解决方案1】:

    在尝试了不同的解决方案后,我设法使用 Redis-Streams 为该问题实施了一个完全可扩展的解决方案。每个 API 请求 {id} 将匹配 Redis-Streams 中的不同流。并且一个连续的 Redis Puller 将通过实时添加/删除 Streams 到查询中来从 Redis 中提取数据,同时事件流请求正在打开/关闭到 API。

    更多实现细节:https://medium.com/takeaway-tech/scaling-reactive-apis-764205866a5e

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2019-03-23
      • 2018-09-27
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多