1 дек. 2009 г.

Создание ChessJam на Flex / AIR + ColdFusion + LiveCycle DS = много веселого :)


Свободный перевод статьи The making of ChessJam Flex/AIR + ColdFusion + LiveCycle DS = fun project!
 
Пару недель назад я анонсировал проект под названием ChessJam, над которым работал по выходным в течение нескольких месяцев. И теперь я стараюсь выполнить свое обещание и рассказать, почему мы выбрали такие технологии под настольное приложение для он-лайн игры в шахматы один на один. Очевидно, что это в первую очередь личный проект, но у него очень хорошее основание на базе технологий Adobe, поэтому я чувствую, что должен «донести вам эту благую весть»! Мне сразу захотелось опубликовать исходный код, но мои партнёры-разработчики тут же напомнили мне, что это коммерческий проект, так что в этом посте я буду балансировать на тонкой грани.


Выбор технологии

Пользовательский интерфейс / Front-end

Несомненно, это было самое простое решение, которые мы приняли. Adobe Flex и ежу понятно! У нас просто не было времени на написание проекта на чем-нибудь еще! Мы рассчитывали создать браузерную игру, но Adobe AIR предложил очевидные преимущества:
  • Обнаружение сетевых ошибок – мы можем обнаружить проблемы со связностью сети и отреагировать соответствующим образом
  • Обнаружение неработающих пользователей – мы можем определить, прекратил ли пользователь работу с мышкой и клавиатурой и просто отключить его
  • Управление пользовательским интерфейсом – мы можем лучше контролировать восприятие пользователем, управляя каждым аспектом пользовательского интерфейса, включая место, размер, насыщенность и т.д.
У нас нет времени (равно как и желания) создавать собственный искусственный разум, который бы понимал правила игры в шахматы, поэтому мы купили для этого библиотеку третьей стороны. Это наше первое решение отдать предпочтение покупке продукта, а не его созданию.

Серверная платформа

Выбор подходящей серверной технологии заставил нас подумать. Поскольку я знал, что буду отвечать за разработку внутреннего интерфейса, то это решение было весьма серьезным для меня! Серверный код служит в основном как интерфейс между клиентским приложением и базой данных. Сервер выступил бы также в роли «диспетчера сообщений» для многочисленных клиентов, уведомляя их о деятельности других пользователей, например, о передвижении фигур на игровом поле, входе в комнаты, запуске игры и т.д.

Мы рассматривали следующие технологии:
  • Java – У меня уже был опыт разработки на Java, и я уже создавал как коммерческие, так и бесплатные продукты на Java. К тому же я знал, что Java хорошо совместима с Flex, но меня беспокоило количество времени, которое на это надо потратить
  • PHP – Мои партнёры-разработчики уже работали с PHP, но это было не на профессиональном уровне, так что я подумал, что изучение PHP отнимет слишком много времени
  • ColdFusion – Несмотря на то, что я работаю на Бена Форта (Ben Forta), я не был уверен, что ColdFusion подходит для этого проекта. У меня было совсем мало опыта работы с ColdFusion, и я не считал себя специалистом. Во время разговора о наших требованиях к внутреннему интерфейсу Бен отметил несколько хороших моментов:
    1. Написать код на ColdFusion для работы с базами данных можно очень быстро, да и выучить его легко.
    2. ColdFusion и Flex очень хорошо работают вместе.
    3. У ColdFusion есть хорошая поддержка передачи сообщений в LCDS или BlazeDS.
    4. Администрирование ColdFusion очень простое.

    После этой беседы я провел дополнительное исследование и пришел к выводу, что ColdFusion может быть правильным выбором. Я взял копию трехтомника "ColdFusion 8 Web Application Construction Kit" и выборочно пробежался глазами. Когда принималось это решение, не было еще даже бета-версии ColdFusion 9, так что я продолжил работу с 8 версией. Когда дело касается создания программного обеспечения, я становлюсь немного консерватором. «Побочным эффектом» моего нового увлечения ColdFusion было участие в туре группы пользователей CF в поддержку CF9, что было очень весело. Я отказался подняться на сцену перед толпой разработчиков и «вещать» о том, что я никогда серьезно не использовал, но теперь, когда я с головой нырнул в CF, я, наконец, почувствовал себя специалистом.

