Lockの効果は限定的
GASがあまりに便利で楽しいので、ついつい、SpreadsheetをDBのようにあれこれいじり倒したくなるのですが、わたふくシステムでは、我慢がまん、が方針です。
データやデータ構成の一貫性が破壊されることを厳密に防ぐ手段がないので、いずれ必ず問題の原因になる、ということが理由です。
GASにはLockもあるのですが、その2種類あるLockの機能は以下のとおりです。
- Private Lock : 同一ロックを同時に取得できるのは、ユーザー毎に1つのスレッド(execution)のみ。
- Public Lock : 同一ロックを同時に取得で切るのは、そのスクリプトを実行するスレッド全体から1つのみ。
Public Lockを使えばきちんと排他できそうに一瞬思いますが、ロックはスクリプト(プロジェクト)に所属しています。なので、複数のプロジェクトはそれぞれ勝手に動くので、全てのスクリプトからのアクセスを排他的に処理できるわけではありません。
やるとしたら、以下のように運用することになると思います。
- あるスプレッドシート上のデータにアクセスするには、そのスプレッドシートの保有する単一のスクリプトコードからしかアクセスしない。
- 他のプロジェクトからそのスプレッドシートにアクセスしたいときは、上記のスクリプトコードをライブラリとして取り込み、必ずそのライブラリ経由とする。
スプレッドシートというデータにアクセスメソッドを付属させて、ひとつの独立したオブジェクトのように扱う(内部を勝手に触らない)、という意味です。
この運用でスクリプト同士の排他は実現できるのですが、、、結局最後は、ユーザーがスプレッドシートを開いて編集を行う、という操作をLockすることができません。
なので、上記の運用だけでは不足で、データを本当にLockしたいなら、人間にも触らせない、という運用を含めることが必要になります。
そうすればできる、、、、ということではありますが、そうやって生データへアクセスできるのはシステム管理者だけ、ということになってしまうのなら、最初からSQL使ったほうがよほど堅牢で、機能も豊富で、なぜわざわざスプレッドシートを使うのかわからなくなってしまいます。
なので、Lockによる排他は、上記の限界を認識した上で限定的に利用することになります。
実際、doGet / doPost による非同期多重アクセスからの排他や、timerによる周期起動で実行時間がインターバルを越えたときの排他、そういった「自分自身からの排他」には使っています。
データ構造とフロー
というわけで、Lock(排他)の代わりにデータ構造とフローで、そもそも排他を不要なシステムを設計する、という方針が必要になります。
前置きを書いているあいだに時間切れが近づいてしまったので手抜きで書き留めますが:
- データのファイル間リンクは使わずに、利用者のワークフローに合わせてデータを転記して持ち回る。
- 持ち回るデータのフローは一方通行にし、複数方向から単一データへのアクセス(書き込み)をさせない。
- 複数セルへのデータ書き込みはLockによる同時性確保ができないので、書き込み完了フラグ用セルを用意して、そこを参照するようにする。
具体的な例
わたフク。では、お申込みデータをマスターリストに登録しますが、名前・お届け先住所、、、などを書き込みして「登録時刻」を必ず最後に書き込みます。
これをフラグとしてみて、参照者は登録時刻の記載されている行だけを有効データと判断します。
また、お届け先住所は、発送担当者への「発送依頼リスト」に転記されます。整理番号だけを渡して実際の住所は元を参照する、という方法はとりません。
もうひとつの方針
上記は、方針1に従ったものであると同時に、手作業で運用する時と同じことをする、という方針にしたがったものでもあります。
- 運用とデータ構造を、手作業を前提に設計し、しばらく運用し、
- その後で、スクリプトで手作業を自動化する。
という方針です。
「ひとり情シス」のチームでは、自分が病気になっても最低限の運用は可能、というのが絶対基準になると思っています。
病気になったらみんなに迷惑がかかるから、というよりも、ひとり情シスが(それが誰であれ)病気になっても無理しなければならない、という状況に絶対に陥ってはならない、と思うからです。
なにしろ、自分の書いたコードほど信用ならないものはありません。(戒めを込めて)
また、Googleの仕様もいつ何時変更されるかわかりません。
なので、安心して休暇をとれる、病気になったら安心して休める、ということのために、プログラムがどんなにおバカでも運用は守られる、という:
コンピューティング以外のリスクヘッジを運用全体に埋め込んでおく
という方針になります。
GASは、とても楽しくて便利なので、ひとり情シスとしては(誰にもなにも言われないのをいいことに)、ついついあれこれやりたくなるのですが、これも我慢がまん、です。
病気になっても休めない、「セルフ・ブラック企業」になっちゃいますからね。
控えめに控えめに、いきましょう。
Comments
Post a Comment