AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.01.2021, 17:41   #1  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Спасибо за комментарии.
По итогу оценил переделку в 3 дня, если согласуют, напишу чем закончилось. Это у них работает сейчас(с фильтром по "или" по дате модифиции по всем таблицам в запросе, я выше приводил пример), каждый вызов занимает минуту-полторы, подгружая в постоянном режиме где-то 6 ядер на 100% CPU, при этом большинство запросов возвращают пусто
За это сообщение автора поблагодарили: vmoskalenko (4).
Старый 18.03.2021, 13:33   #2  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Пока разминался красненьким работал над небольшим POC, решил прогнать тест:

Дано: 5M клиентов более-менее равномерно (500К - 1.3М) распределены по 5 компаниям
В сутки обновляется (Insert/Update) 0.1% клиентов

Вопрос: что нам будет стоить идентицифировать обновленных клиентов с помощью Change tracking ?

Потрачено времени:
  • Сгенерировать и импортировать данные через DMF - 4 дня
  • Оттюнить AifSqlCtChangeTracking - 4 часа

Тестируем:
  • Случайным образом обновляем данные по всем уровням AxdCustomer (это в некотором роде в сумме более 0.1% данных, ну и ладно)
  • Запускаем незатейливый джобик в самой большой компании (1.3М клиентов)

Итого: на бюджетной VM в Azure (B4Ms, 4xvCPU, 16 GB RAM, standard HDD) список измененных клиентов (CustTable.RecId) мы получаем за 5 секунд (достаточно шустро). Без перекрытия прочего стандартного кода в .insert(), .update(), event handler-ов и shadow таблиц (просто). Для всех обновлений, в том числе и извне AX (надежно)
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot 2021-03-18 131300.jpg
Просмотров: 29
Размер:	52.7 Кб
ID:	13146   Нажмите на изображение для увеличения
Название: Screenshot 2021-03-18 131819.jpg
Просмотров: 24
Размер:	54.0 Кб
ID:	13147  

Нажмите на изображение для увеличения
Название: Screenshot 2021-03-18 153859.jpg
Просмотров: 25
Размер:	131.7 Кб
ID:	13150  
Изображения
 
__________________
-ТСЯ или -ТЬСЯ ?

Последний раз редактировалось Vadik; 18.03.2021 в 15:48.
За это сообщение автора поблагодарили: mazzy (5), trud (5), sukhanchik (6), gl00mie (5).
Старый 18.03.2021, 14:15   #3  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Ну тест то как раз показывает что change tracking не всегда будет лучшим выбором. Т.е. никакие данные с точки зрения внешней системы вообще не изменились, а у вас выгрузились тысячи клиентов
Плюс все эти выгрузки полностью непрозрачны для пользователя, т.е. он не видит что и когда выгружалось
Плюс сам тест очень простой. Если удалить к примеру e-mail будет работать? Клиентов как правило требуется выгружать не всех, а принадлежащей определенной группе(при этом группу у клиента можно менять), это поддерживается?
Старый 18.03.2021, 15:35   #4  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от trud Посмотреть сообщение
Т.е. никакие данные с точки зрения внешней системы вообще не изменились, а у вас выгрузились тысячи клиентов
Change tracking честно говорит что менялось в AX в указанном отрезке времени. Какие из этих изменений актуальны для "внешней системы" (в общем случае - для "внешних систем"), в каком они сейчас состоянии - с этим пусть разбираются сами внешние системы

Цитата:
Плюс все эти выгрузки полностью непрозрачны для пользователя, т.е. он не видит что и когда выгружалось
Мы еще ничего никуда не выгружаем, мы просто спросили систему "что нового". Кто такие пользователи, что они видят, что им "непрозрачно" - пока непонятно

Цитата:
Плюс сам тест очень простой
Ну уж какой есть

Цитата:
Если удалить к примеру e-mail будет работать?
Конкретно для AxdCustomer и email - нет, потому что запрос использует не "физические" таблицы а DirPartyPostalAddressView и DirPartyContactInfoView. Для "физических" таблиц удаления отслеживаются (см. скриншот). Как интеграция отслеживает удаление данных (и должна ли) - это отдельная тема сама по себе

Цитата:
Клиентов как правило требуется выгружать не всех, а принадлежащей определенной группе(при этом группу у клиента можно менять), это поддерживается?
Да. AifChangeTracking::construct() принимает Query в качестве аргумента