Серверная ОС

Здесь нечего добавить кроме того, что я люблю стабильность, эффективность и универсальность Linux. У меня многолетний опыт разработки и управления крупномасштабными приложениями, созданными на операционных системах Unix, так что это определенно моя комфортная зона. Я выбрал 64-bit Ubuntu 8.x (тогда это была самая последняя версия – мне все еще нужно обновить ее до 9.x).

Серверная база данных

Мы выбрали MySQL в качестве движка базы данных. Он надежный, быстрый, простой в установке и администрировании, к тому же он точно работает. Я никогда не использовал MySQL для создания крупномасштабного приложения со многими предполагаемыми транзакциями, так что посмотрим, как он с этим справится. Модель данных сама по себе достаточно проста. Я убрал триггеры и сохранил процедуры для открытого продвижения дополнительных возможностей. Так что MySQL хорошо справляется. Я даже использую пару таблиц только в памяти для переходных/временных данных, например, списка зарегистрированных лиц и т.д. Я, как правило, создавал структуры памяти для этого, но использование таблиц только в памяти сократило количество кода, которого мне надо было написать.

Передача сообщений

Приложения на Flex могут делать удаленные запросы в стандартный ColdFusion без установки дополнительного программного обеспечения, так что мы им воспользовались. Тем не менее, нам нужно было межплатформенное программное обеспечение для передачи сообщений от клиента к клиенту и от сервера к клиенту. Эти сообщения используются для общения игроков между собой, уведомлений о сделанном ходе и многих других событиях игры.

BlazeDS против LiveCycle Data Services (LCDS)

И BlazeDS и LCDS предлагают опубликование/подписку сообщений. ColdFusion 8 связывается с LCDS (хотя необходима покупка отдельной лицензированной версии, если вы используете его на более чем одном процессоре), так что мы пошли по пути наименьшего сопротивления. LCDS также поддерживает RTMP (протокол обмена сообщениями в режиме реального времени), а это высокопроизводительная, масштабируемая дополнительная возможность.

Примечание: ColdFusion 9 теперь идет в связке с BlazeDS, а не LCDS, но LCDS может быть интегрирован. Поскольку мы использовали ColdFusion 8, то нам не пришлось ничего интегрировать.

Доказательство правильности концепции

На данном этапе мы уже выбрали инструменты и технологии, которые мы будем использовать для создания ChessJam. Тем не менее, мы все еще не были уверены на все 100%, что у нас есть все, что нам может потребоваться для создания этого сложного приложения, так что мы решили написать ряд маленьких приложений для проверки правильности концепции.
  • Flex вызывает CFC компонент, который возвращает данные различных типов – проверено!
  • Подписка на канал доставки сообщений при помощи Flex mx:Consumer – проверено!
  • Опубликование сообщений в режиме реального времени из Flex при помощи mx:Producer – проверено!
  • Опубликование сообщений в режиме реального времени из ColdFusion при помощи Event Gateway (DataServicesMessaging) и получение их в Flex – проверено!
Фреймворк

Мы с Тоддом Уиллиамсом (Todd Williams) (twitter) несколько раз разговаривали на счет структуры приложения. Предстояло рассмотреть еще множество факторов, поскольку наши далеко идущие планы были весьма благородными. Мы хотели обеспечить поддержку нескольких игр одновременно, многоуровневого чата, автоматического обновления подключения к существующим играм, турниров, командных игр и т.д. Мы пришли к выводу, что этот проект выходит за рамки подхода «просто сиди и пиши код». Нам нужен был план!

Я работал с Холли Шински (Holly Schinsky) (twitter) 10 лет над несколькими крупными проектами и насколько мне известно, у нее хорошее чувство архитектуры и дизайна, поэтому я описал ей наши базовые требования и попросил совет. Несколькими днями позже Холли отправила нам костяк проекта на Flex на основе архитектуры MVCS, что, по ее мнению, было бы хорошим началом для нас. Мы с Тоддом изучили его и решили, что это будет отличным стартом.

