【问题标题】:Synchronize tables in SpringBoot multitenant architectureSpringBoot多租户架构中的同步表
【发布时间】:2020-10-19 05:46:34
【问题描述】:

我有一个在多租户架构上运行的 SpringBoot 应用程序。

我有两个数据库 Admin 和 Client(都是 MySQL),这两个数据库都有一个 User 表

客户端可以将用户添加到用户表,但我需要他们在管理数据库的用户表中同步。

有什么方法可以实现吗?

我已经阅读了 flyway 迁移,但我认为它更适用于数据库架构更改而不是值。

请忽略我的错误,因为这是我的第一个问题,任何帮助将不胜感激。

【问题讨论】:

  • 问:您是否考虑过为您的客户“添加用户”使用触发器?
  • 我想过使用触发器,但是如何通知另一个数据库的触发器,因为我有两个不同的数据库?
  • 另外,有没有 Java 方法可以实现同样的效果?
  • 为什么需要两个独立的数据库?这是必须具备的功能吗?
  • 是的,先生,需要有单独的数据库

标签: java mysql spring-boot architecture multi-tenant


【解决方案1】:

这看起来像是解决您的问题的方法:

SymmetricDS 是在多个数据库之间复制关系数据库表的软件。它还可用于在多个主机之间复制文件和目录。它使用轻量级、基于 Web 的协议来发送和接收数据,这使得与防火墙一起工作变得容易。复制在后台异步完成,允许在离线模式下更改数据。它支持大多数商业和开源数据库平台。

它是如何工作的? 触发器安装在数据库中,以保证捕获数据更改。这意味着应用程序继续照常使用数据库,而无需任何特殊的驱动程序软件。触发器被编写为尽可能小且高效。在 SymmetricDS 进程中,数据的路由和同步在数据库之外完成。

SymmetricDS 支持许多数据库,并且可以跨不同的数据库进行复制,包括 Oracle、MySQL、MariaDB、PostgreSQL、MS SQL 等等。

https://www.symmetricds.org/docs/faq

【讨论】:

  • 您好,谢谢您的回答。但是没有其他软件,有没有 Java 方法可以做到这一点?
【解决方案2】:

您需要从客户端将用户添加到用户表的流程中创建一些事件。

如果这个“客户端”流在同一个 java 服务中,那么您可以使用 Spring 的异步事件处理或使用带有 @Async 标记的方法(执行数据复制)。这样可以确保数据复制发生在单独的线程中。

如果“客户端”流在不同的 java 服务中,则可以使用任何发布者-订阅者模型(一些可用的开源框架是 kafka、rabbitmq 等)。

现在要同时连接到两个数据源,Spring 的 RoutingDataSource 在这种情况下会派上用场,因为它使用“查找键”来选择数据源。或者你可以在你的配置中硬编码两个数据源bean(因为它在你的情况下是固定的)。

【讨论】:

  • 是的,先生,我知道如何使用 TenantContext 在数据库之间切换,但是我应该怎么做才能同步数据?
  • 我是否需要每次都在客户端数据库中的所有 getAllUsers() 并在 AdminDatabase 中执行相同的调用,Spring 中是否会有更多类似触发器的功能?
  • Spring 支持 CRON,但您可以做的就是利用 Spring Events
猜你喜欢
  • 2015-01-05
  • 2020-11-04
  • 2011-05-25
  • 2023-01-28
  • 1970-01-01
  • 2012-03-24
  • 2013-12-26
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多