Spring Boot 数据库轮询或监听数据库更新

Sprint boot database polling or listen database updates

我有 2 个 Spring Boot 应用程序假设名为 App1App2。在带有状态列的 oracle DB 中有一个 table。当 App1 运行调度程序时,它将将该状态列更新为 ON 或 OFF。

App2(with multiple instances) 是一个 Kafka 消费者应用程序,无论何时消费一个事件,它需要来自 oracle 的状态值来执行某些操作。我不想每次应用程序使用事件时都调用 oracle db,在初始应用程序加载时,我想从数据库中获取状态值并将该值保存在应用程序上下文(内存中)中,这样我就不需要进行数据库调用。

但现在的问题是,在将状态值保存在内存中的同时,App2 如何知道何时状态值在 oracle table 中更新(App1 更新了 table)。 它也需要在应用程序上下文中更改该值。

我怎样才能做到这一点,在 spring 引导中是否有任何 oracle table 更改侦听器或从数据库轮询数据是一个好方法??。

任何建议都会有所帮助。

注: : 这个table每天只更新4-5次。

听起来比你描述的更简单

With initial application load I thought of fetching status value from DB and keeping that value in application context(in-memory) so that I don't need to make db calls.

App2 中公开另一个端点,当调用它时,它会更新它用于状态列的值,该值是在应用程序启动时初始加载的。此端点应从 App1 的调度程序调用,即调用 DB 中的更改的调度程序。

所以从简单的意义上说,App1 说嘿 App2 实例我刚刚在数据库中做了一些更改。请从数据库更新您使用的状态,以便您的交易是最新的。

编辑: 如果您负担得起拥有如此复杂的基础设施,您可以看看 spring-cloud-bus 来广播多项服务的变化。

您可以让 App1 向特定主题发送事件,让 App2 知道某些内容已更改并相应地更新其内部状态。

请注意,每个实例都必须在其自己的消费者组中,以便所有实例都可以侦听同一事件 - 您可以分配一个随机 UUID 作为消费者组。

此外,这应该非常快,但不能保证您不会获得一些过时状态的记录。无论如何,在分布式系统中,您通常应该拥抱最终一致性,而不是试图让它表现得像一个整体。

如果你不能让 App1 发送事件,有 Debezium https://debezium.io/ 之类的工具可以监听 DB 并向 Kafka 发送事件,但这可能有点矫枉过正。

另一种方法是使用分布式缓存(例如 Redis),让 App1 更新它,App2 每次都检查它,这应该比去 DB 的性能更高。