Итак, мы начали писать код, имея список требований, макеты интерфейса, карты памяти и энтузиазм выходного дня!

Некоторые сведения о коде

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

Вызов ColdFusion из Flex

Ниже я описал код, показывая, как мы вызываем функции внутреннего интерфейса ColdFusion, определенные в некоторых CFC компонентах. Существуют функции внутреннего интерфейса для аутентификации пользователей, записи ходов, запуска игры и многого другого. Вызов ColdFusion из Flex очень прост. Настроив выполнение какой-либо функции один раз, вам потребуется всего лишь несколько секунд, чтобы запустить новые. Большинство наших функций возвращают числа, строки и результаты запросов (Array collection). Вы найдет кучу дополнительной информации по удаленному управлению ColdFusion. Есть также вспомогательные ресурсы на Adobe TV, в том числе и тот, который создал Бен Форта и который помог мне начать работу.



Внедрение подписки/опубликования сообщений для коммуникации клиент-клиент посредством LCDS

Мы широко используем систему подписки/опубликования сообщений в ChessJam для уведомления о событиях в игре и чате. Ниже приведен простой пример, как мы реализовали внутри игровой чат.



Внедрение подписки/опубликования сообщений для коммуникации сервер-клиент посредством LCDS

Существует несколько функций в ChessJam, которые требуют передачи сообщений с сервера клиентскому приложению. Например, каждый раз, когда кто-то входит в комнату в ChessJam, сервер сообщает об этом событии, так что любой наблюдатель будет знать, что этот человек вошел в комнату. Мы также используем серверные сообщения для других уведомлений, передачи сообщений и автоматизированных сообщений в чате. Ниже приведены данные и из ColdFusion и из Flex. Чтобы функция ColdFusion sendGatewayMessage() работала, вам нужно установить версию шлюза DataServicesMessaging в администраторе ColdFusion. Вот наши данные (естественно с измененными сведениями):



Однажды задав конфигурацию, я могу использовать функцию ColdFusion sendGatewayMessage() для создания сообщений, которые может получить любой подписанный пользователь Flex:



От проверки правильности концепции к созданию

Первыми промежуточными итогами были примитивные и простые доступные через сеть клиенты, которым доступна базовая версия игры между двумя пользователями. Вот приблизительный список того, что мы сделали на первом этапе:
  • Игра между двумя игроками в браузере (без иллюстрации пока)
  • Возможности простого чата
  • Повторное подключение к игре (если вы закроете ваше приложение и повторно подключитесь, пока игра все еще будет идти, то вы автоматически присоединитесь к игре) 
  • Функции наблюдения за игрой (вы можете наблюдать за игрой других участников – полезно для проведения турниров и т.д.)
  • Башни и комнаты – обновление информации для клиентов в режиме реального времени о том, когда другие пользователи входят или выходят
  • Определение неактивных пользователей (на стороне сервера) – простой CFM, проходящий через ряд запросов каждые пять минут для управления временем ожидания в неактивных играх и т.д.
  • Иллюстрации и наша первая сборка на AIR. Это было весело! Тодд просто не оставил камня на камне от нас со своими версиями дизайна
  • Регистрация, создания профиля, обновление профиля, изменений пароля и прочие обязательные скучные штуки
  • Расширенная регистрация активности на стороне сервера, что позволяет отслеживать подобные вещи в режиме реального времени
  • Первое испытание ChessJam – мы пригласили 20 друзей и членов семьи для установки и проверки первой версии игры, так что мы смогли увидеть, как все работает. Наши ожидания оправдались: мы нашли кучу ошибок! Например, человек, наблюдающий за игрой, может ее прекратить, хотя он даже не участвует в ней, просто нажав на кнопку «forfeit»! И это только одна из 100 ошибок, которые мы нашли
  • Написание кода, версия, тест, написание кода, версия, тест, написание кода, версия, тест, написание кода, версия, тест, …
  • Автоматическое обновление, определение неактивных пользователей (на стороне клиента), контроль связности сети и т.д.
  • Версия 1.0 готова!
  • Роботы! – 24 компьютерных игрока для тренировки своих навыков
  • Судьи игры и список контактов
  • Подробности скоро будут! Нам нужно еще несколько выходных!

