こんにちは。IT忍者です。またまた公共系システムで衝撃的なシステムニュースが流れてましたね。複数人(?数百人)桁までかはわかりませんが、「同タイミングで申請すると複数人に同じIDが割り振られる」要は データ構造を踏まえたときに、ユニークKey(システム内で1つのみ)で作成されるべきデータなのに、同じ値のKeyが重複、混在してしまいWEB上で別な人の情報が表示されてしまうという内容でしたね。さらに言うとこの問題はシステムの根幹に関わる部分なので、すぐには対応が難しそうですね。
憶測のみの話は本当はいけない事なのですが、個人的に思ったことなので、今回の雑記内容はあまり万人向けの内容ではなく、個人の戯言レベルの内容ですので真剣に読まないでください。w
IT忍者より凄腕が世の中には沢山いますので。
不具合分析と設計思想
公共系システム受注はちょっと特殊なので、少しだけ前段階知識を解説しておきます。
公共系システムの場合には、入札資格を取ってライバル企業と戦って勝ち取る必要があるので、企業間のシステム発注とは少し土俵が違いますが、勝ち取れば正にプライム企業となるわけです。(たまに出来レース的な話が、うわさでたまに出るときもある)といった特殊な案件ですね。
デカい公共系は冠企業が多いので、地方自治体で地方IT企業が受注しているイメージが多い印象です。
この辺はITもゼネコンと同じ系図ですよね~。w ゆえに同じなのでしょう。
企業のRFP( 提案依頼書 )を出してコンペするのと似てはいますが「入札」というのはやはり特殊。
※コンペ=コンペティション(競争)
昔からですが、入札する側も保守運用を含めて利益回収検討するので、入札は安く、保守運用はそれなりの金額でといった入札戦略などもある場です。さらに慣例・しきたりもあるのでちょっと面倒。
さて本題です。
データ構造とトランザクション制御
そもそもどういう状態だとKey重複が起こるのかですが、独自ロジックでKeyを生成するような仕組みでトランザクション制御処理まで高負荷時でもしっかり安全駆動する構造が出来ていないと発生する可能性は十分あるかと思います。
WEBサーバ側がマルチプロセス/マルチスレッドにはなるのですが、このマルチ制御+トランザクション制御、排他制御が大事になりますが、 おそらく公共系なのでNonSQLのKVSのチョイスはおそらくないはず。
RDBで処理しようとしているはずなので、WEB申請を受けつけるには サーバ側はマルチスレッドかマルチプロセスでリクエストを処理するので、トランザクションの分離レベルでの制御でSERIALIZABLE(直列化)で制御するのか、トランを開始するポイントで論理的に整合性を担保するのかなどなど、Key生成を制御する必要がありますが、皆が一気にアクセスして負荷が掛った時にボトルネック個所があって採番して一意にしてCommitまでの処理が追い付かずKeyの重複が起きたのかなっと推測しています。 ナチュラルキーで複合主キー をプライマリーキーに。とかなのかなっとただの憶測。
単発でのテストはきちんと動くのでしょうから、初期要件でもそこまでの性能要求もなくて、最初作ってた時には皆が一気に使いだすとはきっと思わなかったでしょうね。(苦笑)情報漏洩が起きるのは流石にダメですかね。エラー吐いて止まっている方がまだマシ。
ナチュラルキーとサロゲートキー
よく技術者の中でもDB設計方針で論争が起こる部分ではありますが、システム利用者属性や運用環境でトレードオフ出るので、優劣系は置いておきます。IT忍者も時にはDBエンジニアの役割もやりますが、最近の環境だと常にメテオフォール開発なので、最近はサロゲートキー一色。
スケールアウトとスケールアップ
AWS使ってオートスケーリングとか組んでいるわけでもなさそうな気がしますし、これは予算によってどこまで潤沢に組むかですが、一般的にはサーバー内通信とサーバ間通信とかの物理ネットワーク構成とか、瞬間PV、CVなどの指標でどこを強化するかを決めたりもしますが、そういった指標ではなく。
生きていくには利益とお金が必要という部分と利用率想定できっとトレードオフ。かな。。w
どういうSpecで組んでいるのかは個人的には気にはなりますね。今回はKey重複事象への解決アプローチにおいてはインフラレベルで解決できそうな感じではなさそうだなっとは見ています。
考察まとめ
Keyが重複してもシステム上では怒られない状態で、別な人のメアドとかが見れる状態ですから、DB上ではカラムにはUNIQUE制約とか入ってなさそうですね。
通常時は正しく動くけど、ある特定条件下では、期待した通りに動かないという、厄介な事象はシステム開発ではよくあることですがこういった場数を踏みながら経験値をしっかり積み重ねて、解法技術を習得するという部分がITエンジニアとしては強くなるかもですね♪ これは机上では培えない部分です。