【问题标题】:Camel route POSTs to service that takes 20+ minutes to respondCamel 将 POST 路由到需要 20 多分钟才能响应的服务
【发布时间】:2016-08-03 21:18:20
【问题描述】:

我有一个 Apache Camel(版本 2.15.3)路由,配置如下(使用 XML 和 Java DSL 的混合):

  1. 从 FTP 站点上的多个文件夹之一读取文件。
    • 设置一个标头以指示它是从哪个文件夹读取的。
  2. 进行一些处理和审核。
  3. 同步 POST 到外部 REST 服务(jax-rs 1.1、Glassfish、Java EE 6)。
    • REST 服务需要很长时间才能完成工作,20 多分钟。
  4. 收到回复。
  5. 进行更多处理和审核。
  6. 将响应写入 FTP 站点上的多个文件夹之一。
    • 使用开头设置的标头知道要写入哪个文件夹。

所有这些都配置在链式路由的单个路径中。

问题在于,当服务仍在处理时,与外部 REST 服务的连接将超时。基础设施有点复杂(边缘服务器、负载平衡器、Glassfish),无论如何我认为增加超时不是正确的解决方案。

我怎样才能实现这条路线,以避免超时,同时仍然满足我的所有要求:(1) 将响应写入适当的 FTP 文件夹,(2) 审核事务,以及 (3) 满足其他事务/上下文-具体要求?

我对 Camel 和 REST 比较陌生,所以也许这很简单,但我不知道要使用哪些 Camel 和 REST 工具和技术。

(欢迎提出问题和改进建议。)

【问题讨论】:

    标签: web-services rest apache-camel


    【解决方案1】:

    难道不能把两个主要步骤分成一个部分,进行两个异步操作吗?

    我会这样做。

    1. 从 FTP 站点上的多个文件夹之一读取文件。
    2. 设置一个标头以指示它是从哪个文件夹读取的。
    3. 将标题和文件名以及其他相关信息保存在缓存中。有一个名为 camel-cache 的骆驼组件,它相对容易设置,您可以存储键值或任何其他对象。
    4. 做一些处理和审计。 异步 POST 到外部 REST 服务(jax-rs 1.1、Glassfish、Java EE 6)。请注意,我们在这里是异步发布的。

    第 2 步。

    1. 收到回复。
    2. 在缓存中查找回复标识符(即文件名或其他标识符)以匹配回复,然后获取标头。
    3. 进行更多处理和审核。
    4. 将响应写入 FTP 站点上的多个文件夹之一。

    这样,您无需等待,处理可能需要 20 分钟或更长时间。您只需将缓存值设置为不会过期 24 小时。

    【讨论】:

    • 如果我们异步发帖,骆驼怎么会收到回复呢?我会使用rest component 在 Camel 上实现 REST 端点吗?
    • 是的,您需要公开一个 REST 端点来接收回复。更多的工作,但更容易维护,因为您摆脱了超时和必须保持这么长时间的连接。
    • @DavidS 这是缓存组件。 camel.apache.org/cache.html
    【解决方案2】:

    这是一个典型的异步用例。其他服务可以在你点击它们后立即给你一个令牌 id 或一些唯一的 id 吗?

    这样您就可以进行批处理作业或其他一些骆驼路线,它们将从数据库/缓存中获取此 ID,并在 20 分钟后再次访问其余服务。

    这是我能想到的理想解决方案,如果其余服务可以提供这个。

    你是对的,在同步呼叫上等待 20 分钟是一个疯狂的想法。另外,您计划发布到其余服务的文件/有效负载的估计大小是多少?

    【讨论】:

    • 文件/有效负载包含记录列表,因此大小与列表中的项目数成正比。我希望一个典型的文件在 1 到 10MB 之间,但没有逻辑限制。
    • 10 MB 听起来不错,但这取决于并发 10 MB 文件的数量。这个 10 MB 的文件是不是每天只有一个?否则,考虑文件流式传输,幸运的是您使用的是 FTP,骆驼应该能够逐行流式传输文件!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多