Bancor & StackBlitzed
Привет, ты когда-нибудь пробовал поковыряться в торговом боте в три ночи, чтобы поймать эту ошибку в логике книги заявок? Я тут рылся в исходниках по той, что ты упоминал, и клянусь, проблема с таймингом прячется где-то в забытом асинхронном вызове. Как думаешь, что к чему?
Привет, Банкор.
Похоже на типичную гонку данных. Вынеси асинхронный вызов отдельно, записывай время получения каждого сообщения и сравни его с моментами срабатывания таймеров. Если порядковые номера сбиваются, ты увидишь пропуск непосредственно перед возвратом вызова. Затем либо заблокируй критическую секцию, либо добавь небольшую задержку, чтобы состояние книги заявок оставалось согласованным. Держи логи минимальными – только время, операция и хэш состояния – чтобы точно отслеживать момент несоответствия. Это должно помочь выявить, откуда проскакивает этот сбой в нумерации.
Отличное решение, но эти асинхронные вызовы всё ещё рискуют затормозить цикл событий. Если вынести их, добавь небольшую задержку – увидишь, как будут скакать метки времени. Я вчера только в два часа ночи вытянул исходник – эта строка с хешем состояния – просто клад. Ты весь файл уже пролистал, или только комментарии пробежал?
Я весь файл пролистал, не только комментарии. Комментарии объясняют задумку, но пришлось всё равно каждую асинхронную секцию сопоставить с временной шкалой цикла обработки событий. Та строка с хешем состояния, которую ты нашёл, – отличная точка отсчёта; она точно показывает, когда делается снимок базы данных. Я веду небольшую таблицу с расписанием в своих записях, чтобы сопоставлять асинхронные вызовы с этим хешем. Так и можно выловить эту ошибку с сдвигом на единицу.
Круто, эта таблица с таймлайнами выглядит как электронная таблица, созданная в два часа ночи. У меня тоже было несколько таких – перебор с асинхронными блоками, и цикл событий уходит в небольшой отпуск. Следи за этим хешем, это самое точное значение. Как только увидишь этот разрыв, сможешь наконец-то зафиксировать его. Ведёшь полный лог, или только самое необходимое?
Банкор<|message|>Я вытягиваю только самое необходимое: метку времени, тип операции и хеш. Никаких лишних данных, чтобы не тормозить процесс. Так у меня чистая картина без лишнего шума. Если я вижу пропущенный хеш между двумя записями – вот там и есть разрыв. Тогда я смогу заблокировать этот участок или подкорректировать асинхронное планирование.
Отлично. Этот минимальный лог – самое то, никаких лишних слов, которые тормозят процесс – только метки времени, операции, хеш. Так ты увидишь разрыв как на ладони. Если заметишь пропавший хеш – значит, вот она, гонка. Заблокируй этот блок или перестрой асинхронные вызовы. Кстати, ты вообще весь код читал, или только комментарии пролистал?