【问题标题】:Spring Integration - Sharing lock across stepsSpring Integration - 跨步骤共享锁
【发布时间】:2018-02-13 08:44:58
【问题描述】:

我有以下设置:许多设备通过 HTTP 将数据发送到我的后端,其中一个接收器组件正在运行多个实例。我需要处理数据,然后将其发送给另一个外部合作伙伴,该合作伙伴需要这些数据按时间戳顺序。所以我想出了以下架构:

  1. 有 n 个接收器实例正在运行,它们前面有一个负载均衡器,因此它们有可能从所有设备获取数据。这些实例通过添加一些信息来处理每个传入的数据,然后将数据放入 Redis 排序集(每个设备都有一个)。在此之后,他们会发送一条消息(通过 Redis),说明当前集合中有多少数据条目。

  2. 有 m 个处理实例,其任务是将数据发送到外部伙伴。他们监听接收者发送的消息,如果集合中的条目数大于某个阈值,他们从队列中检索数据,添加一些其他信息,然后将其发送给外部伙伴。

我遇到的问题是时间戳顺序要求。我有 n 和 m 个实例,每个实例都运行多个线程。对于所有从接收者接收消息的处理实例,我考虑从集合中检索数据并将其发送到共享 Redis 锁内的外部合作伙伴,用于与消息关联的队列(以及相应的设备)。但是目前有多个 Spring Integration 步骤是处理流程的一部分:从队列中获取数据 -> 将其转换为发送 -> 通过 HTTP 出站通道发送。我考虑过使用在第一步中获得的锁(从队列中获取数据)并在最后一步中释放(在通过出站通道发送之后)。如果发生错误,锁将在错误处理步骤中被释放。

有什么替代方案的想法吗?我正在考虑通过剩余的流程将锁作为消息头的一部分发送,然后在最后释放它。

【问题讨论】:

    标签: java spring multithreading locking spring-integration


    【解决方案1】:

    既然您说的是订购,您应该考虑在发送给外部合作伙伴之前使用PriorityChannelResequencer 重新订购记录。 两者都可以配置共享MessageStore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      相关资源
      最近更新 更多