Запросы Twilio API требуют слишком много времени для ответа при отправке с помощью Twilio Java Helper Library - PullRequest
0 голосов
/ 10 июля 2019

Мы используем Twilio Task Router для функции маршрутизации вызовов в нашем веб-проекте (приложение Java 8, работающее на Tomcat 9).Мы используем Twilio Java SDK (https://mvnrepository.com/artifact/com.twilio.sdk/twilio/7.36.2) для выполнения запросов к API Twilio. Когда мы тестировали наше приложение, выяснилось, что Twilio занимает много времени, чтобы отвечать почти на все запросы API, отправленные в течение 1 часа. Время отклика составляет более 10 минут для нескольких проанализированных выборочных запросов.

Следы журналов для одного такого запроса приведены ниже. В этой трассировке журнала обнаружено, что 10-минутная задержка произошла после выполнениястрока с надписью «Connection request: [route: {s}->https://taskrouter.twilio.com:443][total kept alive: 0; route allocated: 10 of 10; total allocated: 10 of 20]». Согласно нашему анализу, эта трассировка происходит из библиотеки Apache HttpClient, которая является частью Twilio SDK. Следующая трассировка: «Connection leased: [id: 3492][route: {s}->https://taskrouter.twilio.com:443][total kept alive: 0; route allocated: 10 of 10; total allocated: 10 of 20]», которая приходит через 10 минут, также от Apache HttpClient.Согласно http-исходящей трассировке в журнале ниже, Twilio-Request-Duration составляет всего 27 миллисекунд. Следовательно, мы предполагаем, что задержка в 10 минут произошла внутри SDK, а не с сервера Twilio. Пожалуйста, помогите нам решить эту проблему. Спасибозаранее.

| DEBUG | 2019-07-09 10:31:22.688 | https-jsse-nio-8443-exec-342 | TwilioCommandExecutor:38 | Executing Twilio command
| DEBUG | 2019-07-09 10:31:22.688 | https-jsse-nio-8443-exec-342 | RequestAddCookies:123 | CookieSpec selected: default
| DEBUG | 2019-07-09 10:31:23.756 | https-jsse-nio-8443-exec-342 | RequestAuthCache:77 | Auth cache not set in the context
| DEBUG | 2019-07-09 10:31:23.772 | https-jsse-nio-8443-exec-342 | PoolingHttpClientConnectionManager:265 | Connection request: [route: {s}->https://taskrouter.twilio.com:443][total kept alive: 0; route allocated: 10 of 10; total allocated: 10 of 20]
| DEBUG | 2019-07-09 10:41:39.018 | https-jsse-nio-8443-exec-342 | PoolingHttpClientConnectionManager:309 | Connection leased: [id: 3492][route: {s}->https://taskrouter.twilio.com:443][total kept alive: 0; route allocated: 10 of 10; total allocated: 10 of 20]
| DEBUG | 2019-07-09 10:41:39.020 | https-jsse-nio-8443-exec-342 | DefaultManagedHttpClientConnection:88 | http-outgoing-3492: set socket timeout to 0
| DEBUG | 2019-07-09 10:41:39.020 | https-jsse-nio-8443-exec-342 | DefaultManagedHttpClientConnection:88 | http-outgoing-3492: set socket timeout to 30500
| DEBUG | 2019-07-09 10:41:39.020 | https-jsse-nio-8443-exec-342 | MainClientExec:256 | Executing request POST /v1/Workspaces/WSd9f51d1692a76faa3079514c2a89197c/Workers/WK9cacec1e7285f98519152316bac03de8 HTTP/1.1
| DEBUG | 2019-07-09 10:41:39.021 | https-jsse-nio-8443-exec-342 | MainClientExec:267 | Proxy auth state: UNCHALLENGED
| DEBUG | 2019-07-09 10:41:39.021 | https-jsse-nio-8443-exec-342 | headers:133 | http-outgoing-3492 >> POST /v1/Workspaces/WSd9f51d1692a76faa3079514c2a89197c/Workers/WK9cacec1e7285f98519152316bac03de8 HTTP/1.1
| DEBUG | 2019-07-09 10:41:39.096 | https-jsse-nio-8443-exec-342 | wire:73 | http-outgoing-3492 << "HTTP/1.1 200 OK[\r][\n]"
| DEBUG | 2019-07-09 10:41:39.105 | https-jsse-nio-8443-exec-342 | wire:73 | http-outgoing-3492 << "Date: Tue, 09 Jul 2019 14:41:39 GMT[\r][\n]"
| DEBUG | 2019-07-09 10:41:39.106 | https-jsse-nio-8443-exec-342 | wire:73 | http-outgoing-3492 << "Content-Type: application/json[\r][\n]"
| DEBUG | 2019-07-09 10:41:39.106 | https-jsse-nio-8443-exec-342 | wire:73 | http-outgoing-3492 << "Content-Length: 1891[\r][\n]"
| DEBUG | 2019-07-09 10:41:39.106 | https-jsse-nio-8443-exec-342 | wire:73 | http-outgoing-3492 << "Connection: keep-alive[\r][\n]"
| DEBUG | 2019-07-09 10:41:39.131 | https-jsse-nio-8443-exec-342 | headers:125 | http-outgoing-3492 << Twilio-Request-Duration: 0.027
| DEBUG | 2019-07-09 10:41:39.133 | https-jsse-nio-8443-exec-342 | MainClientExec:285 | Connection can be kept alive indefinitely
| DEBUG | 2019-07-09 10:41:39.134 | https-jsse-nio-8443-exec-342 | PoolingHttpClientConnectionManager:341 | Connection [id: 3492][route: {s}->https://taskrouter.twilio.com:443] can be kept alive indefinitely
| DEBUG | 2019-07-09 10:41:39.137 | https-jsse-nio-8443-exec-342 | DefaultManagedHttpClientConnection:88 | http-outgoing-3492: set socket timeout to 0
| DEBUG | 2019-07-09 10:41:39.424 | https-jsse-nio-8443-exec-342 | PoolingHttpClientConnectionManager:348 | Connection released: [id: 3492][route: {s}->https://taskrouter.twilio.com:443][total kept alive: 1; route allocated: 10 of 10; total allocated: 10 of 20]
| DEBUG | 2019-07-09 10:41:39.424 | https-jsse-nio-8443-exec-342 | TwilioCommandExecutor:40 | Twilio command executed successfully

1 Ответ

1 голос
/ 12 июля 2019

Разработчик Twilio здесь.

Согласно вашему комментарию, вы сделали около 25 000 запросов API за 15 минут. Это примерно 27 запросов в секунду. Сам Twilio имеет ограничение в 100 одновременных подключений, но библиотека Java Twilio имеет пул из 20 объектов HTTP-соединений. Если вы бросаете все 25 000 запросов в библиотеку за один ход, то она начнет с первых 20 запросов, использующих пул, и выполнит их. Как только каждый запрос освобождает соединение, будет сделан следующий запрос. В конечном итоге это означает, что последний из 25 000 запросов должен будет ждать выполнения предыдущих 24 999, что приведет к 10-минутной задержке.

Если размер пула соединений недостаточно велик, вы можете предоставить свой собственный HTTPClient для библиотеки. Вы можете увидеть существующую реализацию NetworkHTTPClient, которая, вероятно, является хорошей моделью, на которой будет основываться ваша собственная реализация. ограничения пула соединений здесь реализованы . Обратите внимание, что создание пула соединений больше 100 приведет к ошибкам API при превышении разрешенного одновременного использования. Если вам нужно учесть более высокие лимиты API, я рекомендую вам поговорить с отделом продаж Twilio о ваших потребностях.

В качестве альтернативы, вы можете подумать, желательно ли столько запросов в такой короткий промежуток времени. Если есть возможность группировать запросы по-разному и совершать вызовы в разное время, вы можете избежать этого уровня очереди запросов.

Дайте мне знать, поможет ли это вообще.

...