Архитектура для мессенджера Mandarin IM
Добавлено: 31 мар 2013, 13:18
Приветствую всех посетителей форума!
В качестве вступления.
Для начала представлюсь. Я - разработчик ICQ, Mail.Ru, XMPP мессенджера Mandarin IM для платформы J2ME. Если кто не слышал - прошу: http://tomclaw.com/library/?id=6
Его разработка началась, примерно, 4 года назад и проекту от первого релиза уже 2 года и 8 месяцев. Надо сказать, за это время я получил очень много опыта не только по части архитектур приложений, оптимизации кода, реализации разного рода интересных задач, но и разбираясь с протоколами как открытыми (XMPP), так частично открытыми (Mail.Ru) или даже вовсе закрытыми (ICQ, OSCAR). Проект Mandarin IM оказался весьма успешным и сейчас насчитывает более миллиона пользователей. Ежедневно Mandarin устанавливают от 1 000 до 3 000 человек. Кстати, проект открыт и его код доступен на GitHub: https://github.com/solkin/mandarin-j2me-legacy
В чём вопрос, чем я хочу поделиться и почему вообще пришёл сюда.
Не так давно (пару месяцев назад) я начал разработку новой линейки проекта - Mandarin IM для Android. Изучая саму платформу Android, у меня возникло много соображений относительно того, какую архитектуру приложения выбрать. Интуитивно я опираюсь на опыт разработчиков из Google, пытаясь понять, как устроен GTalk из Android 4 и как построить подобное ему лёгкое приложение, которое, по возможности, всегда в сети и готово принять сообщения к отправке. Заметил, что он работает с сервисом Google Services, который является отдельным процессом. И это совершенно правильная архитектура на мой взгляд - независимый сервис держит связь, а UI подключается к нему по необходимости и запрашивает, передаёт нужные данные.
После долгих изысканий я пришёл к архитектуре приложения, где сервис выполняется в отдельном от UI процессе, а обмен данными между UI и сервисом производится через интерфейс взаимодействия AIDL и Intent в обратную сторону (от сервиса к Activity). Вопросов может и не быть, но меня пугает то, что все данные, передаваемые между ними, сериализуются. Это явно не придаст скорости, даже если учитывать то, что используется быстрый способ - через интерфейс Parcelable. Насколько это решение оптимально?
Рассматривал построение приложения на основе Messenger, но он тоже основан на AIDL и является, по сути, его асинхронной реализацией.
Хочу услышать мнения, предложения и подискутировать насчёт построения архитектуры для такого приложения. Возможно, у кого-то есть подобный опыт?
И, спасибо всем заранее за участи в этой беседе!
В качестве вступления.
Для начала представлюсь. Я - разработчик ICQ, Mail.Ru, XMPP мессенджера Mandarin IM для платформы J2ME. Если кто не слышал - прошу: http://tomclaw.com/library/?id=6
Его разработка началась, примерно, 4 года назад и проекту от первого релиза уже 2 года и 8 месяцев. Надо сказать, за это время я получил очень много опыта не только по части архитектур приложений, оптимизации кода, реализации разного рода интересных задач, но и разбираясь с протоколами как открытыми (XMPP), так частично открытыми (Mail.Ru) или даже вовсе закрытыми (ICQ, OSCAR). Проект Mandarin IM оказался весьма успешным и сейчас насчитывает более миллиона пользователей. Ежедневно Mandarin устанавливают от 1 000 до 3 000 человек. Кстати, проект открыт и его код доступен на GitHub: https://github.com/solkin/mandarin-j2me-legacy
В чём вопрос, чем я хочу поделиться и почему вообще пришёл сюда.
Не так давно (пару месяцев назад) я начал разработку новой линейки проекта - Mandarin IM для Android. Изучая саму платформу Android, у меня возникло много соображений относительно того, какую архитектуру приложения выбрать. Интуитивно я опираюсь на опыт разработчиков из Google, пытаясь понять, как устроен GTalk из Android 4 и как построить подобное ему лёгкое приложение, которое, по возможности, всегда в сети и готово принять сообщения к отправке. Заметил, что он работает с сервисом Google Services, который является отдельным процессом. И это совершенно правильная архитектура на мой взгляд - независимый сервис держит связь, а UI подключается к нему по необходимости и запрашивает, передаёт нужные данные.
После долгих изысканий я пришёл к архитектуре приложения, где сервис выполняется в отдельном от UI процессе, а обмен данными между UI и сервисом производится через интерфейс взаимодействия AIDL и Intent в обратную сторону (от сервиса к Activity). Вопросов может и не быть, но меня пугает то, что все данные, передаваемые между ними, сериализуются. Это явно не придаст скорости, даже если учитывать то, что используется быстрый способ - через интерфейс Parcelable. Насколько это решение оптимально?
Рассматривал построение приложения на основе Messenger, но он тоже основан на AIDL и является, по сути, его асинхронной реализацией.
Хочу услышать мнения, предложения и подискутировать насчёт построения архитектуры для такого приложения. Возможно, у кого-то есть подобный опыт?
И, спасибо всем заранее за участи в этой беседе!