Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Проектируется система, которая будет содержать платежные транзакции. Транзакций в теории может быть очень много, скажем миллион в час. Каждая запись должна содержать id этой транзакции, id карты с которой пришла, и другие параметры, например дату-время и кучу всего прочего. Не хочется изобретать велосипед, таких систем наверняка вагоны и маленькая тележка. Есть подозрение что сделав обычную таблицу с identity работать нормально не будет из-за всяких race conditions и прочего. Каким образом делаются таблицы где требуется массированная вставка строк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 09:16 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordЕсть подозрение что сделав обычную таблицу с identity работать нормально не будет из-за всяких race conditions и прочего. Каким образом делаются таблицы где требуется массированная вставка строк?Думаете существует какое-то заклинание по созданию волшебно-быстрой таблицы ? :) По возможности меньше полей и индексов. Поля желательно минимальной длины. Некоторые советуют использовать char вместо varchar и краткую дату, если не важны секунды и следующее столетие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 09:22 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenford, вряд ли identity узкое место. Лог, индексы, сама генерация записи, ну и железо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 09:32 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
LSVДумаете существует какое-то заклинание по созданию волшебно-быстрой таблицы ? :) По возможности меньше полей и индексов. Поля желательно минимальной длины. Некоторые советуют использовать char вместо varchar и краткую дату, если не важны секунды и следующее столетие. может и существует, для этого и спрашиваю) Меньше полей конечно понятно, но их-же не сделаешь меньше чем требуется для работы. Поэтому может например id'шники для строк как-то отдельно генерируются в другой таблице, или вообще разбивается на несколько таблиц или еще что-нибудь в этом роде. Кроме того еще имеет место быть такие вещи как indexed views для хранения остатка по картам что-бы не делать такие запросы на "живой" таблице, все это в результате выполняется внутри транзакции и удлиняет ее, тоже непонятно нормальное решение или как-то таские вещи по-другому делаются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 09:37 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
TaPaKвряд ли identity узкое место. Лог, индексы, сама генерация записи, ну и железо... ну вот и интересует кто уже подобные велосипеды делал и проходил этапы определения что и как можно заоптимизировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 09:39 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenford, А если In memory поробывать? Не идеал конечно, но если нагрузка и впрямь столь серьезная может и подойдет. Хотя если честно с банками дело не имел и не знаю как должно быть в этой сфере :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 09:58 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
aleksrovstenford, А если In memory поробывать? Не идеал конечно, но если нагрузка и впрямь столь серьезная может и подойдет. Хотя если честно с банками дело не имел и не знаю как должно быть в этой сфере :) Казачок то заслатый! ЗЫ. Тредстартер - чудак. Не верит, что "простая таблица" будет работать быстро, но верит, что кучка простых таблиц со сложносочинеными связями будет работать "быстро". Чудесны дела твои, осподи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 10:14 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
aleks2, Ага, пишу прямиком из Редмонда. Тут уже была тема что таблицы типа 2012, 2013, 2014, 2015 и т.д. самый быстрый способ :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 10:39 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
aleksrovaleks2, Ага, пишу прямиком из Редмонда. Тут уже была тема что таблицы типа 2012, 2013, 2014, 2015 и т.д. самый быстрый способ :) это быстрый способ управления, а не работы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 10:41 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordТранзакций в теории может быть очень много, скажем миллион в часЭто не нагрузка даже для простого домашнего компьютера. stenfordЕсть подозрение что сделав обычную таблицу с identity работать нормально не будет из-за всяких race conditions и прочего.Наймите для проектирования системы специалиста у которого есть знания, а не подозрения. Иначе рискуете очень долго быть объектом граблетерапии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 11:31 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Задача непонятна. Сколько вешать в граммах то? Сколько записей вы будете писать, каким способом? По записи? Пакетно? Bulk insert? Какая нужна производительность записей? 1000 записей в секунду? 10 000? 100 000? 1 000 000? Если ограничения - порядка 10 - 20 тысяч записей в секунду, пишете по одной записи, короткими транзакциями, в 1 таблицу - никакой дополнительной оптимизации не надо. Сгодится совершенно ординарный сервер в ценовом диапазоне до 500 тыс. Дисковую подсистему только продумайте, и, возможно, сеть. Если вам нужно до 100 000 в секунду, то тоже никакой оптимизации особой не надо. Нужно много памяти, много ядер (но можно - относительно низкой частоты, не 1С чай), SSD диски (причем под логи - обязательно). Можно таблицу на секции порезать и по разным дискам, висящим на разных каналах контроллера разнести . И железяка потребуется несколько суровее. А вот если речь идет примерно о миллионе в секунду и больше - вот тут уже всё сурово. Тут уже нужно думать о специализированных решениях (например - Parallel Data Warehouse), и биться с разнесением таблицы по разным серверам и т.д. А из рекомендаций к архитектуре - всё просто и стандартно. Одна таблица. Можно широкую, но одну. Если для этого потребуется денормализовать схему данных - денормализуйте. Короткие типы данных. Где можно использовать фиксированные типы - лучше использовать их. Используйте datetime2 вместо datetime. Там где это возможно, избегайте NULLable полей. В качестве синтетического ключа - identity (но по нему совершенно необязательно строить кластерный индекс). Никаких триггеров. Никаких внешних ключей. Точнее - констрейнтов связанных с ними. Минимум индексов. Самый минимум индексов. Никаких индексированных представлений, особенно сложных. Если нужна аналитика - лучше ее делать в соседней таблице, в соседней базе или на соседнем сервере. Если она кричи как нужна здесь и сейчас - то копайте в сторону 2016 сервера и колоночных индексов. Их как раз рекламируют как серебряную пулю для таких случаев. Как то так, ИМХО... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 11:37 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggster, в общем всё так, только column store убьют вставку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 11:40 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordЕсть подозрение что сделав обычную таблицу с identity работать нормально не будет из-за всяких race conditions и прочего. Каким образом делаются таблицы где требуется массированная вставка строк? Вероятно вопрос касается только 1 поля: какого типа должен быть ключ. Если сделать ключ по guid и генерить его на клиенте, то вставки будут работать быстрее, чем на Identity при условии что данные валятся от разных коннектов (например клиентбанк) Если данные массово переливать из одной тарелки в другую под одним коннектом, оставить identity ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 12:04 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
TaPaKuaggster, в общем всё так, только column store убьют вставку В 2016SP1 они ж кричат, что всё, наконец, заработало быстро и правильно? Это ж главная фича 2016! Может кто пробовал уже? Действительно плохо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 12:36 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggsterTaPaKuaggster, в общем всё так, только column store убьют вставку В 2016SP1 они ж кричат, что всё, наконец, заработало быстро и правильно? Это ж главная фича 2016! Может кто пробовал уже? Действительно плохо?Оно же не для OLTP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 13:31 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggsterЗадача непонятна. Сколько вешать в граммах то? Сколько записей вы будете писать, каким способом? По записи? Пакетно? Bulk insert? Какая нужна производительность записей? 1000 записей в секунду? 10 000? 100 000? 1 000 000? Если ограничения - порядка 10 - 20 тысяч записей в секунду, пишете по одной записи, короткими транзакциями, в 1 таблицу - никакой дополнительной оптимизации не надо. Сгодится совершенно ординарный сервер в ценовом диапазоне до 500 тыс. Дисковую подсистему только продумайте, и, возможно, сеть. Если вам нужно до 100 000 в секунду, то тоже никакой оптимизации особой не надо. Нужно много памяти, много ядер (но можно - относительно низкой частоты, не 1С чай), SSD диски (причем под логи - обязательно). Можно таблицу на секции порезать и по разным дискам, висящим на разных каналах контроллера разнести . И железяка потребуется несколько суровее. А вот если речь идет примерно о миллионе в секунду и больше - вот тут уже всё сурово. Тут уже нужно думать о специализированных решениях (например - Parallel Data Warehouse), и биться с разнесением таблицы по разным серверам и т.д. А из рекомендаций к архитектуре - всё просто и стандартно. Одна таблица. Можно широкую, но одну. Если для этого потребуется денормализовать схему данных - денормализуйте. Короткие типы данных. Где можно использовать фиксированные типы - лучше использовать их. Используйте datetime2 вместо datetime. Там где это возможно, избегайте NULLable полей. В качестве синтетического ключа - identity (но по нему совершенно необязательно строить кластерный индекс). Никаких триггеров. Никаких внешних ключей. Точнее - констрейнтов связанных с ними. Минимум индексов. Самый минимум индексов. Никаких индексированных представлений, особенно сложных. Если нужна аналитика - лучше ее делать в соседней таблице, в соседней базе или на соседнем сервере. Если она кричи как нужна здесь и сейчас - то копайте в сторону 2016 сервера и колоночных индексов. Их как раз рекламируют как серебряную пулю для таких случаев. Как то так, ИМХО... спасибо, полезная информация. Предположим убрали внешние ключи, индексы и таблицу оставили кучей. Однако с информацией в таблице-то все равно надо как-то работать, надо по запросу показать к примеру все транзакции определенной карты, как минимум индекс по id карты получается должен быть, посчитать баланс карты - тут index view'шки нужны, не высчитывать-же его на боевой таблице на каждый чих. Причем не получится его как-то постфактум слить в другую таблицу и посчитать там - баланс должен быть актуален немедленно что-бы карта в минус не ушла пока аналитика где-то там пересчитывается. Как все эти проблемы решаются? Точное число транзакций неизвестно, это зависит от обьема бизнеса, сегодня может быть небольшой, те-же несколько тысяч в секунду, но через пару лет могут до сотен тысяч вырасти - не перекраивать-же систему из-за этого, архитектурно надо сразу правильно сделать с прицелом на большие обьемы Про колоночные индексы почитаю, но до 2016 как-то эти проблемы-же решались? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 13:31 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordПредположим убрали внешние ключи, индексы и таблицу оставили кучей. Однако с информацией в таблице-то все равно надо как-то работать, надо по запросу показать к примеру все транзакции определенной карты, как минимум индекс по id карты получается должен бытьНе надо без индексов. Просто минимизируйте их количество. stenfordпосчитать баланс карты - тут index view'шки нужны, не высчитывать-же его на боевой таблице на каждый чихМожно хранить баланс в другой таблице, в картах. stenfordчерез пару лет могут до сотен тысяч вырасти - не перекраивать-же систему из-за этого, архитектурно надо сразу правильно сделать с прицелом на большие обьемыМожно делать распределённую систему, однако нужно всё таки точнее прогнозировать потребности. Может быть, разумнее потом глобально перекроить систему, когда возникнет потребность, чем сразу творить монструозную нетленку? Собственно, 100 тысяч траназкций в секунду - это 3000 миллиардов транзакций в год, мне кажется, столько на нашей планете пока нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 14:36 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgМожет быть, разумнее потом глобально перекроить систему, когда возникнет потребность, чем сразу творить монструозную нетленку? дА! uaggsterКак то так, ИМХО... Да! Собственно вопрос к топикастеру кто и как туде будет данные всувать? Много клиентов, или один/два сервиса платежей - пачками. Пачками вероятно быстрее. И Да. Но... А почему денормализовать? Разьве не лучше что там были только ключи и данне (сумма платежа т.е.). Тогда вставщих сможет себе закешировать наборы ключей классификаторов и формировать готовую запись на своей стороне. А почему секции? Ну вернее, как вариант для тестирования , я б попробовал сделать "горячую" секцию в виде таблицы без индексов вообще, на отдельной файловой группе; и "рабочую" секцию в виде таблицы с кластерником и минимумом нужных индексов. Вставка транзакций велась бы в горячую секцию, а в рабочую производился бы периодический перенос данных. Далее горячую секцию на N-файлов раскидать (т.е. файлгруппа из N-файлов), чтоб уменьшить вероятность зависонов из-за LACH блокировок на GAM, SGAM и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 15:14 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
человек_ниоткудаalexeyvgМожет быть, разумнее потом глобально перекроить систему, когда возникнет потребность, чем сразу творить монструозную нетленку? дА! uaggsterКак то так, ИМХО... ... А почему денормализовать? Разьве не лучше что там были только ключи и данне (сумма платежа т.е.). Тогда вставщих сможет себе закешировать наборы ключей классификаторов и формировать готовую запись на своей стороне. Имелось ввиду, чтобы не осуществлялась вставка в структуру Master-Detail (т.е. заголовочные данные - в одной таблице, расшифровка по позициям - во второй и т.д.) То, что можно использовать коды справочников - это понятно. Вот только в высоконагруженных системах нежелательно привязывать эти справочники с помощью декларативной ссылочной целостности. Оно, конечно, потенциальная дыра в консистентности информации, но поддержание этих связей уж очень больно по производительности вставок/удалений/изменений бьёт. человек_ниоткудаА почему секции? Ну вернее, как вариант для тестирования , я б попробовал сделать "горячую" секцию в виде таблицы без индексов вообще, на отдельной файловой группе; и "рабочую" секцию в виде таблицы с кластерником и минимумом нужных индексов. Вставка транзакций велась бы в горячую секцию, а в рабочую производился бы периодический перенос данных. Далее горячую секцию на N-файлов раскидать (т.е. файлгруппа из N-файлов), чтоб уменьшить вероятность зависонов из-за LACH блокировок на GAM, SGAM и т.п. Да нет же, всё проще. Если поток данных - очень интенсивный, то можно пропорционально снизить нагрузку на дисковую подсистему просто порезав файл с данными на части, и разместив эти части на разных каналах контроллера. Т.е. канал на диск станет ... ну... в N раз шире, где N - число частей. Разумеется, это можно сделать просто поместив таблицу в файловую группу из нескольких файлов. Но тогда сервер будет делить данные так, как ему хочется. А порезав таблицу на секции - мы этот процесс контролируем, и можем какие то еще дополнительные преимущества получить. Кстати, по Вашей схеме можно просто 2 таблицы соорудить: горячую (за текущий день, час и т.д.) и холодную неизменяемую, с кучей индексов, колоночных в т.ч. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 15:55 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgСобственно, 100 тысяч траназкций в секунду - это 3000 миллиардов транзакций в год, мне кажется, столько на нашей планете пока нет. Вот тут не согласен. 100 тысяч траназкций в секунду может быть 10 минут в сутки :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 16:03 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggsteralexeyvgСобственно, 100 тысяч траназкций в секунду - это 3000 миллиардов транзакций в год, мне кажется, столько на нашей планете пока нет. Вот тут не согласен. 100 тысяч траназкций в секунду может быть 10 минут в сутки :)Ну, собственно, это вопрос о функциях самой системы. Это аналитическая система? Или ОЛТП - платёжная система? Если первое, то будут пакетные вставки, и вообще тогда эти объёмы не вызывают каких то вопросов. А во втором случае таких пиков не будет. Просто нет в мире стольких устройств - источников платежей. В обоих случаях это будет не просто табличка с огромным потоком вставок; неминуемо будут разнообразнейшие запросы и обработки, справочники, и целостность данных для финансовых инструментов важнее быстродействия. А в случае платёжной системы записей в разные таблицы будет намного больше, чем собственно транзакций. Во втором случае нужно делать распределённую систему, и для надёжности, и для скорости. Если там действительно большие нагрузки (национальная платёжная система?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 17:11 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggsterИмелось ввиду, чтобы не осуществлялась вставка в структуру Master-Detail (т.е. заголовочные данные - в одной таблице, расшифровка по позициям - во второй и т.д.) Ну если в этом смысле, то вопросов нет. uaggsterРазумеется, это можно сделать просто поместив таблицу в файловую группу из нескольких файлов. Но тогда сервер будет делить данные так, как ему хочется. А порезав таблицу на секции - мы этот процесс контролируем, и можем какие то еще дополнительные преимущества получить. Я имелл ввиду секционирование не декларативными инструментами SQL (partiton scheme и т.д.), а именно две таблицы сделать. Маленькую в которую будет вставка новых данных вестись, и большую в которую будет периодическая выгрузка из маленькой делаться. Резать на секции я считаю надо уже после того как система будет работать в с продуктивной нагрузкой. Т.к. обычно угадать с этим очень трудно. На моём опыте только не очень удачные попытки, когда получалось что в одну секцию 90% потока идёт. uaggsterКстати, по Вашей схеме можно просто 2 таблицы соорудить: горячую (за текущий день, час и т.д.) и холодную неизменяемую, с кучей индексов, колоночных в т.ч. Ну так я и предложил, вы прямо эту цитату вырезали. Просто дополнительно таблицу с "горячей" секцией на многофайловую файлгруппу положить. Опять же - можно и 2 горячих таблицы сделать, и на два канала SAN (я ведь правильно понял что имеется ввиду контроллер SAN) их повесить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 19:24 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgМожно хранить баланс в другой таблице, в картах. так делать не хочется, во-первых расчет может оказаться просто неверным из-за какого-нибудь трудноуловимого бага при массированной вставке, во-вторых update тоже не бесплатный и идет в той-же транзакции, и еще не факт что он будет много быстрее чем индексированная вьюшка производимая самим сервером (правда надо еще проветилировать производительность этих вьюшек на больших обьемах) alexeyvgМожно делать распределённую систему, однако нужно всё таки точнее прогнозировать потребности. Может быть, разумнее потом глобально перекроить систему, когда возникнет потребность, чем сразу творить монструозную нетленку? сразу делать к примеру то-же секционирование не стоит, согласен, на секции можно пилить и потом, когда обьемы вырастут. Проектирование-же структур таблиц сразу надо делать оптимальным, какой смысл ее делать неверно а затем переделывать? alexeyvgСобственно, 100 тысяч траназкций в секунду - это 3000 миллиардов транзакций в год, мне кажется, столько на нашей планете пока нет. как тут уже написали, может быть спайк активности в короткий промежуток времени, условно в 12 часов все пошли на обед и платят картами. А шлюзы платежных систем (мастеркард к примеру) отслеживает проседание в отклике и при определенном проценте выхода из требуемого времени отклика на компанию-провайдера накладываются нехилые штрафы (сотни тысяч долларов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 02:25 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
человек_ниоткудаДа! Собственно вопрос к топикастеру кто и как туде будет данные всувать? Много клиентов, или один/два сервиса платежей - пачками. Пачками вероятно быстрее. много мелких коннектов, для каждой транзакции шлюз открывает отдельный tcp-ip коннект ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 02:28 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordalexeyvgМожно делать распределённую систему, однако нужно всё таки точнее прогнозировать потребности. Может быть, разумнее потом глобально перекроить систему, когда возникнет потребность, чем сразу творить монструозную нетленку? сразу делать к примеру то-же секционирование не стоит, согласен, на секции можно пилить и потом, когда обьемы вырастут. Проектирование-же структур таблиц сразу надо делать оптимальным, какой смысл ее делать неверно а затем переделывать?Так вот, я утверждаю, что оптимальность структуры заключается в её устойчивости к сбоям, полноте и однозначности передачи бизнес-логики данных, декларативном обеспечении целостности, и т.д. А не в "скорости вставки". stenfordак тут уже написали, может быть спайк активности в короткий промежуток времени, условно в 12 часов все пошли на обед и платят картамиДа это понятно, что могут быть пики. Я просто призываю стараться максимально корректно рассчитывать реальную нагрузку, в т.ч. пиковую. Что бы нагрузка составила 100 тыщ транзакций в секунду, нужно, что бы в обед 10 миллионов человек подошли к миллиону терминалов и совершили операции. Вы будете бслуживать миллион терминалов на старте? Тогда ок, ваши расчёты правильные. stenfordalexeyvgМожно хранить баланс в другой таблице, в картах. так делать не хочется, во-первых расчет может оказаться просто неверным из-за какого-нибудь трудноуловимого бага при массированной вставке, во-вторых update тоже не бесплатный и идет в той-же транзакции, и еще не факт что он будет много быстрее чем индексированная вьюшка производимая самим сервером (правда надо еще проветилировать производительность этих вьюшек на больших обьемах)Вот именно, нужно сравнить. Вьюшка пересчитывает при апдэйте всю историю для данных значений полей группировки (то есть по номеру карты), а триггер на вставку будет апдэйтить только одну запись. Я так сразу не могу сказать, что эффективнее, но на мой взгляд эффективнее хранить баланс, особенно при удлинении истории хранения. Насчёт баги - ну, писать надо правильно. Это ведь очень простая логика, её вполне реально надёжно, это ведь один оператор апдэйта в триггере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:00 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Как то тестировал я подобное: одновременный перевод денег по зарплатной программе. Так вот на моём домашнем компе, где я развернул и базу и приложение я дошёл до сотни запросов в секунду на обычных таблицах с IDENTITY. А ТС предпологает, что у него может быть когда-нибудь будет 278 запросов в секунду. ИМХО в первую очередь затык будет на стороне приложения, а не БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:40 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenford, на чём кстати клиента БД писать будете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:40 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgДа это понятно, что могут быть пики. Я просто призываю стараться максимально корректно рассчитывать реальную нагрузку, в т.ч. пиковую. Что бы нагрузка составила 100 тыщ транзакций в секунду, нужно, что бы в обед 10 миллионов человек подошли к миллиону терминалов и совершили операции. Вы будете бслуживать миллион терминалов на старте? Тогда ок, ваши расчёты правильные. что-бы нагрузка составила 100 тысяч в секунду, надо что-бы 100 тысяч человек произвели ее в эту самую секунду. В результате половина из них получит отклик не в 2 секунды, а в 10. alexeyvgВот именно, нужно сравнить. Вьюшка пересчитывает при апдэйте всю историю для данных значений полей группировки (то есть по номеру карты), а триггер на вставку будет апдэйтить только одну запись. Я так сразу не могу сказать, что эффективнее, но на мой взгляд эффективнее хранить баланс, особенно при удлинении истории хранения. Насчёт баги - ну, писать надо правильно. Это ведь очень простая логика, её вполне реально надёжно, это ведь один оператор апдэйта в триггере. нет, в триггере точно никакой логики не будет. Правильно код без багов конечно очень хорошая цель, но недостижимая, поэтому первым делом надо сводить к минимуму саму возможность его допустить, а не декларировать такие цели и потом искать и наказывать виновных. Соответственно что способен сделать сам сервер - он сам и должен делать. Далеко не факт что вьюшка пересчитывает весь обьем строк, она вполне может оптимизированна для таких случаев, а даже если сейчас нет - то может в будущем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:49 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenford, авторчто-бы нагрузка составила 100 тысяч в секунду, надо что-бы 100 тысяч человек произвели ее в эту самую секунду. В результате половина из них получит отклик не в 2 секунды, а в 10. вы бухгалтер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:52 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
skyANAstenford, на чём кстати клиента БД писать будете? клиент либо будет типа вебсервиса вызываемого самим банком, либо какой-то сервис будет который слушает tcp-ip соединения шлюза. Это еще не решено ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:53 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordчто-бы нагрузка составила 100 тысяч в секунду, надо что-бы 100 тысяч человек произвели ее в эту самую секунду. В результате половина из них получит отклик не в 2 секунды, а в 10. А Вы уже подумали о том, что до базы дело в этом случае и не дойдёт, очередь образуется на веб-сервере или последний вообще приляжет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:54 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordskyANAstenford, на чём кстати клиента БД писать будете? клиент либо будет типа вебсервиса вызываемого самим банком, либо какой-то сервис будет который слушает tcp-ip соединения шлюза. Это еще не решено Вот надо бы решить, коль Вы собрались обеспечивать 100 тыс. запросов в секунду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:55 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
skyANAА Вы уже подумали о том, что до базы дело в этом случае и не дойдёт, очередь образуется на веб-сервере или последний вообще приляжет :) это отдельный вопрос, не относящийся к таблицам базы данных) Решатся тоже будет отдельно какой-нибудь вебфермой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 09:57 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordskyANAА Вы уже подумали о том, что до базы дело в этом случае и не дойдёт, очередь образуется на веб-сервере или последний вообще приляжет :) это отдельный вопрос, не относящийся к таблицам базы данных) Решатся тоже будет отдельно какой-нибудь вебфермой Я намекаю Вам на то, что Вы не на то тратите время. C вашими 278 вставок в секунду БД легко справится на обычных таблицах с IDENTITY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:05 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgВот именно, нужно сравнить. Вьюшка пересчитывает при апдэйте всю историю для данных значений полей группировки (то есть по номеру карты), а триггер на вставку будет апдэйтить только одну запись. Ненене! "Вот так у нас все олени и кончились!"(С) Это убьет всю производительность на корню, и при некоторой удаче можно еще натрахаться с локами-дедлоками по самое небалуйся. Наверное, всё же схема "Горячая таблица" без индексов (ну, в разумном понимании слова "без") - "Холодная таблица" со всевозможными индексами и предрассчитанными агрегатами, пополняемая из горячей таблицы в периоды минимальной активности потребителей - наше всё. Знаете, а я б еще и горячую таблицу на секции бы порезал. По часам, или по минутам, например. Уж больно идея удалять данные в горячей таблице просто переключением метаданных привлекает. Правда, не совсем понятно, как тогда холодную таблицу формировать, если у нее секции будут шире (ну, если ее тоже по времени порезать). С другой стороны, если, например, количество транзакций за день - небольшое, ну миллион - 10 миллионов, то, наверное, можно и не париться. Порезать холодную таблицу по количеству опердней, ну, пусть 365, а в оперативной - держать две секции: До/После времени закрытия опердня. И по процедуре закрытия опердня формировать из секции "До" горячей таблицы данные для секции, соответствующей конкретному опердню холодной таблицы, уже со всеми индексами, индексированными вью, таблицами предрассчитанных агрегатов, свистелками и перделками. Понятно, что в отдельную табличку/таблички, рядом с холодной. А потом одномоментно выносить переключением метаданных секцию "ДО" из горячей таблицы и включать подготовленные данные в холодную. Причем холодную таблицу - можно и на соседнем сервере держать, проблем то... Ну, понятно, еще сверххолодная таблица понадобиться, из одних агрегатов за передыдущие годы... Т.е. это классическая схема "хранилище - оперативные данные", только отказ в обслуживании на момент пополнения хранилища недопустим, а так - никаких чудес. Всё ИМХО, разумеется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:13 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggster, авторУж больно идея удалять данные в горячей таблице просто переключением метаданных привлекает. действительно, это жутко необходимый функционал для транзакций... 2-30млн в сутки вообще не требуют никаких особых приседаний. Годовые таблицы, для спихивания подальше. это то что вижу, а так да можно придумывать сколько угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:25 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordalexeyvgДа это понятно, что могут быть пики. Я просто призываю стараться максимально корректно рассчитывать реальную нагрузку, в т.ч. пиковую. Что бы нагрузка составила 100 тыщ транзакций в секунду, нужно, что бы в обед 10 миллионов человек подошли к миллиону терминалов и совершили операции. Вы будете обслуживать миллион терминалов на старте? Тогда ок, ваши расчёты правильные. что-бы нагрузка составила 100 тысяч в секунду, надо что-бы 100 тысяч человек произвели ее в эту самую секунду. В результате половина из них получит отклик не в 2 секунды, а в 10.Не, такого точно не будет. Всё распределяется равномерно, жизнь не дискретна. От миллиона терминалов транзакции будут распределяться очень, очень равномерно. Неравномерность возможна только в том случае, если кто то буферизирует этот миллион транзакций, накопит их за 10 секунд, а потом плюнет в вас. Но тогда латентность создаёте не вы, и вся система в целом нормально работать не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:14 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
"Для скорости" существуют нереляционные/нетранзакционые СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:16 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggsteralexeyvgВот именно, нужно сравнить. Вьюшка пересчитывает при апдэйте всю историю для данных значений полей группировки (то есть по номеру карты), а триггер на вставку будет апдэйтить только одну запись. Ненене! "Вот так у нас все олени и кончились!"(С) Это убьет всю производительность на корню, и при некоторой удаче можно еще натрахаться с локами-дедлоками по самое небалуйся.Почему убьёт? Данных же будет читаться меньше, а писаться столько же, по сравнению с мат-вьюхой. Дедлоками придётся управлять, да. Впрочем, можно, конечно, и без триггеров, и соответственно не апдэйтить итог в той же транзакции, но это очень сильно поднимает требования к качеству кода и архитектуре. uaggsterС другой стороны, если, например, количество транзакций за день - небольшое, ну миллион - 10 миллионов, то, наверное, можно и не париться. Порезать холодную таблицу по количеству опердней, ну, пусть 365, а в оперативной - держать две секции:С миллионом непонятно зачем вообще париться с секциями, "порезать" и т.д.? Но ТС говорит про стотыщ в секунду, то есть 8 миллиардов 640 миллионов в сутки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:22 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов"Для скорости" существуют нереляционные/нетранзакционые СУБД.Да, отличный выбор для финансовой системы :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:23 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgВладислав Колосов"Для скорости" существуют нереляционные/нетранзакционые СУБД.Да, отличный выбор для финансовой системы :-) Так выбор зависит от контекста задачи, который автор тщательно скрывает :) Ему шашечки или ехать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:30 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordнет, в триггере точно никакой логики не будет. Правильно код без багов конечно очень хорошая цель, но недостижимая, поэтому первым делом надо сводить к минимуму саму возможность его допустить, а не декларировать такие цели и потом искать и наказывать виновных. Соответственно что способен сделать сам сервер - он сам и должен делать. Далеко не факт что вьюшка пересчитывает весь обьем строк, она вполне может оптимизированна для таких случаев, а даже если сейчас нет - то может в будущем.И вообще, непонятна концентрация на "таблице транзакций". На каждую "транзакцию" будет создаваться десятки связанных записей, на разных этапах обработки, под управлением разных сервисов, с некоторыми расчётами, с соблюдением целостности и т.д., т.к. у вас же не аналитическая система, а обработка платежей. Поэтому повторю своё ИМХО - решение проблем масштабирования нужно закладывать архитектурно в виде распределения компонентов системы. Что, конечно, не исключает оптимального написания кода и оптимальной модели данных внутри узла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:31 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Для меня его способ решения приема платежей вовсе не очевиден, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 11:32 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Тут уже предлагали In Memory. Не вижу причин, почему нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:01 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Подозреваю, что автор хочет обеспечить логическую транзакционнность с внешними системами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:04 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgВьюшка пересчитывает при апдэйте всю историю для данных значений полей группировки (то есть по номеру карты), а триггер на вставку будет апдэйтить только одну запись.Не всю. Пересчитывается дельтами только по затронутым строкам. Именно поэтому в индексированных представлениях недопустимы max, min и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:26 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
invmalexeyvgВьюшка пересчитывает при апдэйте всю историю для данных значений полей группировки (то есть по номеру карты), а триггер на вставку будет апдэйтить только одну запись.Не всю. Пересчитывается дельтами только по затронутым строкам. Именно поэтому в индексированных представлениях недопустимы max, min и т.п.Дельтами? Не знал, спасибо. Кстати, странно, что max, min недопустимы. Они ведь тоже дельтой вычисляются - добавленное (изменённое) значение больше чем было текущее (для поля группировки, т.е. для ключа view), значит, это новый max ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:51 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
cossack5Тут уже предлагали In Memory. Не вижу причин, почему нельзя.Выключается питание, и в базе нет уже подтверждённых платежей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 12:52 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenfordПричем не получится его как-то постфактум слить в другую таблицу и посчитать там - баланс должен быть актуален немедленно что-бы карта в минус не ушла пока аналитика где-то там пересчитывается. Как все эти проблемы решаются? Точное число транзакций неизвестно, это зависит от обьема бизнеса, сегодня может быть небольшой, те-же несколько тысяч в секунду, но через пару лет могут до сотен тысяч вырасти - не перекраивать-же систему из-за этого, архитектурно надо сразу правильно сделать с прицелом на большие обьемы Ну совсем онлайн не получится, конечно. Если вставка будет не справляться, можно делать только пакетную запись, скажем 1 раз в секунду. Например, накапливать транзакции в промежуточных таблицах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 13:14 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов"Для скорости" существуют нереляционные/нетранзакционые СУБД. Наивняк. "Для скорости" - существует текстовый файл с записью "в конец". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 14:18 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgВладислав Колосов"Для скорости" существуют нереляционные/нетранзакционые СУБД.Да, отличный выбор для финансовой системы :-) А что не так? Волею судеб выплачиваю кредит и меня не парит то, что мои платежи будут обработаны на следующий банковский день. То есть они пихаются в некую очередь, что по всей видимости выгребается каким-то количеством нод-подписчиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 14:27 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
skyANAalexeyvgпропущено... Да, отличный выбор для финансовой системы :-) А что не так? Волею судеб выплачиваю кредит и меня не парит то, что мои платежи будут обработаны на следующий банковский день. То есть они пихаются в некую очередь, что по всей видимости выгребается каким-то количеством нод-подписчиков. нет. В большинстве своём это либо форвардится руками операторов которые разбирают что ж за фигню ты шлёшь или не попали в опердень. ниболее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 14:30 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Да и крупные банковские системы - это давно уже eventual consistency. Поехал я колесить по Европе и операции через банкоматы, в ресторанах и магазинах долетают до менеджера моего банка далеко не моментально и не в одной транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 14:30 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
TaPaKskyANAпропущено... А что не так? Волею судеб выплачиваю кредит и меня не парит то, что мои платежи будут обработаны на следующий банковский день. То есть они пихаются в некую очередь, что по всей видимости выгребается каким-то количеством нод-подписчиков. нет. В большинстве своём это либо форвардится руками операторов которые разбирают что ж за фигню ты шлёшь или не попали в опердень. ниболее Ну окей, подписчик аналоговый. Что это меняет? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 14:32 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
skyANATaPaKпропущено... нет. В большинстве своём это либо форвардится руками операторов которые разбирают что ж за фигню ты шлёшь или не попали в опердень. ниболее Ну окей, подписчик аналоговый. Что это меняет? :) то что твоя транзакция просто меняет состояние, а ниоткуда не вытаскивается и перетаскивается из ноды в ноду, от скуки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 14:35 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
TaPaKuaggster, авторУж больно идея удалять данные в горячей таблице просто переключением метаданных привлекает. действительно, это жутко необходимый функционал для транзакций... 2-30млн в сутки вообще не требуют никаких особых приседаний. Годовые таблицы, для спихивания подальше. это то что вижу, а так да можно придумывать сколько угодно. Гм... Ну, сколько по времени займет удаление 10, к примеру, миллионов записей из 12ти миллионной таблицы? И сколько клиентов будет ждать, пока таблица освободится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 16:18 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggsterTaPaKuaggster, пропущено... действительно, это жутко необходимый функционал для транзакций... 2-30млн в сутки вообще не требуют никаких особых приседаний. Годовые таблицы, для спихивания подальше. это то что вижу, а так да можно придумывать сколько угодно. Гм... Ну, сколько по времени займет удаление 10, к примеру, миллионов записей из 12ти миллионной таблицы? И сколько клиентов будет ждать, пока таблица освободится? я думаю все клиенты придут лично если начнут удалять транзакции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 16:20 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgС миллионом непонятно зачем вообще париться с секциями, "порезать" и т.д.? Но ТС говорит про стотыщ в секунду, то есть 8 миллиардов 640 миллионов в сутки. Миллион - два в день - вполне себе "примерно миллиард" в год. Вполне себе вменяемые объемы, в отношении которых уже придётся как-то заморачиваться по поводу производительности. И опять же, 100 000 в секунду != 8 миллиардов в сутки. Потому что таких секунд может быть всего несколько десятков. (и словить отказ в обслуживании из за того, что система захлебнулась, можно и тогда, когда в сутки она прокачивает не так уж и много данных). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 16:27 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
TaPaKuaggsterпропущено... Гм... Ну, сколько по времени займет удаление 10, к примеру, миллионов записей из 12ти миллионной таблицы? И сколько клиентов будет ждать, пока таблица освободится? я думаю все клиенты придут лично если начнут удалять транзакции Я имею ввиду - переносить из горячей таблицы в холодную :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 16:28 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgКстати, странно, что max, min недопустимы. Они ведь тоже дельтой вычисляются - добавленное (изменённое) значение больше чем было текущее (для поля группировки, т.е. для ключа view), значит, это новый maxПри удалении не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 17:00 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
invmalexeyvgКстати, странно, что max, min недопустимы. Они ведь тоже дельтой вычисляются - добавленное (изменённое) значение больше чем было текущее (для поля группировки, т.е. для ключа view), значит, это новый maxПри удалении не получится.Да, при удалении или уменьшении значения, которое было "MAX" не получится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 18:37 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggsterПорезать холодную таблицу по количеству опердней, ну, пусть 365, а в оперативной - держать две секции: До/После времени закрытия опердня. И по процедуре закрытия опердня формировать из секции "До" горячей таблицы данные для секции, соответствующей конкретному опердню холодной таблицы, уже со всеми индексами, индексированными вью, таблицами предрассчитанных агрегатов, свистелками и перделками. непонятно каким все-же образом вы предлагаете держать баланс актуальным если вьюшка с ним в холодной таблице лежит и обновляется в конце дня? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 02:14 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
invmНе всю. Пересчитывается дельтами только по затронутым строкам. Именно поэтому в индексированных представлениях недопустимы max, min и т.п. круто, это значит от обьемов производительность не должна зависеть и такая вьюшка должна спрaвляться со своей задачей даже на горячей таблице в тысячами записей на данной карте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 02:17 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgИ вообще, непонятна концентрация на "таблице транзакций". На каждую "транзакцию" будет создаваться десятки связанных записей, на разных этапах обработки, под управлением разных сервисов, с некоторыми расчётами, с соблюдением целостности и т.д., т.к. у вас же не аналитическая система, а обработка платежей. не будет там десятков записей в десятках таблиц по крайней мере внутри транзакции, все вещи типа логирования и каких-то обсчетов или сторонний сервисов типа проверки транзакций на AML или на фрод будут в отдельном месте обрабатываться и не задерживать основную транзакцию т.к. ее отклик критичен по времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 02:22 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
skyANAДа и крупные банковские системы - это давно уже eventual consistency. Поехал я колесить по Европе и операции через банкоматы, в ресторанах и магазинах долетают до менеджера моего банка далеко не моментально и не в одной транзакции. ты путаешь settlement у всех этих транзакций и саму авторизацию, я в данном топике про авторизацию говорю, когда ты покупаешь себе кофе в европах авторизация производится немедленно (за парой исключений) т.е. провайдер платежей продавца кофе коннектится к твоему банку и спрашивает кто ты и разрешено-ли тебе потратить эти деньги, в этот момент банк проверяет твой баланс, записывает себе эту транзакцию и отвечает провайдеру что да, давай аппрувь его запрос, после чего провайдер высвечивает approve на платежном аппарате и тебе дают кофе, а твой доступный баланс уменьшается на эту сумму. А "официальная" транзакция вообще придет в банк через неделю и появится у тебя в онлайн-банкинге когда туда поступит и будет обработан текстовый файл со списком всех транзакций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2017, 02:33 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
stenford, Господа, подскажите, как правильно организовать хранение данных в таком случае. Будет одна таблица, в которую будет каждую секунду сыпаться платёжная информация о сделках. Примерно по 10-30 записей в секунду. Объём таблицы предполагается в десятки миллионов записей. Да, таблицу нужно будет сегментировать. Над этой же таблицей будет строиться отчётность OLAP в режиме, близком к real-time. Будет ли отображаться в OLAP свежепоступившая информация? Или нужно будет давать время кубу для пересчёта? Правилен ли такой подход или же нужно делать отдельную базу для OLAP и как-то быстро синхронизировать её с основной OLTP? Объём самой базы данных предполагается в 50-100 Гб. Всего таблиц будет немного, около 25-30. Вся бизнес-логика будет вынесена в микросервисы (на C#, с использованием Entity Framework). Правилен ли такой подход? Предполагается использование MS SQL Server 2017 Standard Edition. Точно ли в Standard Edition есть OLAP, близкий к реал-тайму? Или это только есть в Enterprise Edition? Нашёл достаточно много ограничений для Standard Edition в части быстроты работы с OLAP и быстроты работы в целом: https://docs.microsoft.com/ru-ru/sql/sql-server/editions-and-components-of-sql-server-2017?view=sql-server-2017 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2019, 10:45 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
uaggsterЗадача непонятна. Сколько вешать в граммах то? Сколько записей вы будете писать, каким способом? По записи? Пакетно? Bulk insert? Какая нужна производительность записей? 1000 записей в секунду? 10 000? 100 000? 1 000 000? Если ограничения - порядка 10 - 20 тысяч записей в секунду, пишете по одной записи, короткими транзакциями, в 1 таблицу - никакой дополнительной оптимизации не надо. Сгодится совершенно ординарный сервер в ценовом диапазоне до 500 тыс. Дисковую подсистему только продумайте, и, возможно, сеть. Если вам нужно до 100 000 в секунду, то тоже никакой оптимизации особой не надо. Нужно много памяти, много ядер (но можно - относительно низкой частоты, не 1С чай), SSD диски (причем под логи - обязательно). Можно таблицу на секции порезать и по разным дискам, висящим на разных каналах контроллера разнести . И железяка потребуется несколько суровее. А вот если речь идет примерно о миллионе в секунду и больше - вот тут уже всё сурово. Тут уже нужно думать о специализированных решениях (например - Parallel Data Warehouse), и биться с разнесением таблицы по разным серверам и т.д. А из рекомендаций к архитектуре - всё просто и стандартно. Одна таблица. Можно широкую, но одну. Если для этого потребуется денормализовать схему данных - денормализуйте. Короткие типы данных. Где можно использовать фиксированные типы - лучше использовать их. Используйте datetime2 вместо datetime. Там где это возможно, избегайте NULLable полей. В качестве синтетического ключа - identity (но по нему совершенно необязательно строить кластерный индекс). Никаких триггеров. Никаких внешних ключей. Точнее - констрейнтов связанных с ними. Минимум индексов. Самый минимум индексов. Никаких индексированных представлений, особенно сложных. Если нужна аналитика - лучше ее делать в соседней таблице, в соседней базе или на соседнем сервере. Если она кричи как нужна здесь и сейчас - то копайте в сторону 2016 сервера и колоночных индексов. Их как раз рекламируют как серебряную пулю для таких случаев. Как то так, ИМХО... Правильно ли я Вас понимаю, что для OLAP с количеством транзакций в секунду от 1000 нужна одна широкая таблица? А реляционный OLTP вынести в отдельную базу? Искал решения на базе PostgreSQL, чтобы прикрутиьь к нему нормальный более-менее быстрый OLAP, но так и не нашёл. Какие-то OLAP-решения под PostgreSQL может и существуют, но вряд ли они будут дешёвыми и быстрыми. В нашем случае запаздывание OLAP более чем на 3 секунды недопустимо (при более чем 100 транзакциях в секунду). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2019, 11:07 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
Также, как я понимаю, нужно будет использовать memory optimized таблицы для быстрых OLAP и OLTP? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2019, 11:13 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
EV.PГоспода, подскажите, как правильно организовать хранение данных в таком случае. Будет одна таблица, в которую будет каждую секунду сыпаться платёжная информация о сделках. Примерно по 10-30 записей в секунду. Объём таблицы предполагается в десятки миллионов записей. Да, таблицу нужно будет сегментировать. Над этой же таблицей будет строиться отчётность OLAP в режиме, близком к real-time. Будет ли отображаться в OLAP свежепоступившая информация? Или нужно будет давать время кубу для пересчёта? Правилен ли такой подход или же нужно делать отдельную базу для OLAP и как-то быстро синхронизировать её с основной OLTP?OLAP используют для того, что бы аналитики могли крутить данные, что бы понять, какие же есть между ними зависимости, то есть для аналитиков неважно, старые данные или новые, для определения тенденций свежесть не нужна. А оперативные отчёты, если нужно условно реальное время, лучше делать на свежих данных (или на их рид-онли копии) Т.о. нужно 3 уровня - OLTP для транзакций, копия OLTP для оперативных отчётов, и OLAP для не-опреативной аналитики. Это идеальный вариант. Но если начальство тупое, и непременно "хочет OLAP", можно делать источником данных OLAP базу OLTP, то есть использовать ROLAP , но про букву "R" им не говорить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2019, 13:52 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
alexeyvgEV.PГоспода, подскажите, как правильно организовать хранение данных в таком случае. Будет одна таблица, в которую будет каждую секунду сыпаться платёжная информация о сделках. Примерно по 10-30 записей в секунду. Объём таблицы предполагается в десятки миллионов записей. Да, таблицу нужно будет сегментировать. Над этой же таблицей будет строиться отчётность OLAP в режиме, близком к real-time. Будет ли отображаться в OLAP свежепоступившая информация? Или нужно будет давать время кубу для пересчёта? Правилен ли такой подход или же нужно делать отдельную базу для OLAP и как-то быстро синхронизировать её с основной OLTP?OLAP используют для того, что бы аналитики могли крутить данные, что бы понять, какие же есть между ними зависимости, то есть для аналитиков неважно, старые данные или новые, для определения тенденций свежесть не нужна. А оперативные отчёты, если нужно условно реальное время, лучше делать на свежих данных (или на их рид-онли копии) Т.о. нужно 3 уровня - OLTP для транзакций, копия OLTP для оперативных отчётов, и OLAP для не-опреативной аналитики. Это идеальный вариант. Но если начальство тупое, и непременно "хочет OLAP", можно делать источником данных OLAP базу OLTP, то есть использовать ROLAP , но про букву "R" им не говорить. Отлично. Спасибо за подробный и понятный совет. По Вашему опыту есть ли какие-либо другие быстрые OLAP-решения и не такие дорогие, как MS Standard/Enterprise (так как у MS Standard стоит ~3000 долларов за одно ядро процессора, а Enterprise и вовсе 15k$ за ядро)? Причём для работы с такими хранилищами должны быть стандартные коннекторы для .Net. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2019, 14:01 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
EV.P, Вы хотите организовать BI для отражения биржевой торговли, этим и вызваны немыслимые требования по максимальной задержке актуальности данных, верно? Если так, то, во-первых, на три секунды не прогибайтесь, начинайте торговаться от часа. Во-вторых, сначала постройте ХД и попытайтесь именно им удовлетворить потребности бизнеса. P.S. Год опыта работы со связкой Calypso+RabbitMQ+ХД на MS SQL 2016. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2019, 15:01 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
.Евгений, Нам RabbitMQ не понравился - постоянный жор памяти неизвестно по каким причинам. Из-за этого стабильная работа в режиме 24х7 невозможна (постоянно приходилось перезагружать сервер). Режим работы RabbitMQ был автоматическим (автоматическое подтверждение получения сообщения, автоудаление данных при отключении клиента): Вот код: Код: c# 1. 2. 3. 4. 5. 6. Получается, что жор памяти недетерминированный. В очереди не накапливалось более 10-15 сообщений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2019, 10:07 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
EV.P Правилен ли такой подход или же нужно делать отдельную базу для OLAP и как-то быстро синхронизировать её с основной OLTP? неправилен отдельной, синхронить ETL или репликацию куб(ы) в режим ROLAp если нужна оперативное отражение изменений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2019, 11:06 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
EV.P.Евгений, Нам RabbitMQ не понравился - постоянный жор памяти неизвестно по каким причинам. Из-за этого стабильная работа в режиме 24х7 невозможна (постоянно приходилось перезагружать сервер). У вас невозможна, у многих других - возможна. EV.PРежим работы RabbitMQ был автоматическим (автоматическое подтверждение получения сообщения, автоудаление данных при отключении клиента)... Я правильно понимаю, что при сбое внутри обработчика сообщения данные терялись? Что ж вы творите-то... Моя загрузка данных изначально обеспечивала гарантированную доставку (подтверждение отправляется только после записи сообщения в БД), возможности просмотра и перезагрузки выбранных сообщений в ХД. Плюс prefetch и пакетная обработка, позволяющие на скромной виртуалке обрабатывать (принимать, записывать, парсить и снова записывать) поток 600 сообщений в секунду и более. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2019, 11:16 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
.Евгений, Да, всё правильно. При сбое нам уже не важны данные. RabbitMQ нужен был только для организации правильной очередности и сохранения этой очередности при записи в БД. Если произошёл сбой, то как и куда сохранять данные и как потом их оттуда поднимать когда сервис стартует после перезагрузки сервера - так и не смог найти ответа. Также удалось исследовать, что RabbitMQ на платформе Erlang/OTP катастрофически замусоривает память и жор памяти приводит к сокрушительному сбою в работе уже через пару-тройку часов. В общем, какая-то ересь этот RabbitMQ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2019, 10:29 |
|
||
|
Таблица для транзакций
|
|||
|---|---|---|---|
|
#18+
.ЕвгенийEV.P.Евгений, Нам RabbitMQ не понравился - постоянный жор памяти неизвестно по каким причинам. Из-за этого стабильная работа в режиме 24х7 невозможна (постоянно приходилось перезагружать сервер). У вас невозможна, у многих других - возможна. EV.PРежим работы RabbitMQ был автоматическим (автоматическое подтверждение получения сообщения, автоудаление данных при отключении клиента)... Моя загрузка данных изначально обеспечивала гарантированную доставку (подтверждение отправляется только после записи сообщения в БД), возможности просмотра и перезагрузки выбранных сообщений в ХД. Плюс prefetch и пакетная обработка, позволяющие на скромной виртуалке обрабатывать (принимать, записывать, парсить и снова записывать) поток 600 сообщений в секунду и более. Если можно, поделитесь информацией как и что настроить, чтобы сервис не падал, не жрал память и какой примерно код нужно написать. Очень нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2019, 10:31 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1688406]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 274ms |
| total: | 425ms |

| 0 / 0 |
