Как правильно считать деньги в базе данных, Роман...

29
Как правильно считать деньги в базе данных? Роман Друзягин технический директор, 404 Group

Upload: ontico

Post on 15-Jun-2015

826 views

Category:

Internet


6 download

DESCRIPTION

Доклад Романа Друзягина на HighLoad++ 2014.

TRANSCRIPT

Page 1: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Как правильно считать деньги в базе данных?Роман Друзягинтехнический директор, 404 Group

Page 2: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

“Задачи разработки в вебе можно разделить

на две части: бухгалтерия, где все надо точно

учитывать, и рисование прогресс-баров.”

Page 3: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Любой web-ориентированный бизнес должен считать деньги.

Многие делают это как попало.

Осознание важности вопроса приходит после первой серьезной неприятности.

Page 4: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Причины?

Отсутствие понимания предметной области.

Отсутствие общей компетентности в области Web-разработки.

Page 5: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Какие бывают неприятности?

Неправильно спроектировали.

Типичные симптомы: Не ясно, как добавить новый тип денежной операции. Биллинг вдруг “разъехался” и не понятно, как его чинить.

Page 6: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Какие еще бывают неприятности?Неправильно внедрили.

Типичные симптомы:

транзакции придумали трусы, давайте держать исходную информацию для биллинга в Редисе;

не понятно, почему количество денег в точке А не соответствует количеству денег в точке Б;

это нормально, когда база “упала” и потеряла при этом немного денег (хорошо, если немного).

Page 7: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Еще неприятности?

Неправильно эксплуатируем.

Типичные симптомы:

Подсчет денег периодически ставит “колом” полбазы.

Ошибки внедрения (типа проблем с округлением и отсутствием constraint checks) на больших объемах приобретают катастрофический масштаб.

Page 8: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Что такое вообще двойная запись и как ведется учет финансов?

Page 9: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Система двойной записи

Придумана итальянскими купцами еще в XV веке.

Проста и прозрачна.

Будем использовать очень упрощенную схему.

Page 10: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Счета (согласно плану счетов): Активные и пассивные. Обладают номером и названием. Еще бывают субсчета, но это уже бухучет.

Расчет строится по принципу долга: Долг внешнего мира по отношению к нам (активы); Долг от нас внешнему миру (пассивы).

Page 11: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Дебет и кредитАктивные счета

Дебет — приход средств. Кредит — расход.

Пассивные счета Дебет — расход средств. Кредит — приход.

Page 12: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Проводка ID, дата, первый счет, второй счет, сумма, комментарий.

Page 13: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Двойная запись Фиксируются приход и расход. Используется два счета. Для счета указывается способ использования. Деньги, откуда-то ушедшие, должны куда-то прийти!

Page 14: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

ИтогоЖурнал проводок

Двойная запись. Балансы не подводятся.

Главная книга Счет на странице. Номер проводки. Дата. Дебет. Кредит. Сальдо.

Page 15: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Как это работает?

Page 16: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Как это работает?

Page 17: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Как это работает?

Page 18: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Как это работает?

Page 19: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Что должна содержать система? Счета и типы счетов. Владельцы счетов и типы владельцев счетов. Типы операций в системе (транзакции с т.з. Бизнеса). Операционные периоды. Журнал проводок (“двойная запись”). Список бизнес-транзакций (“главная книга”).

Page 20: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Пример реализации для СУБД

Page 21: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Что дает эта модель? Простота в понимании. Расширяемость. Адекватность исполнения OLAP. Сравнительно невысокие накладные расходы на поддержание. Встроенные механизмы диагностики проблем.

Page 22: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Для среднестатической “Web-овой” системы этого достаточно, чтобы взлететь.

Вменяемыми усилиями можно “прикрутить” стандартные “хотелки” бизнеса: поддержка разных валют, “заморозка” средств, подведение балансов (можно прикинуться “оперденью”) и др.

Page 23: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Важно!

Не делайте всю обработку денежных операций “онлайново”.

Используйте очереди и асинхронную обработку.

Page 24: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Причины?

1. Масштабирование

При росте объемов легче будет расширять процессинг всего этого хозяйства.

Page 25: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Причины?

2. Расширяемость

Имея очереди, проще интегрировать внешний сервис с приемлемо гарантируемой корректностью внесения средств.

Page 26: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Причины?

3. Обслуживание

Меньше проблем с диагностикой проблем конкурентного доступа, осуществлением планового (и не очень) downtime, и т.д.

Page 27: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Поиск проблем?Такая система учета денег с высокой вероятностью гарантирует поиск проблемы в пределах одной лишь таблицы – журнала проводок.

Сумма проводок по конкретному типу транзакции должна сходиться в ноль.

Для упрощения задачи диагностики можно заранее сделать ряд хранимых процедур (или Web-интерфейс).

Page 28: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Что еще?Этим способом можно (и нужно) учитывать не только деньги, но и любые другие ценности, если подразумевается их передача от одного лица другому.

Мы так считали выдачу и обмен баллов на “ачивки” в социальной сети.

Page 29: Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

Вопросы?

Роман Друзягин

[email protected]