代码之家  ›  专栏  ›  技术社区  ›  Erratic

如何最好地集成多个系统?

  •  9
  • Erratic  · 技术社区  · 16 年前

    好吧,在我工作的地方,在过去的几十年里,我们已经编写了相当多的系统。

    系统是多种多样的,使用多个操作系统(Linux、Solaris、Windows)、多个数据库(Oracle、Sybase和MySQL的多个版本),甚至使用多种语言(C、C++、JSP、PHP和其他主机)。

    每个系统都是相当自治的,即使是以将相同的数据输入多个系统为代价。

    管理层最近决定,我们应该调查如何让所有的系统愉快地相互交谈和共享数据。

    请记住,虽然我们可以对任何单个系统进行软件更改,但对任何一个系统(或多个系统)进行完全重写并不是管理层所能享受的。

    这里几个开发人员的第一个想法是直截了当的:如果系统A需要来自系统B的数据,它应该只连接到系统B的数据库并获取数据。同样,如果它需要提供B数据,它应该将其插入B的数据库。

    由于使用了混乱的数据库(和版本),其他开发人员认为我们应该有一个新的数据库,将所有其他系统的表组合在一起,以避免需要处理多个连接。通过这样做,他们希望我们能够合并一些表并消除冗余的数据输入。

    这是我被请来对整个混乱局面发表意见的时候了。

    把数据库作为系统通信手段的整个想法对我来说很有趣。业务逻辑必须放在多个系统中(如果系统A希望在系统B中添加数据,那么在执行插入操作之前更好地了解B关于数据的规则),多个系统很可能需要执行某种形式的数据库轮询来查找其数据的任何更改,继续维护将是一个头疼的问题,因为对数据库模式现在传播多个系统。

    我的第一个想法是花时间为不同的系统编写API/服务,一旦编写了这些API/服务,就可以很容易地用于来回传递/检索数据。许多其他的开发人员觉得这是过度的,远远超过仅仅使用数据库的工作量。

    那么,让这些系统相互通信,最好的方法是什么呢?

    6 回复  |  直到 16 年前
        1
  •  8
  •   user19113    16 年前

    集成不同的系统是我的日常工作。

    如果我是你,我会尽最大努力避免直接从系统B访问系统A的数据。 更新 系统A的数据库来自系统B是非常不明智的。使您的业务逻辑如此分散恰恰与良好实践相反。你会后悔的。

    中央数据库的概念并不一定是坏的…但是所涉及的工作量可能在从头重写系统的数量级之内。这肯定不是我想尝试的,至少以你描述的形式。它可以成功,但比点对点集成方法更困难,需要更多的规则。很有趣的是,听到它和“牛仔式”的直接将数据推送到其他系统的方法是一样的。

    总的来说,你的直觉很好。有几种方法。您提到一个:实现服务。这不是一个糟糕的方法,特别是如果你需要实时更新。另一个是一个单独的集成应用程序,负责处理周围的数据。这是我通常采用的方法,但通常是因为我无法更改正在集成的系统来请求它所需的数据;我必须将数据推入。在您的案例中,服务方法并不糟糕。

    我想说的一件事,对于第一次进入系统集成的人来说,可能并不明显,那就是系统中的每一个数据都应该有一个单一的、权威的事实点。如果数据是重复的(并且是重复的),并且副本之间不一致,那么必须将数据的真实副本视为正确副本。如果没有复杂度以指数级的速度向上尖叫,就没有其他方法可以集成系统。意大利面集成就像意大利面代码,应该不惜一切代价避免。

    祝你好运。

    编辑:

    中间件解决了传输问题,但这不是集成中的核心问题。如果系统之间的距离足够近,一个应用程序可以直接将数据推送到另一个应用程序,那么它们之间的距离可能足够近,一个应用程序提供的服务可以由另一个应用程序直接调用。在您的案例中,我不推荐中间件。您可能会从中获得一些好处,但这将被日益增加的复杂性所抵消。你需要一次解决一个问题。

        2
  •  4
  •   Forgotten Semicolon adrianm    16 年前

    听起来你可能想调查一下 Message Queuing message-oriented middleware .

    MSMQ Java Message Service 就是例子。

        3
  •  0
  •   Haabda    16 年前

    看来你在征求意见,所以我会提供我的意见。

    我同意其他开发人员的观点,即为所有不同的系统编写API是多余的。如果采纳创建单个数据库的其他建议,您可能会更快地完成任务,并对其拥有更多的控制权。

        4
  •  0
  •   community wiki mbesso    16 年前

    您将面临的一个挑战是将每个不同系统中的数据对齐,以便在第一时间将其集成。可能是要集成的每个系统都包含完全不同的数据集,但更可能是重叠的数据。在开始编写api:s(这是我将采用的路线,并给出您的描述)之前,我建议您尝试为需要集成的数据建立一个逻辑数据模型。然后,此数据模型将帮助您利用不同系统中的数据,使其对其他数据库更有用。

    我还强烈推荐一种迭代的集成方法。对于遗留系统来说,存在着太多的不确定性,试图一次性设计和实现这些系统太冒险了。从小处做起,努力建立一个合理集成的系统。”“完全整合”几乎不值得瞄准。

        5
  •  0
  •   Jaywalker    16 年前

    通过推/戳数据库直接接口将一个系统的许多内部细节暴露给另一个系统。有明显的缺点:升级一个系统会破坏另一个系统。此外,在一个系统如何访问另一个系统的数据库方面可能存在技术限制(考虑在UNIX上用C编写的应用程序如何与在Windows2003服务器上运行的SQL Server2005数据库交互)。

    首先你要决定的是“master数据库”将驻留在哪个平台上,对于提供非常需要的粘合的中间件也是如此。我建议您考虑使用面向消息的中间件,而不是使用API级中间件集成(如CORBA)。Biztalk女士、Sun的Egate和Oracle的Fusion是其中的一些选择。

    您对新数据库的想法是朝着正确的方向迈出的一步。你可能想读点关于 Enterprise Entity Aggregation 模式。

    将“数据集成”与中间件相结合是一种可行的方法。

        6
  •  0
  •   Salman Kasbati    16 年前

    如果您打算采用中间件+单中心数据库策略,您可能需要考虑在多个阶段实现这一点。这是一个逻辑步骤,可以考虑:

    1. 为不同的系统实现服务/API,这些系统公开每个系统的功能
    2. 中间件的实现,它访问这些API并向所有系统提供接口,以便从其他系统访问数据/服务(如果可用,从中心源访问数据,否则从其他系统获取数据)
    3. 仅实现中央数据库,无数据
    4. 中间件级缓存/数据存储服务的实现,当从任何系统访问数据时,可以将数据存储/缓存在中央数据库中,例如,如果系统A的记录1-5是由系统B通过中间件获取的,中间件数据缓存服务可以将这些记录存储在中央数据库和下次从中央数据库中提取这些记录时
    5. 数据清理可以并行进行
    6. 您还可以创建导入机制,每天将数据从多个系统推送到中央数据库(自动或手动)

    通过这种方式,工作分布在多个里程碑上,数据在第一次访问第一次存储的基础上逐渐存储在中央数据库中。