Загрузите 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, но я бы взвесил преимущества распараллеливания обработки для одного запроса перед фиксацией. к дополнительной сложности.

Другие вопросы по тегам