質問: お世話になります。 現在php5.6であるアプリケーションを作成していますが、 そこのある処理で、確定ボタンを押したら、入力されたユーザー情報(仮に)をデータベース(DBサーバーはローカル)に登録して、その後4つの外部サーバーにftp接続してcsvファイルをはき出すという処理を同時に行っている箇所があります。 このようないくつかの処理を同時に行っている場合で、どこかのタイミングでエラーが発生した場合、すべてロールバックする例外をthrowすべきでしょうか。 ただ、ftp接続して、ファイルをアップロードした場合、途中でエラーが起きてもロールバックでアップロードしたことを戻すのは難しいと思います。 db処理、2つの外部サーバーにcsv吐き出しまで成功して3つ目のftpサーバーに接続できなかったといった様な場合はできるところまでやって、csv吐き出しが行えなかったことをエラーメッセージを表示すると言ったような処理もアリでしょうか。 またはそもそもこのような処理を設計すること自体間違いということもありますでしょうか。 当然要件によると思いますが、皆様のご経験上このような要件でどのような設計を行うか教えてください。 よろしくお願いします。
回答: 難問ですね。 > > そこのある処理で、確定ボタンを押したら、入力されたユーザー情報(仮に)をデータベース(DBサーバーはローカル)に登録して、その後4つの外部サーバーにftp接続してcsvファイルをはき出すという処理を同時に行っている箇所があります。 > > > 確認すべきなのは、「確定ボタン」を押した時の「入力されたユーザー情報」は正しいものかどうかということです。 「DBへの保存」「CSVファイル作成」 どっちが先でも構いませんが、「入力されたユーザー情報」が正しければ処理を継続出来るよう頑張る方が健全です。 例えばCSVファイル作成がメモリ不足で落ちたり、FTP接続に失敗したからといってDBへ保存したものを削除するのは正しいシステムの動作とも思えません。 私ならこうするという方法は「処理を分けてバッチで動かす」です。 ユーザーからの入力値を受け付けて、情報が正しければ即刻DBへ保存します。 それと同時に、「保存した入力値をCSVファイルに加工してFTPで別の場所へ送信したか? Yes or No」にレコードを挿入します。 Cronで何分かに一度この「Yes or No」テーブルに問い合わせるバッチを作成します。 後はこのようなフローで解決できるでしょう。 * Yes or Noテーブルに問い合わせる * 未送信のユーザー情報を取り出す * CSVファイル作成する * FTP送信を試みる * 上記の手順が全て完了したら「Yes or No」テーブルの完了済みにチェックを入れる 細部は色々とアレンジ出来ると思います。 まぁ、AWSのS3に保存すると○○のバッチが走ってSQSに行って、DynamoDBに振り分けて分析して...みたいなのは全てさっき挙げた設計思想で動いています。 S3だったりDynamoDBに保存した瞬間、AWSのシステムが発火して登録しているバッチが動作して値の加工→別の場所に保存を行ってくれます。 その結果、サーバを使わず値をうまく加工して別の場所へ保存を繰り返すシステムが構築出来るのです。