В настоящее время я разрабатываю приложение для iOS (используя MonoTouch), которое будет иметь серверный компонент, работающий в Windows Azure. Приложение, по сути, будет приложением типа чата, в котором пользователи будут генерировать сообщения в своих клиентах и отправлять их на сервер, который затем должен будет пересылать эти сообщения (как можно быстрее) другим клиентам, которым пользователь может отправлять сообщения. к.
Мой вопрос: существует ли рекомендуемая практика для разработки такого приложения, когда клиентам необходимо получать «push»-сообщения с сервера?
Я рассмотрел несколько вариантов, но был бы признателен за обратную связь.
Первый вариант — использовать службу push-уведомлений Apple (APN). У меня есть две проблемы по этому поводу: во-первых, клиентам нужно получать сообщения только тогда, когда они в сети (APN отправляет сообщения, когда приложение закрыто, что мне не нужно или не нужно); и, во-вторых, существует вероятность того, что будет большой объем сообщений, что, как я знаю, Apple, вероятно, будет недовольно (совершенно справедливо).
Второй вариант, который я рассматривал, — это использование веб-службы (на основе WCF) и вызов этой службы клиентом каждые (скажем) 2-3 секунды, что является максимальной задержкой, которую мы можем допустить. Однако это может привести к большому количеству потенциально ненужного сетевого трафика («у вас есть что-нибудь для меня?», «нет», повторяется до тошноты).
Третий вариант — поддерживать постоянное соединение веб-службы между клиентом и сервером. Когда клиентское приложение запускается, оно вызывает метод веб-службы в фоновом потоке. Сервер будет держать соединение открытым (ничего не возвращая), и если какие-либо сообщения придут, он немедленно вернет их. Это соединение может истечь, скажем, через 2 минуты, после чего оно будет восстановлено. Кажется, это делает то, что я хочу, но опять же, я обеспокоен тем, что в любой момент будет открыто много подключений к серверу, что может потребовать ненужных ресурсов сервера.
Четвертый вариант — использовать постоянное соединение через TCP (или UDP, хотя, насколько я понял, Windows Azure не поддерживает это). Это кажется хорошим вариантом, но, опять же, может быть излишним с точки зрения использования сервера — потенциально в любой момент могут быть подключены сотни или даже тысячи клиентов.
Пятый вариант заключается в том, чтобы каким-то образом заставить сервер отправлять сообщения непосредственно клиенту, возможно, запустив на клиенте мини-веб-сервер или что-то подобное. Однако, поскольку приложение будет работать в сетях 3G и WiFi (вне моего контроля), я не ожидаю, что входящие порты будут открыты для такого рода вещей.
Если у кого-то есть какие-либо другие предложения или кто-то считает, что один из вышеперечисленных вариантов будет хорошей идеей (или это стандартный способ решения такой проблемы), мне было бы очень интересно об этом узнать.
Заранее спасибо,
Джон