Database 在应用程序中更新实体时更新另一个数据库的高效设计

Database 在应用程序中更新实体时更新另一个数据库的高效设计,database,postgresql,database-design,architecture,orientdb,Database,Postgresql,Database Design,Architecture,Orientdb,我有一个应用程序(appa),它使用orientdb(DB#1)作为数据库。现在我们正在开发另一个应用程序(AppB),它使用PostgreSQL(DB#2)作为数据库 我们现在有一个要求,即我们需要在应用程序“B”中列出应用程序“a”的几个实体,并允许用户在应用程序B中修改这些实体。在应用程序“B”中对应用程序“a”的实体执行的所有更改都应反映在DB#1中。在与团队内部进行了一系列讨论之后,我们确信可以立即将所需的实体数据从db#1迁移到db#2,然后使用在db#1中创建/更新的记录动态更新d

我有一个应用程序(appa),它使用orientdb(DB#1)作为数据库。现在我们正在开发另一个应用程序(AppB),它使用PostgreSQL(DB#2)作为数据库

我们现在有一个要求,即我们需要在应用程序“B”中列出应用程序“a”的几个实体,并允许用户在应用程序B中修改这些实体。在应用程序“B”中对应用程序“a”的实体执行的所有更改都应反映在DB#1中。在与团队内部进行了一系列讨论之后,我们确信可以立即将所需的实体数据从db#1迁移到db#2,然后使用在db#1中创建/更新的记录动态更新db#2,反之亦然。 有人能提出有效的方法来保持db#1和db#2的同步吗

注:

  • 我们对实时同步db#1和db#2不感兴趣,最终的一致性对我们来说很好
  • Orientdb提供两种挂钩
    • 动态钩子(),它在模式级别工作,而不是跨数据库工作
    • Java hooks(),这需要您创建一个jar并将其放置在orientdb的lib文件夹中。我们排除了此选项,因为我们有多个orientdb实例运行在不同的区域,这意味着每次更新jar时,我们都需要更新oriendb的所有实例,调试可能会很困难,因为此jar在其中作为子进程运行oriendb
  • 我们考虑的一些方法:

  • 每当用户在应用程序“a”中创建/更新一个实体时,在db#1中创建/更新相应的记录,我们在db#1中更新它之后,在应用程序层(java)中,推送一个等效的Postgres sql查询,将db#2中的记录更新到一个持久队列中,并异步处理这些消息,反之亦然

  • 这是微服务架构中出现的一种经典模式,其中每个微服务应用程序都有自己的数据库,然后需要将该数据传递给其他服务。有多种方法:

  • 应用程序A直接更新应用程序B使用的数据库
  • 应用程序A调用应用程序B公开的web服务,然后该web服务更新应用程序B使用的数据库
  • 上述两种方法都会导致应用程序A和B之间的紧密耦合,这是不好的。如果应用程序B使用的数据库模式发生更改,则应用程序A也需要在上述两种方法中进行更新

    取而代之的是,在现代世界,在应用程序之间进行数据集成的标准和推荐方法是使用持久队列,如Kafka。在这种情况下,每当应用程序A接收到数据更新时,它就会将一个事件推送到带有数据的Kafka队列,而不管应用程序B是否接收到它。应用程序B订阅队列,当它接收到应用程序A推送的事件时,它更新自己的数据库

    通过这种方法,两个应用程序都是松散耦合的。维护这个卡夫卡基础设施需要一定的开销,但从长远来看,如果应用程序越来越大,这是值得的。如果Kakfa完全不是一个选项,那么方法2(通过webservices)比方法1或其他集成机制更好


    希望这能有所帮助。

    这是微服务体系结构中出现的一种经典模式,每个微服务应用程序都有自己的数据库,然后需要将数据传递给其他服务。有多种方法:

  • 应用程序A直接更新应用程序B使用的数据库
  • 应用程序A调用应用程序B公开的web服务,然后该web服务更新应用程序B使用的数据库
  • 上述两种方法都会导致应用程序A和B之间的紧密耦合,这是不好的。如果应用程序B使用的数据库模式发生更改,则应用程序A也需要在上述两种方法中进行更新

    取而代之的是,在现代世界,在应用程序之间进行数据集成的标准和推荐方法是使用持久队列,如Kafka。在这种情况下,每当应用程序A接收到数据更新时,它就会将一个事件推送到带有数据的Kafka队列,而不管应用程序B是否接收到它。应用程序B订阅队列,当它接收到应用程序A推送的事件时,它更新自己的数据库

    通过这种方法,两个应用程序都是松散耦合的。维护这个卡夫卡基础设施需要一定的开销,但从长远来看,如果应用程序越来越大,这是值得的。如果Kakfa完全不是一个选项,那么方法2(通过webservices)比方法1或其他集成机制更好


    希望这有帮助。

    你也可以考虑使用一个基于“方法”的解决方案,比如用一个外部工具。p>


    其原理是在数据库的bin日志中插入一些内容,这些内容将在数据更改时触发事件,然后您将实现监听器,负责在第二个数据库中复制更改。这种方法避免了对不同应用程序的显式耦合。

    ,您也可以考虑使用一个基于“方法”的解决方案。p>


    其原理是在数据库的bin日志中插入一些内容,这些内容将在数据更改时触发事件,然后您将实现监听器,负责在第二个数据库中复制更改。这种方法避免了显式耦合不同的应用程序。

    您考虑数据库级集成的具体原因是什么?您是否考虑过通过web服务或消息传递(jms)在应用程序级别进行同步?您考虑数据库级别集成的具体原因是什么?您是否考虑过通过web服务或消息传递(jms)在应用程序级别进行此同步?感谢您快速准确的回答!!作为后续问题,假设我正在使用Kafka,两个应用程序都以发布者和订阅者的身份订阅了不同的主题,以便两个应用程序都将其实体更改发布为事件,并并行使用事件(实体更改)