【问题标题】:Load Braintree ClientToken asynchronously in rails app在 Rails 应用程序中异步加载 Braintree ClientToken
【发布时间】:2015-06-29 05:23:42
【问题描述】:

我目前正在使用gon gem 来加载braintree 中的client_token。

下面显示了控制器方法:

def new
    @rental_info = display_rental_info(params[:rental_request_new_form])
    @product = Product.find(params[:rental_request_new_form][:product_id])
    gon.client_token = generate_client_token
end

private

def generate_client_token
    Braintree::ClientToken.generate(customer_id: current_user.braintree_customer_id)
end

很快,我就意识到了这种方式的潜在问题。如果到 Braintree 的连接速度很慢,它只会保留请求并阻止所有其他请求。有时(在极少数情况下)加载请求需要 6-10 秒。有一次它实际上在等待 60 秒后导致 Net::OpenTimeout - execution expired 错误..

我想知道什么是解决这个问题并防止它阻塞其他请求的好方法

【问题讨论】:

  • 可以异步调用生成token。
  • 在 ajvascript 的前端?
  • 我怀疑是否可以使用 resque 或 sidekiq,因为生成前端时需要 gon 的输出
  • 那么你不能异步执行它 - 一个更好的问题是为什么 Braintree 需要这么长时间?

标签: ruby-on-rails braintree braintree-rails


【解决方案1】:

我在布伦特里工作。您看到的 ClientToken.generate 端点的响应时间对于我们的生产环境来说是不寻常的,但在我们的沙盒环境中可能会遇到。我建议您联系我们的support team 以进一步诊断此问题。

此外,在单个请求中调用 Braintree 不应阻止对您的 Web 服务器的其他请求。 Web 服务器同时处理多个请求。如果您尝试异步调用 ClientToken.generate,它将允许您在接收 Braintree 令牌时对此请求进行其他服务器端处理,但我会权衡在提交之前对单个请求进行并行处理的好处到额外的复杂性。

【讨论】:

    猜你喜欢
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2017-09-06
    • 2013-03-06
    • 2013-11-21
    相关资源
    最近更新 更多