AFNetworking: странная работа с балансировкой нагрузки/хостингом/перенаправлением серверов

Итак, эту проблему так сложно описать вкратце, и я чувствую, что должен сначала спросить здесь, прежде чем поднимать проблему в AFNetworking github. Вот история:

// Definition for words in the story.

Characters:
- APP: Our iOS app, which POST requests to a URL's API (has user input from a UITextField)
       APP's networking connection using framework AFNetworking 3.0
- DEV: Us developers, who created the iOS app.
- CUST: The troublesome customer, who live far from DEV.
        CUST used app before, then one day it doesn't work anymore (S1 has died).

Server:
- S1: The CUST's primary server (died for some reasons). This has the IP address = ip1
- S2: The CUST's secondary server (works fine). This has the IP address = ip2
- URL: The domain URL point to both server (using load balancing or something like that, I dunno).

// End-of-definition

Начало истории:

CUST используйте приложение, введите URL, соединение не удалось. CUST введите URL в браузере iPad, доступ нормальный. CUST попросите DEV проверить, что произошло. DEV введите URL в приложении, подключитесь нормально. В то время DEV не знает, что у CUST есть 2 сервера.

И CUST, и DEV в отчаянии, уже несколько раз борются. CUST пробовал все, что мог (использовал https/http, добавлял/удалял www, удалял приложение и переустанавливал). DEV отвлекся по необоснованным причинам (ошибка коннектора, ошибка API...). Затем CUST помнит, что у него 2 сервера. CUST поделился IP addresses для DEV для проверки. Именно тогда DEV узнает, что S1 умер, а S2 нет.

Итак, DEV понял причину, по которой CUST не может получить доступ к URL с помощью APP: S1 умер. Тем не менее, вот реальный вопрос для SO:

Почему у нас это работает, а у CUST нет? Почему APP (в руке DEV) идет к S2, а в руке CUST идет к S1 (и умер)? Но почему CUST заходит на URL через браузер iPad?

Это как-то связано с DNS? VPN? Балансировки нагрузки? Я хотел бы иметь причину для этой проблемы.

Спасибо за чтение. Не стесняйтесь редактировать этот вопрос, так как я также изо всех сил пытался описать это как можно проще.

ОБНОВЛЕНИЕ 1:

Когда James Jayson спрашивает, как APP подключиться к URL, он использует AFNetworking 3.0 с AFHTTPSessionManager с некоторой настройкой:

self.sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseUrl sessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
self.sessionManager.securityPolicy.allowInvalidCertificates = YES;
self.sessionManager.securityPolicy.validatesDomainName = NO;
self.sessionManager.requestSerializer.timeoutInterval = timeout;
self.sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];

// Call API:
[self.sessionManager POST:path parameters:dictParams progress:nil success:^(NSURLSessionTask *task, id responseObject) { 
    // success block
} failure:^(NSURLSessionTask *task, NSError *error) {
    // failure block
}

ОБНОВЛЕНИЕ 2:

Итак, теперь у меня есть кое-что новое: CUST использует iOS 9.3.5, а DEV использует iOS 10.x. DEV попробуйте выполнить отладку на устройстве iOS 9.3.5, появится ошибка CUST, сообщение об ошибке будет выглядеть как this (почти то же самое, отличается только URL).

ЖУРНАЛ: Домен ошибки = Код NSURLErrorDomain = -1004 «Не удалось подключиться к серверу». UserInfo={NSErrorFailingURLStringKey=APIURL, _kCFStreamErrorCodeKey=-2200, NSErrorFailingURLKey=APIURL, NSLocalizedDescription=Не удалось подключиться к серверу., _kCFStreamErrorDomainKey=4, NSUnderlyingError=0x16146990 {Домен ошибки=kCFErrorDomainCFNetwork Code=-1004 "(null) UserInfo=" _kCFStreamErrorDomainKey=4, NSErrorPeerAddressKey={длина = 16, емкость = 16, байты = 0x100201bb253ce7160000000000000000}, _kCFStreamErrorCodeKey=-2200}}}

Сейчас DEV бьется над тем, как бороться с этой ошибкой. Пожалуйста помоги.


person Eddie    schedule 11.01.2017    source источник


Ответы (1)


Не зная, что это за приложение и как оно работает, я предполагаю, что оно заполнено состоянием и может быть связано с сеансом, который был активен на текущем мертвом сервере, разработчик, который запускает сеанс, направляется на сервер 2 через балансировщик нагрузки .

person James Jayson    schedule 11.01.2017
comment
Но CUST даже удалили приложение и установили заново. Сохраняет ли состояние с полным состоянием что-то подобное даже после удаления? - person Eddie; 11.01.2017
comment
Опять же, не зная, как приложение подключается, если оно использует браузер для подключения, браузер может запомнить сеанс, однако это не должно происходить через 30 минут из-за истечения срока действия сеанса после настроенного периода времени (обычно 30 минут на дефолт) - person James Jayson; 11.01.2017
comment
Что вы хотите знать о том, как приложение подключается? Я могу кое-что поделиться. Обычно он отправляет запрос на URL-адрес и получает ответ. Кроме того, браузер попал на правильный сервер S2, поэтому не должно ли приложение также перейти на S2? - person Eddie; 11.01.2017
comment
Часть, о которой я хотел бы спросить, - это то, как приложение отправляет URL-адрес, если оно отправляет URL-адрес через браузер, тогда браузер запомнит даже после удаления приложения. у разработчика, использующего браузер, не будет этой проблемы, поскольку его сеанс начнется после того, как первый сервер выйдет из строя, поэтому он останется подключенным к серверу 2, даже если сервер 1 снова вернется в сеть. просто чтобы быть абсолютно ясным, это единственная идея, которая у меня есть, и она может быть неправильной, но это возможно. - person James Jayson; 11.01.2017
comment
Запрос приложения к URL с использованием AFNetworking 3.0 через @SEL AFHTTPSessionManager POST:parameters:progress:success:failure:. Вот так просто. Я обновлю вопрос об этой части. - person Eddie; 11.01.2017
comment
Казалось бы, то, что я говорил о сеансе, сохраняющем соединение, указывающее на этот сервер, не так, удачи в этом вопросе! - person James Jayson; 11.01.2017