【问题标题】:What are the strategies to send and retry a delayed API call?发送和重试延迟 API 调用的策略是什么?
【发布时间】:2017-05-25 05:38:21
【问题描述】:

我有一个运行 Ruby on Rails 应用程序的面向客户的网站。用户下订单并使用一系列后台 rake 任务同步到内部 ERP 系统。每 30 分钟一次。

我们正在重建内部系统,作为 RoR API 风格的应用程序,因此 Web 应用程序基本上只会在保存订单时向内部应用程序发送 api 调用。使用诸如 ActiveResource 或 ROAR & Delayed Job 之类的东西或其他东西。

但是,如果内部 API 由于某种原因出现故障 - 将客户订单保存在 Web 服务器上,然后在可用时将其同步到 API 的好策略是什么?这有点类似于 iPhone / Android 上发生的事情 - 它可以在本地保存信息并稍后将其同步到云 API。除了客户端是一个 RoR 服务器应用程序。有现成的解决方案吗?或者我应该实现自己的“保存到本地数据库 -> 返回时异步同步到 API”类型的解决方案?

  • Web 应用程序:RoR + jQuery 基本 CRUD 类型的应用程序,没什么花哨的。 位于公共云中。
  • 内部 API:- RoR + Trailblazer API,使用 MariaDB 集群位于内部数据中心,位于防火墙后面。

【问题讨论】:

    标签: ruby-on-rails api asynchronous


    【解决方案1】:

    是否有现成的解决方案?

    没有。

    或者我应该实现自己的“保存到本地数据库 -> 返回时异步同步到 API”类型的解决方案?

    是的。这是一个相对简单的小型项目。事实上,我昨天做了。只用了几个小时。

    对于本地存储,我使用 postgresql(我在 Heroku 上托管)。

    我使用NfpAdmin::ServiceRequest 记录来跟踪每次交易尝试的结果。它看起来像这样:

      # == Schema Information
      #
      # Table name: nfp_admin_service_requests
      #
      #  id               :integer          not null, primary key
      #  service_name     :string
      #  status           :string           default("created")
      #  percent_complete :integer          default(0)
      #  details          :jsonb            not null
      #  created_at       :datetime         not null
      #  updated_at       :datetime         not null
      #
    
      class NfpAdmin::ServiceRequest < ActiveRecord::Base
        serialize :details, HashSerializer
        validates :service_name,
                  :details,
                  presence: true
      end
    

    我使用 CloudAMQP 运行每晚的工作并拉取(自然而然地使用我的真实service_name):

      NfpAdmin::ServiceRequest.where(service_name: 'foo').where.not(status: 'complete')
    

    jsonb 列 (details) 中,我跟踪针对该服务请求、结果、错误消息等的每个尝试交易。

    目前,我从远程 API(第三方)接收推送消息并执行拉取请求。 API 允许从我的系统进行更新,但我的用例还没有要求这样做。

    我运行了一系列我自己的 API Web 服务,在其中进行双向数据交换。

    【讨论】:

    • 谢谢。你用什么做本地存储?您是如何同步的:1 路还是 2 路?
    • 太棒了。感谢您发布示例。很高兴看到您的想法得到了另一个人的验证:-)
    • 当然可以。如果它漂浮在您的船上,请随时接受答案。
    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多