Загрузите Braintree ClientToken в приложении rails асинхронно
Я сейчас пользуюсь gon
gem для загрузки client_token в braintree.
Ниже показаны методы контроллера:
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 секунд. И однажды это на самом деле приводит к Net::OpenTimeout - execution expired
ошибка после ожидания 60 секунд..
Интересно, что является хорошим способом обойти это и предотвратить блокирование других запросов
1 ответ
Я работаю в Брэйнтри. Время отклика, которое вы видите для нашей конечной точки ClientToken.generate, необычно для нашей производственной среды, но может иметь место в нашей среде песочницы. Я бы посоветовал вам обратиться в нашу службу поддержки для дальнейшей диагностики этой проблемы.
Кроме того, обращение к Braintree в одном запросе не должно блокировать другие запросы к вашему веб-серверу. Веб-серверы обрабатывают несколько запросов одновременно. Если вы попытаетесь сделать асинхронный вызов ClientToken.generate, это позволит вам выполнять другую обработку на стороне сервера для этого запроса во время получения токена Braintree, но я бы взвесил преимущества распараллеливания обработки для одного запроса перед фиксацией. к дополнительной сложности.