Немного статистики

Мы все еще видим хороший рост нашей базы пользователей при практически полном отсутствии маркетинга. Мы не хотим быстро развиваться, поскольку так мы сможем добавить еще несколько функций и выявить ошибки. А пока немного статистики:
  • Сделано 80,000 ходов! Это один из самых главных показателей, поскольку становится ясно, сколько людей играет
  • От 5,000 до 6,000 ходов в день – значительный рост
  • 1900 игр сыграно
  • Почти 1,000 пользователей из более чем 88 стран (меньше 50% из USA, что не может не удивлять, учитывая, что мы почти не рекламировали наш продукт)

Что не так

Я не хочу показывать вам всю подноготную нашего проекта, но, как и в любом новом проекте, у нас все еще есть открытые вопросы. Распределение памяти – немного сложная задача для нас, особенно если учесть, что некоторые игроки сидят в ней по нескольку часов. Мы делаем определенные успехи в этой области, так что я не переживаю по этому поводу. Иногда мы сталкиваемся с трудностями у игроков, у которых низко скоростное соединение или соединение с большими задержками, когда они делают быстрые ходы, хотя пока последняя версия, кажется, справляется с этим.

Что дальше?

Как показывает время, мы работаем над несколькими новыми штуками:
  • Проведение нескольких игр одновременно – интерфейс, построенный на вкладках, позволяет играть несколько партий одновременно
  • Шахматы «по переписке» – для тех, кто не может играть вживую. Эта функция позволяет каждому игроку делать ходы, когда у них есть для этого время. Вы можете играть несколько партий одновременно и при этом делать ход только один раз в день
  • Турниры! У нас есть интересные планы проведения турниров. У нас уже есть список правил для проведения первого турнира. Исходя из моих результатов игры, могу вам сказать, что я скорее всего НЕ буду победителем турнира! Когда у меня есть время сыграть партию в ChessJam, меня обычно ждет провал
  • Запись результатов игры и контроль. Данные у нас уже есть. Осталось только сделать красивый интерфейс
  • С точки зрения использованных технологий, в ближайшем будущем я собираюсь обновить свой ColdFusion до 9 версии. Обычно я не перехожу на новую версию программы так быстро, но пока я слышал только хорошие отзывы от других пользователей ColdFusion. ColdFusion 9 повысит нашу производительность и мы горим желанием воспользоваться достоинствами новых функций, например, расширенной поддержкой cfscript, улучшенная работа CFC компонентов, источники данных по умолчанию, а также новые функции EXT2, включая усовершенствованную datagrid. Ну а пока я, наверное, продолжу работать с Ubuntu 8.x, поскольку я не вижу веских причин переходить к 9 версии для написания нашего приложения. Если что-то не ломается – нет нужды это ремонтировать. Мы точно будем тестировать AIR 2.0 в ближайшее время. AIR 2.0 обещает улучшить потребление памяти и использование CPU, а также предлагает множество новых API.
Если вы все еще не играли в ChessJam, так оцените ее. Она пока бесплатная. Мы хотим как-нибудь сделать эту игру коммерческой по очевидным причинам, но пока мы хотим создать сообщество для удовольствия.

6 комментариев:

  1. >Свободный перевод статьи The making of ChessJam Flex/AIR + ColdFusion + LiveCycle DS = fun project!

    Имхо эти слова нужно писать в начале текста.

    ОтветитьУдалить
  2. @Sergii Galashyn
    Раньше так и было...

    ОтветитьУдалить
  3. Спасибо, хороший перевод.

    Исправьте "Flex using mx:Producer"

    И ещё, поясните что значит "Башни и комнаты", с комнатами понятно, а вот с башнями?

    ОтветитьУдалить
  4. @kutu
    незачто, не понял что именно исправить?

    ОтветитьУдалить
  5. @k4d
    в одной строке написано "при помощи"
    в следующей using

    ОтветитьУдалить