2017-05-24 41 views
0

我有一个运行Ruby on Rails应用程序的面向客户的网站。用户下订单并使用一系列后台佣金任务将其同步到内部ERP系统。每30分钟一班。发送和重试延迟API调用的策略是什么?

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

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

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

回答

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服务,我在其中进行双向数据交换。

+0

谢谢。你用什么做本地存储?你是如何同步的:单向还是双向? – konung

+0

太棒了。感谢您发布示例。很高兴看到你的想法,由另一个人验证:-) – konung

+1

当然。如果它漂浮你的船,请随时接受答案。 – jvillian