はじめに
ソケット通信などの直接通信を使わず、データベースのテーブルを介してプロセス間の連携を行う設計の備忘録です。
高速なリアルタイム処理はできませんが、データベースが整合性を保証し、状態確認も容易なため、プロセス側がシンプルな実装で済み、楽です。
本文
1. 設計概要
お題は生産ラインの管理システムです。レコードの状態遷移をトリガーに各プロセスが動作する設計になります。テーブルがメッセージキューやステートマシンの役割を持つイメージです。
2. 処理フロー
処理フローは以下になります。
- 上位システム連携プロセス、または生産管理アプリが生産予定テーブルに登録。
- 生産実行プロセスが開始条件を満たしたレコードを生産実行テーブルへ移動 (DELETE → INSERT)。
- 装置制御プロセスが生産実行レコードの生産実行ステータスを処理中に更新して生産開始。生産中は現在生産数量を更新。生産完了時、生産実行ステータスを処理完了に更新。
- 生産実行プロセスが完了条件を満たした生産実行レコードを生産実績テーブルへ移動 (DELETE → INSERT)。
- 上位システム連携プロセスが生産実績レコードを上位システムへ送信。上位送信ステータスを送信済に更新。
3. テーブル定義の例
予定開始日時カラムは優先順位と実質同じになります。要件次第では優先度カラムでも良いと思います。インデックスは予定開始日時やステータスに付与します。
① 生産予定テーブル
| 列名 | 型 | 説明 |
|---|---|---|
| order_id | INT | 主キー(シーケンス番号) |
| product_type_id | VARCHAR | 生産品種 ID |
| scheduled_start_at | DATETIME | 予定開始日時 |
| scheduled_quantity | INT | 予定生産数量 |
| created_at | DATETIME | 作成日時 |
| created_by | VARCHAR | 作成者 |
| updated_at | DATETIME | 更新日時 |
| updated_by | VARCHAR | 更新者 |
| remarks | VARCHAR | 備考 |
② 生産実行テーブル
| 列名 | 型 | 説明 |
|---|---|---|
| order_id | INT | 主キー(シーケンス番号) |
| product_type_id | VARCHAR | 生産品種 ID |
| scheduled_start_at | DATETIME | 予定開始日時 |
| production_start_at | DATETIME | 生産開始日時 |
| scheduled_quantity | INT | 予定生産数量 |
| current_quantity | INT | 現在生産数量 |
| production_status | INT | 生産実行ステータス |
| created_at | DATETIME | 作成日時 |
| created_by | VARCHAR | 作成者 |
| updated_at | DATETIME | 更新日時 |
| updated_by | VARCHAR | 更新者 |
| remarks | VARCHAR | 備考 |
生産実行ステータス (production_status) 定義
| 値 | 説明 |
|---|---|
| 0 | 未処理 |
| 1 | 処理中 |
| 2 | 処理完了 |
| 9 | 異常 |
③ 生産実績テーブル
| 列名 | 型 | 説明 |
|---|---|---|
| order_id | INT | 主キー(シーケンス番号) |
| product_type_id | VARCHAR | 生産品種 ID |
| scheduled_start_at | DATETIME | 予定開始日時 |
| production_start_at | DATETIME | 生産開始日時 |
| production_end_at | DATETIME | 生産完了日時 |
| scheduled_quantity | INT | 予定生産数量 |
| actual_quantity | INT | 最終生産数量 |
| upload_status | INT | 上位送信ステータス |
| created_at | DATETIME | 作成日時 |
| created_by | VARCHAR | 作成者 |
| updated_at | DATETIME | 更新日時 |
| updated_by | VARCHAR | 更新者 |
| remarks | VARCHAR | 備考 |
上位送信ステータス (upload_status) 定義
| 値 | 説明 |
|---|---|
| 0 | 未送信 |
| 1 | 送信完了 |
| 9 | 異常 |
おわりに
だいたいいつもこんな感じの古典的な設計に落ち着きます。