如何在其他端点提交新数据时实时仅返回新增项实现列表实时更新
两种思路可行性分析
- 思路a(对比两次全量查询的差集返回增量):可行但不推荐。该方案不需要额外依赖,实现门槛低,仅适合数据规模极小的测试场景。缺点很明显:数据量增长后全量查询、差集比对的开销会持续上升,固定1秒的轮询间隔也会带来最高1秒的推送延迟,资源利用率和实时性都很差。
- 思路b(监听数据插入事件直接推送增量):是该场景下的最优可行方案,实时性和资源消耗表现都远优于思路a,也是实时流推送场景的标准实现思路。
具体技术实现方案
核心逻辑是用一个全局可订阅的事件流桥接数据写入操作和SSE输出流:
- 先声明一个支持多订阅者的响应式事件处理器,比如Spring内置的
Sink.many().multicast().onBackpressureBuffer()作为新增歌曲的事件总线,所有客户端的SSE连接都可以订阅这个总线的事件。 - 改造
getAllSongs接口的返回逻辑:接口被调用后,先一次性返回repository.findAll()查询到的全量历史数据,再把上面的事件总线流拼接在全量数据之后,保持SSE连接不中断。 - 改造
addSong接口:歌曲保存到数据库成功后,将新增的歌曲对象发送到事件总线中,所有已订阅的客户端都会实时收到这条增量数据。
如果你的项目使用的是R2DBC这类响应式数据库,还可以直接对接数据库的CDC(变更数据捕获)能力监听插入事件,不用手动改造addSong接口发送事件,也能覆盖其他非接口写入的数据变更场景。如果你的服务是分布式部署的,可以用Redis发布订阅、Kafka这类消息中间件替代内存事件总线,避免单节点事件无法跨实例同步的问题。
内容的提问来源于stack exchange,提问作者MrFisherman
相关产品推荐
相关产品推荐

