CodeSOD: Определить сон Заметка
The Daily WTF на русском

CodeSOD: Определить сон

Разработчик столкнулся с необычным багом, когда сохранение новых записей иногда приводило к ошибкам дублирования первичного ключа. Эта проблема возникла из-за пользовательского генератора идентификаторов сообщений, который использовал текущую метку времени. Генератор пытался обрабатывать быстрые запросы, засыпая на секунду, если метки времени совпадали. Однако этот подход был неэффективным и по сути представлял собой запутанный автоинкрементный счетчик. Критическим недостатком было то, что previousId никогда не обновлялся, а значит, коллизии не предотвращались. Проблема усугублялась тем, что приложение было распределено по нескольким серверам. Это распределение означало, что даже правильно обновленный previousId не предотвращал бы коллизии идентификаторов между разными узлами. Потенциальные решения включают в себя включение машиноспецифичных идентификаторов, таких как MAC-адреса, или использование больших случайных чисел. В качестве альтернативы разработчик предлагает полагаться на встроенную функцию автоинкрементации базы данных вместо пользовательского кода. Текущая пропускная способность была достаточно низкой, чтобы база данных могла эффективно управлять генерацией идентификаторов.