CodeSOD: 昼寝を見つけろ ノート

CodeSOD: 昼寝を見つけろ

ある開発者が、新しいエントリを保存すると、まれに主キー重複エラーが発生するという奇妙なバグに遭遇しました。この問題は、アプリケーションのカスタムメッセージIDジェネレーターに起因しており、現在のタイムスタンプを使用していました。ジェネレーターは、リクエストが集中した場合に、タイムスタンプが衝突すると1秒間スリープすることで対応しようとしました。しかし、この方法は非効率的であり、本質的には複雑な自動インクリメントカウンターでした。重大な欠陥は、previousId が更新されることがなかったため、衝突を防止できていなかったことです。問題は、アプリケーションが複数のサーバーに分散していることでさらに悪化しました。この分散環境では、正しく更新された previousId であっても、異なるノード間でのID衝突を防ぐことはできませんでした。考えられる解決策としては、MACアドレスのようなマシン固有の識別子を組み込むか、大きな乱数を使用することが挙げられます。あるいは、開発者は、カスタムコードの代わりに、データベースのネイティブな自動インクリメント機能に頼ることを提案しています。現在のスループットは十分に低いため、データベースはID生成を効果的に管理できる可能性が高いです。