Надежный обмен данными в гетерогенной среде, между разными платформами и технологиями является одним из ключевых моментов разработки сложных систем. Во время обмена данные преобразуются в некоторый промежуточный формат совместимый между платформами. Преобразование в подобный формат и из него — крайне рутинная и подверженная ошибкам работа.
Метаописание данных неким декларативным языком с последующей автогенерацией типизированных структур облегчает жизнь разработчику. Снимает с него необходимость задумываться о промежуточном формате, о правильном порядке полей, а типизированность гарантирует выявление ошибок еще на этапе компиляции кода.
В докладе будет рассмотрено несколько подобных решений, их плюсы и минусы. Также будет рассмотрен с практической стороны наш собственный формат метаданных, используемый нами на протяжении более 5 лет.
Целевая аудитория:
Ограничений нет, но в большей степени разработчики, имеющие уже определенный опыт разработки разнородных систем или приступающие к подобной задаче.
4. zveriki.com
■ Амбициозная и успешная MMO 3D игра с
целым зоопарком технологий:
○ Сервер: Linux, C++, MySQL, ассеты и конфиги в
файловой системе
○ Клиент: Shockwave Director (Lingo, JavaScript)
○ Портал: PHP
11. Передача по сети
■ Максимально компакное представление
■ Набор байтов
■ Данные представлены последовательно
id conf_id
health x y
name (size)
name
== 1 byte
16. Проблемы
■ Отсутствие проверки структуры данных на
этапе компиляции для ассоциативных
данных
■ Строгий порядок следования инструкций
в сетевом протоколе
■ Громоздкая поддержка обработки ошибок
■ Дублирование кода для различных
платформ
■ Добавление новых RPC вызывов неудобно
■ etc, etc, etc
19. Пути решения
■ Найти готовое решение
○ Из всего глянулся Thrift (http://thrift.apache.org)
○ … но это была середина 2007 года: “никакая”
документация, запутанный код, ориентация
только на RPC и проч. и проч.
■ Придумать “нечто” свое
22. metagen
■ Простой декларативный мета формат
■ Поддержка ассоциативных и
последовательных источников данных
■ Новые форматы данных просто добавить
■ Парсинг и кодогенерация написаны на
PHP: относительно просто расширить
■ RPC, сохранение/загрузка в/из БД,
файловой системы
■ C++, AS3, PHP, JavaScript, Go (активно
пилится)
24. metagen: как это работает
■ Парсинг декларативного описания
■ Формирование промежуточной структуры
■ Кодонегерация под разные “таргеты” из
промежуточной структуры
struct DataPet
id : uint32
conf_id : uint32
x : float
y : float
end
<?php
class mtgMetaStruct {
}
class mtgMetaField {
}
...
PHP
C++
AS3 Go
25. metagen: простые типы и
структуры
struct ConfPoint
x : float
y : float
end
struct ConfShapeBase
points : ConfPoint[]
end
struct ConfShape extends ConfShapeBase
id : uint32
name : string
end
26. metagen: поддержка enum
enum EnumShape
UNDEFINED = 0
CIRCLE = 1
SQUARE = 2
end
struct DataShape
type : EnumShape
...
end
27. metagen: токены
struct DataPet
@POD @table:pet @id:id @owner:player_id
id : uint32
player_id : uint32
name : string @default:"K-9" @strmax:128
breed : EnumBreed @default:"BULLDOG"
health : uint32 @default:10
...
end
■ Структурные токены
■ Токены на отдельные поля
28. metagen : RPC
RPC 101 MATH_CALC(
op : OpType
x : float
y : float
)
error : uint32
answers : float[]
end
29. metagen: приятные мелочи
#комментарии поддерживаются
#...как и поддерживаются некоторые
#другие препроцессорные директивы, например
#include shared.meta
30. metagen: опциональные поля
struct DataPet
@POD @table:pet @id:id @owner:player_id
id : uint32
player_id : uint32
health : uint32
...
end
struct DataPet
@POD @table:pet @id:id @owner:player_id
id : uint32
player_id : uint32
health : uint32
...
#added in version 1.01
age : uint32 @optional @default:0
end
44. metagen: минусы
■ Требуется настоящий лексер, а не regex
парсинг декларативного описания
■ Местами “стихийная” реализация в
кодогенерации
■ Пока нет поддержки по-настоящему
опциональных полей (data.x.set(10); if
(data.x.exists()) { … } )
■ Не является универсальным решением,
решает исключительно наши потребности
■ Сlosed source ;)