Цитата:
Ну тест то как раз показывает что change tracking не всегда будет лучшим выбором
А кто-то утверждал что CT это "лучший" выбор, "всегда" ? Я например знаю сценарии где CT работает плохо и для них его предлагать не буду. Тест показывает решение поставленной задачи с неплохими (как мне кажется) трудозатратами, производительностью и надежностью. Кто захочет - попробует. Если будут альтернативные решения, с удовольствием на них посмотрю. Окажутся проще, быстрее, удобнее - буду иметь их в виду
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot 2021-03-18 150413.jpg
Просмотров: 25
Размер:	65.4 Кб
ID:	13149  
__________________
-ТСЯ или -ТЬСЯ ?

Последний раз редактировалось Vadik; 25.03.2021 в 09:34.
Старый 18.03.2021, 16:11   #5  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от Vadik Посмотреть сообщение
Да. AifChangeTracking::construct() принимает Query в качестве аргумента
Так а что туда передавать? Ну т.е. вчера клиент принадлежал группе выгрузки и выгружался, сегодня ему поменяли группу на невыгружаемую. Нужно же как уведомить внешнюю систему об этом
Ну пока "insert(), .update() delete()" мне видится единственным правильный подходом, т.е. это будет гарантированно работать в любом случае, плюс позволит покрыть все возможные "хотелки"
Хотя тут возможно ошибка выжившего, когда оно работает нормально, консалтинг не зовут, а мы видим только когда оно не работает
Старый 18.03.2021, 16:26   #6  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от trud Посмотреть сообщение
Так а что туда передавать? Ну т.е. вчера клиент принадлежал группе выгрузки и выгружался, сегодня ему поменяли группу на невыгружаемую. Нужно же как уведомить внешнюю систему об этом
Ну это наверное лучше с клиентскими постановщиками обсудить
Цитата:
Ну пока "insert(), .update() delete()" мне видится единственным правильный подходом, т.е. это будет гарантированно работать в любом случае, плюс позволит покрыть все возможные "хотелки"
Аминь
__________________
-ТСЯ или -ТЬСЯ ?
Старый 24.03.2021, 11:55   #7  
vmoskalenko is offline
vmoskalenko
Участник
Аватар для vmoskalenko
 
145 / 334 (12) ++++++
Регистрация: 25.01.2007
Адрес: Toronto
Цитата:
Сообщение от trud Посмотреть сообщение
Ну тест то как раз показывает что change tracking не всегда будет лучшим выбором. Т.е. никакие данные с точки зрения внешней системы вообще не изменились, а у вас выгрузились тысячи клиентов
Плюс все эти выгрузки полностью непрозрачны для пользователя, т.е. он не видит что и когда выгружалось
Вам шашечки или ехать? Вам инкрементальную выгрузку данных или систему логирования данных?

Цитата:
Сообщение от trud Посмотреть сообщение
Плюс сам тест очень простой. Если удалить к примеру e-mail будет работать?
Должно.

Цитата:
Сообщение от trud Посмотреть сообщение
Клиентов как правило требуется выгружать не всех, а принадлежащей определенной группе(при этом группу у клиента можно менять), это поддерживается?
Ну кто мешает
1. написать свою Data Entity. Кстати, для performance - это best practice. Помним, что CustomersV3 - одна из самых тяжелых data entity.
2. Добавить defaultCTQuery метод как описано тут https://docs.microsoft.com/en-us/dyn...hange-tracking
3. Накладывать фильтр прямо в DMF на Data Entity. Кстати, там же, в определении Export Group, можно задать инкрементальную выгрузку данных.
4. Вызывать вот это вот всё извне через DMF API https://docs.microsoft.com/en-us/dyn...pi#import-apis и еще с картинками вот тут https://github.com/microsoft/Recurri...iki#export-job
За это сообщение автора поблагодарили: EVGL (2), trud (5), gl00mie (5).
Старый 24.03.2021, 12:41   #8  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Речь шла о выгрузке из AX2012
__________________
-ТСЯ или -ТЬСЯ ?
Старый 25.03.2021, 05:08   #9  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Спасибо, для D365 тоже было бы интерестно обсудить
Цитата:
Сообщение от vmoskalenko Посмотреть сообщение
1. написать свою Data Entity. Кстати, для performance - это best practice. Помним, что CustomersV3 - одна из самых тяжелых data entity.
Да, по поводу написать свою, поддерживаю. Но зачем. Что делать если данные не укладываются в ентити? из недавнего - нужно передавать e-mail клиента из настроек принт менеджмента, который хранится в контейнере
CustomersV3 содержит около 900 строчек кода. Чем это лучше методов логирования из 1 строчки(insert, updated, delete) на таблицах входящих в нее
Есть мнение что методы логирования это не бест практис, то как бы MS их тоже активно использует
Нажмите на изображение для увеличения
Название: 2021-03-25_12-20-31.png
Просмотров: 33
Размер:	58.6 Кб
ID:	13152

