aspirant
|
Date: 2/6/2011
Михаил,
Хочу предложить серьезные изменения в структуре метаданных. Вместе с обоснованием хочу для наглядности выложить пример на WPF. Как это лучше сделать?
Еще, если я залью на сервер изменения, я так понимаю, их же можно будет потом назад откатить?
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 2/6/2011
aspirant Хочу предложить серьезные изменения в структуре метаданных. Вместе с обоснованием хочу для наглядности выложить пример на WPF. Как это лучше сделать?
Написать сюда или картинку вставить. aspirant Еще, если я залью на сервер изменения, я так понимаю, их же можно будет потом назад откатить?
Можно, но муторно как и любой откат.
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 2/7/2011
|
|
|
|
Что я предлагаю: - Сейчас все метаданные описаны классами-наследниками PlazaColumns, что не совсем соответствует иерархии метаданных самой Плазы. Я предлагаю создать абстрактный класс PlazaReplicationStream (название можно как-нибудь сократить, например PlazaReplStream), наследники которого будут соответствовать потокам репликации, например, FortsOptTradeReplicationStream - FORTS_OPTTRADE_REPL, RtsIndexReplicationStream - RTS_INDEX_REPL и т.д. По аналогии со структурой PlazaColumns в самом PlazaReplicationStream будут открытые переменные readonly для каждого потока репликации, например
Codepublic static readonly FortsOptTradeReplicationStream FortsOptTradeRepl = new FortsOptTradeReplicationStream(); public static readonly RtsIndexReplicationStream RtsIndexRepl = new RtsIndexReplicationStream();
- PlazaColumns предалагю переименовать в PlazaTable, потому что это все-таки таблицы, а не наборы колоннок, которые можно между собой смешивать (но это лишь моя интерпретация названия PlazaColumns). В каждом классе потоке репликации будут свои наследники PlazaTable, что будет соответствовать содержанию самих потоков репликации в Плазе. Так, что если в FORTS_OPTTRADE_REPL есть таблицы orders_log, deal, heartbeat, в классе FortsOptTradeReplicationStream будут такие поля:
Codepublic readonly PlazaOptionOrdersLogColumns OrdersLog = new PlazaOptionOrdersLogColumns(); public readonly PlazaOptionDealColumns Deal = new PlazaOptionDealColumns(); public readonly PlazaHeartBeatColumns HeartBeat; Теперь, если нужно подписаться на весь поток FORTS_OPTTRADE_REPL и получать данные по всем таблицам, это можно сделать так:Code_plazaStreamManager.AddStream("FortsOptTradeRepl_OrdersLog", PlazaReplicationStream.FortsOptTradeRepl); А, если нужно подписаться только на одну таблицу, например orders_log, это можно сделать такCode_plazaStreamManager.AddStream("FortsOptTradeRepl_OrdersLog", PlazaReplicationStream.FortsOptTradeRepl.OrdersLog); Если нужно передать только отдельные колонки, то это делатется так:Code_plazaStreamManager.AddStream("FortsOptTradeRepl_OrdersLog", PlazaReplicationStream.FortsOptTradeRepl.OrdersLog, columns1); где columns1 этоCodevar columns1 = new PlazaColumn[] { PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplId, PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplRev, PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.ReplAct, PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.Price, PlazaReplicationStream.FortsOptTradeRepl.OrdersLog.Hedge }; Кстати, уже сейчас по ходу написания родилась мысль, что в последнем примере вместо IEnumerable<PlazaColumn> можно будет передавать новый класс, называющийся, например, PlazaColumnListBuilder, который, во-первых, будет за клиента автоматом добавлять первыми тремя колонками служебные колонки ReplId, ReplRev, ReplAct (это обязательно, иначе не подключишься), а, во-вторых, будет проверять, чтобы все колонки были одной таблицы.
- Нынешний PlazaTable предлагаю переименовать в PlazaTableConfiguration. Он будет уметь сохранять заданную конфигурацию таблицы (читай нужный набор колоннок) в ini-файле в формате Плазы, а также создаваться из таких файлов для последующего подключения к потокам репликации.
- PlazaTableTypes нужно, наверное, либо прицепить к наследникам PlazaReplicationStream, либо убрать вообще.
Если мои предложения принимаются, я могу начать вносить изменения. Также беру на себя рефакторинг всех наследников PlazaColumns. Постараюсь сделать на этой неделе до конца выходных.
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 2/10/2011
|
|
|
|
Не могу сейчас развернуто вникнуть в суть проблемы.
1. Я думаю это неправильно. Иерархия Плазы как раз сама по себе избыточная (я так понимаю тогда задача стояла сделать что то по быстрому, а не что-то стоящее). Идти за их иерархией - просто повторять их ошибки.
2. PlazaTable - это то что конфигурируется пользователем. PlazaColumns - базовый класс, содержащийся основные поля. Даже не представляю, как одно может заменить другое... Плюс дальше по описанию вижу, что пользователю предлагается вынести управление потоками. Я однозначно понял за последнее время - этого делать не нужно. Лучше придерживать принципа инкапсуляции. Разрушить его можно в любое время (что опять же не очень хорошо).
3. Скажу так, все эти PlazaColumnListBuilder PlazaTableConfiguration говорит о том, что уже начался овер дизайн.[biggrin] Надо как-то проще. Потому что сейчас уже не совсем понятно. Что будет потом? А что будет с теми пользователями, которые захотят переползти с голой Плазы? Одно сложное на другое сложно не меняют.
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 2/15/2011
|
|
|
|
Похоже я нагородил кучу лишнего. Короче все это нужно отринуть. МИХАИЛ: вопрос, который меня занимает сейчас больше всего: какой класс будет содержать все себе данные, которые будут приходить в потоках Плазы? Если PlazaStream мы не будем показывать клиентскому коду, тогда, может быть, это будет PlazaTable? А если не он, то что это будет за класс, и как он будет связан с PlazaTable? По задачам, связанными с подпиской на потоки репликации Плазы я вижу, что нужно сделать следующее: - Создать буфер накопления входящих данных стрима.
- Расписать методы Deserialize у PlazaTableSerializer, чтобы можно было инициализировать PlazaStream из ini файлов. Прикрутить инфраструктуру инициализации из файлов к PlazaStreamManager/PlazaTrader.
- Фильтрация входящих данных.
- Создание пула CP2ConnectionClass'ов для оптимизации и возможности параллельного получения данных по потокам. Сейчас, насколько я понял из тестирования, если данные из нескольких стримов идут по одному CP2ConnectionClass, это происходит порционно, т.е. идет партия данных одного стрима, за ней партия данных другого стрима и т.д.
Я сейчас занимаюсь первым пунктом, а остальные пункты можно разобрать на задачи. Самым сложным и интересным вижу пункт 3.
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 2/15/2011
|
|
|
|
aspirant Похоже я нагородил кучу лишнего. Короче все это нужно отринуть.
МИХАИЛ: вопрос, который меня занимает сейчас больше всего: какой класс будет содержать все себе данные, которые будут приходить в потоках Плазы? Если PlazaStream мы не будем показывать клиентскому коду, тогда, может быть, это будет PlazaTable? А если не он, то что это будет за класс, и как он будет связан с PlazaTable?
Я думал что это будет или object[] или object[][]... Это сильно критично через что данные будут передаваться? aspirant По задачам, связанными с подпиской на потоки репликации Плазы я вижу, что нужно сделать следующее: - Создать буфер накопления входящих данных стрима.
- Расписать методы Deserialize у PlazaTableSerializer, чтобы можно было инициализировать PlazaStream из ini файлов. Прикрутить инфраструктуру инициализации из файлов к PlazaStreamManager/PlazaTrader.
- Фильтрация входящих данных.
- Создание пула CP2ConnectionClass'ов для оптимизации и возможности параллельного получения данных по потокам. Сейчас, насколько я понял из тестирования, если данные из нескольких стримов идут по одному CP2ConnectionClass, это происходит порционно, т.е. идет партия данных одного стрима, за ней партия данных другого стрима и т.д.
Я сейчас занимаюсь первым пунктом, а остальные пункты можно разобрать на задачи. Самым сложным и интересным вижу пункт 3. Ок, тогда по первому задавать вопросы не буду. 2. Тоесть, PlazaTableSerializer восстанавливает из конфига PlazaTable и он уже передается в PlazaStream? 3. Распиши, как ты это видишь и где это нужно сделать. 4. Как насчет для каждого стрима создавать по отдельному CP2ConnectionClass? Можно пока задачу подвинуть как оптимизациюнную (а следовательно не приоритетную[biggrin])
|
|
Thanks:
|
|
|
|
|
aspirant
|
Date: 2/16/2011
|
|
|
|
Mikhail Sukhov Я думал что это будет или object[] или object[][]... Это сильно критично через что данные будут передаваться?
Просто, чтобы понимать куда передавать данные дальше. Сейчас они приходят по одной записи/строчке в методе void OnStreamDataInserted(CP2DataStream stream, string tableName, CP2Record record) класса PlazaStream. Mikhail Sukhov 2. Тоесть, PlazaTableSerializer восстанавливает из конфига PlazaTable и он уже передается в PlazaStream?
Да, причем, на мой взгляд, клиентскому коду лучше не давать доступа к PlazaTableSerializer. Пускай он это лучше делает через методы Load/Save класса PlazaTable. Формат ini-файлов это внутренность Плазы, и ее лучше, хотя бы на первых порах, инкапсулировать от клиентского кода. Mikhail Sukhov 3. Распиши, как ты это видишь и где это нужно сделать.
Создать интерфейс IPlazaStreamFilter, у которого будет метод bool Validate(object value) и свойство string ColumnName. В конструктор PlazaTable передавать IEnumerable<IPlazaStreamFilter>, который, в свою очередь будет эту энумерацию передавать в конструктор PlazaStream. Внутри себя PlazaStream в методе void OnStreamDataInserted(CP2DataStream stream, string tableName, CP2Record record) будет перебирать эту энумерацию, вызывать для каждого элемента метод Validate(object Value) и передавать данные, приходящие в потоке репликации, дальше (в клиентский код) только, если все вызовы Validate(object Value) возвращают true. Но это только верхушка айсберга, потому что, оперируя понятиями SQL, мы только реализуем AND связки, например, price>100 AND code_vcb=xyz. А нужно еще предосмотреть, как минимум связку OR, например, price>100 OR code_vcb=xyz. Дальше я пока над этим не думал. Mikhail Sukhov 4. Как насчет для каждого стрима создавать по отдельному CP2ConnectionClass? Можно пока задачу подвинуть как оптимизациюнную (а следовательно не приоритетную[biggrin])
Да, это точно на потом. Сначала нужно с первыми тремя задачами разобраться.
|
|
Thanks:
|
|
|
|
|
guk
|
Date: 3/11/2011
Взял Quote:4. Составные инструменты. из Quote:Третьестепенная группа:
|
|
Thanks:
|
|
|
|