【问题标题】:Spring Integration polling inbound-channel-adapter on multiple serversSpring Integration 在多个服务器上轮询入站通道适配器
【发布时间】:2015-01-14 15:48:58
【问题描述】:

我们有一个 Spring Integration 应用程序,它像这样轮询 mongodb:inbound-channel-adapter

<int-mongodb:inbound-channel-adapter channel="n2s.mongoResults"
                                     collection-name="entities"
                                     query="{_id: {$regex: 'mpl/objectives'}})">
    <!-- Run every 15 minutes -->
    <int:poller fixed-rate="900000"/>
</int-mongodb:inbound-channel-adapter>

一切正常。但是,此应用程序部署到集群中,因此多个服务器运行同一个轮询器。我们希望协调这些服务器,以便只有一个服务器运行管道。

当然,服务器不知道彼此,所以我们可能需要通过数据库中的锁定机制来协调它们。关于如何实现这一点的任何建议?

注意事项:

在此工作流程中,我们可以同时访问 MongoDB 数据库和 Oracle 数据库。从工作流的角度来看,锁定Oracle数据库更有意义。

如果所有服务器都执行轮询步骤,然后一个服务器锁定以实际处理记录,那很好,如果这更容易实现的话。

【问题讨论】:

    标签: java spring oracle mongodb spring-integration


    【解决方案1】:

    关于如何实现这一点的任何建议?

    您可以使用像 Zookeeper 这样的分布式锁定工具。另一种选择是从简单的固定触发器更改为像 Quartz 这样的调度框架,这将确保作业仅在单个节点上执行。

    如果所有服务器都执行轮询步骤然后一台服务器就可以了 锁来实际处理记录,如果这更容易实现的话。

    是的,这就是我会做的。我认为这是迄今为止最简单的方法。见this post for details on how to do locking with Oracle

    【讨论】:

      【解决方案2】:

      有多种选择,包括:

      设置auto-startup="false" 并使用一些管理工具来监控服务器并确保只有一个适配器正在运行(您可以使用control-bus 或JMX 来启动/停止适配器。

      在 SpringXD 容器中运行应用程序;设置源的模块计数(包含 mongo 适配器),XD 管理员将确保实例正在运行。它使用 Zookeeper 来管理状态。

      使用分布式锁确保只有一个实例处理消息。 Spring Integration 本身带有RedisLockRegistry 用于此类事情,或者您可以使用任何分布式锁机制。

      【讨论】:

        猜你喜欢
        • 2019-12-04
        • 2014-06-29
        • 2012-11-03
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 2016-11-17
        • 2017-10-08
        相关资源
        最近更新 更多