Size: a a a

2020 September 25

SP

Sergey Prokhorov in ErlangRus
ну и да, если система внутри себя много данных из IO генерирует (часы, uuid, random numbers) то тут модель сложно будет построить пожалуй
источник

AK

Aleksey Kluchnikov in ErlangRus
держать все в одном генсервере и делать все операции строго по очереди
источник

AK

Aleksey Kluchnikov in ErlangRus
они из коробки будут все по очереди
источник

AK

Aleksey Kluchnikov in ErlangRus
каждую операцию снабдить ключем идемпотентности и синкать на диск после каждой транзакции
источник

P

PsyDebug in ErlangRus
Aleksey Kluchnikov
держать все в одном генсервере и делать все операции строго по очереди
Горлышко
источник

AK

Aleksey Kluchnikov in ErlangRus
причем ответ выдавать только после успешного синка
источник

SP

Sergey Prokhorov in ErlangRus
с транзакциями у нас лично проблем нет. БД транзакционная, операции строго по порядку. Баги были именно в бизнес-логике
источник

AK

Aleksey Kluchnikov in ErlangRus
PsyDebug
Горлышко
для финансовой транзакции не горлышко
источник

AK

Aleksey Kluchnikov in ErlangRus
это то как я вижу это делать
источник

AK

Aleksey Kluchnikov in ErlangRus
и безнес логику в виде дерева, а не графа. Тогда не будет странностей
источник

SP

Sergey Prokhorov in ErlangRus
Aleksey Kluchnikov
для финансовой транзакции не горлышко
у нас в системке есть такой ген-сервер. Называется mnesia locker - рулит локами БД, он один единственный на весь кластер из 6 машин по 64 ядра, 512ГБ памяти каждая...
из за него новые страны раскатывают на Java системе с Oracle, а на нашей уже только то что исторически… (Ну, не совсем так, но упрощённо...)
источник

AK

Aleksey Kluchnikov in ErlangRus
Дерево просто тестится.. как тестить граф вообще фиг знает
источник

ML

Maksim Lapshin in ErlangRus
Sergey Prokhorov
т.е. да, состояние зависит только от того, какие мы дёргаем операции
детерминированный конечный автомат — это очень простая математическая конструкция, которая устроена так:  ты подаешь ей слово из входного словаря на вход, дальше в нём есть карта сопоставления (Состояние,ВходноеСлово) -> (НовоеСостояние,ВыходноеСлово)

Список состояний конечен, словари входные и выходные конечны.

Для такой конструкции есть теорема, которая гласит о том, что за конечное число входных слов можно восстановить карту переходов, т.е. по сути провести полное тестирование.

К реальным компьютерам это малоприменимо, потому что состояний слишком много:   2^количество бит памяти
источник

AK

Aleksey Kluchnikov in ErlangRus
Sergey Prokhorov
у нас в системке есть такой ген-сервер. Называется mnesia locker - рулит локами БД, он один единственный на весь кластер из 6 машин по 64 ядра, 512ГБ памяти каждая...
из за него новые страны раскатывают на Java системе с Oracle, а на нашей уже только то что исторически… (Ну, не совсем так, но упрощённо...)
я имел в виду один процес одна транзакция, а не один процесс на все транзакции
источник

SP

Sergey Prokhorov in ErlangRus
Maksim Lapshin
детерминированный конечный автомат — это очень простая математическая конструкция, которая устроена так:  ты подаешь ей слово из входного словаря на вход, дальше в нём есть карта сопоставления (Состояние,ВходноеСлово) -> (НовоеСостояние,ВыходноеСлово)

Список состояний конечен, словари входные и выходные конечны.

Для такой конструкции есть теорема, которая гласит о том, что за конечное число входных слов можно восстановить карту переходов, т.е. по сути провести полное тестирование.

К реальным компьютерам это малоприменимо, потому что состояний слишком много:   2^количество бит памяти
ну да, в этом смысле конечный автомат. И если на вход подать одну и ту же последовательность операций с теми же аргументами 10 раз, результат каждый раз будет одинаковый (ну, может какие-то минорные детали отличаются)
источник

LW

Lev Walkin in ErlangRus
Мы делали модел-чекинг на SPIN/Promela. Пишешь модель на подмножестве Си (Promela), затем спинчекер елозит по state space и проверяет все углы. Выявило как минимум одну проблему.
источник

LW

Lev Walkin in ErlangRus
Чуть поэргономичнее, чем TLA+, кмк.
источник

ИИ

Иванов Иванов... in ErlangRus
Maksim Lapshin
детерминированный конечный автомат — это очень простая математическая конструкция, которая устроена так:  ты подаешь ей слово из входного словаря на вход, дальше в нём есть карта сопоставления (Состояние,ВходноеСлово) -> (НовоеСостояние,ВыходноеСлово)

Список состояний конечен, словари входные и выходные конечны.

Для такой конструкции есть теорема, которая гласит о том, что за конечное число входных слов можно восстановить карту переходов, т.е. по сути провести полное тестирование.

К реальным компьютерам это малоприменимо, потому что состояний слишком много:   2^количество бит памяти
еще в фунциональной теории чистая функция есть
источник

P

PsyDebug in ErlangRus
Иванов Иванов
еще в фунциональной теории чистая функция есть
Для неё есть ещё условия помимо детерменированности
источник

AB

Alex Bubnov in ErlangRus
Sergey Prokhorov
код системы никак не переделывали, но пришлось добавить моки в тех местах где оно генерировало уникальные id объектов, чтоб id были предсказуемыми (но вроде есть способы как этого избежать, какие-то shim, но мы по старой привычке сделали).

Насчёт конечного автомата не сильно понял. Стейт это, упрощённо, 3 типа объектов: Debt, Fee, Account. Debt ожет быть отдельностоящий, может быть перемещён на Account. Fee может быть только частью Account. И операции типа "перемести Debt с/на/между Account", "добавь/удали Fee", "пришел платежь, распредели его по Debt" "пользователь решил вернуть часть товаров из debt, а оно уже частично оплачено - перераспредели деньги на другие Debt/Fee" "пользователь не платит, давайте спишем всё" "пользователь заявляет что не получил товар, поставим debt на паузу" и т.п.
Основное что проверяем это конечно цифры долга. Но и есть всякие другие поля на объектах. Ещё каждая операция создаёт какое-то количество эвентов в Kafka, их тоже валидируем (но это скорее как бонус сбоку).

Само оно никуда не ходит, это правда
я правильно улавливаю, что в тестах описывается референсная модель, потом в нее и в реальный инстанс идет флуд командами с сравнением итогового стейта, а потом это всё как-то сводится к минимальной последовательности команд для воспроизведения?
источник