Цитата:
Сообщение от vmoskalenko Посмотреть сообщение
2. Добавить defaultCTQuery метод как описано тут https://docs.microsoft.com/en-us/dyn...hange-tracking
Ну здесь уже описанный недостаток, нельзя фильтровать по полям которые нам нужны, а только целиком логировать запись. Хочу еще проверить как оно работает с удалениями из подчиненных таблиц
Цитата:
Сообщение от vmoskalenko Посмотреть сообщение
3. Накладывать фильтр прямо в DMF на Data Entity. Кстати, там же, в определении Export Group, можно задать инкрементальную выгрузку данных.
С фильтром сложно, поле группа клиентов может меняться, как обрабатывать смену с той группы которая выгружалась, на ту которую уже не надо выгружать(фильтр же ее отсечет автоматом)?
Цитата:
Сообщение от vmoskalenko Посмотреть сообщение
4. Вызывать вот это вот всё извне через DMF API https://docs.microsoft.com/en-us/dyn...pi#import-apis и еще с картинками вот тут https://github.com/microsoft/Recurri...iki#export-job
Ну тут надо определить что мы хотим(потратить больше времени или меньше). Если меньше, то внедрение в работу системы внешнего приложения резко повысит трудоемкость ее поддержки. Т.е. вам надо будет поддерживать несколько репозиториев, разворачивать отдельные версии для разработки, теста и прочее. Нужно будет делать мониторинг этой программы, плюс останавливать ее когда останавливается АХ.
(DXC кстати продает аналогичную доработку, но в D365, 2 джоба, один из которых выгружает данные в DM, другой оттуда забирает)
Требования которые надо будет реализовать могут быть к примеру один файл на клиента, файл должен быть определенной структуры с определенным названием. Зачем это все кодить во внешнем приложении?

Последний раз редактировалось trud; 25.03.2021 в 05:23.
За это сообщение автора поблагодарили: vmoskalenko (4).
Старый 01.04.2021, 09:11   #10  
vmoskalenko is offline
vmoskalenko
Участник
Аватар для vmoskalenko
 
145 / 334 (12) ++++++
Регистрация: 25.01.2007
Адрес: Toronto
Цитата:
Сообщение от trud Посмотреть сообщение
Спасибо, для D365 тоже было бы интерестно обсудить

Да, по поводу написать свою, поддерживаю. Но зачем. Что делать если данные не укладываются в ентити?
Вот тут Nathan Clouse выкладывает свои презентации. И вот как раз о быстродействии OData/Data Entity
https://github.com/NathanClouseAX/Co...-%20OData.pptx

Цитата:
Сообщение от trud Посмотреть сообщение
Ну тут надо определить что мы хотим(потратить больше времени или меньше). Если меньше, то внедрение в работу системы внешнего приложения резко повысит трудоемкость ее поддержки. Т.е. вам надо будет поддерживать несколько репозиториев, разворачивать отдельные версии для разработки, теста и прочее. Нужно будет делать мониторинг этой программы, плюс останавливать ее когда останавливается АХ.
(DXC кстати продает аналогичную доработку, но в D365, 2 джоба, один из которых выгружает данные в DM, другой оттуда забирает)
Требования которые надо будет реализовать могут быть к примеру один файл на клиента, файл должен быть определенной структуры с определенным названием. Зачем это все кодить во внешнем приложении?
Да. Я тоже такое делал. Интеграция с CRM написанная полностью на X++ для D365FO. Применял дважды. В первый раз, потому что родного от Майкрософта еще не существовало. Второй раз, потому что логика была сложная. Надо было для каждой единицы товара создавать одну отдельную строку в ISV решении.

А вот сейчас бьюсь с Dual Write. Ох глюкавая... Но вроде завелась.
За это сообщение автора поблагодарили: Vadik (1).
Теги
aif, ax2012, change tracking, интеграция, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX2012 Общие справочники поставщиков и клиентов PTG DAX: Функционал 2 11.06.2015 15:39
Импорт адресов для существующих клиентов и поставщиков IKA DAX: Программирование 0 10.12.2013 21:04
ax 3.0 Экспорт справочников во внешнюю систему, по какому ключу связаться? Shakr DAX: Программирование 2 11.11.2008 11:34
Сергей Герасимов: О технической поддержке клиентов по продуктам Microsoft Dynamics Blog bot DAX Blogs 4 13.02.2007 14:58
Коды клиентов в CRM - проблема Zabr DAX: Функционал 5 01.12.2003 12:41

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:15.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.