发送和重试延迟API调用的策略是什么?

时间:2017-05-24 20:24:53

标签: ruby-on-rails api asynchronous

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

我们正在重建内部系统,作为RoR API样式的应用程序,因此Web应用程序基本上只会在保存订单时向内部应用程序发送api调用。使用类似ActiveResource或ROAR&延迟工作或其他。

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

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

1 个答案:

答案 0 :(得分: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服务,我在其中进行双向数据交换。