-1

何かが起こったときにデータベース内の行がいっぱいになるシステムがあるとします。

  • ユーザーが単純にログインすると、テーブルにログインの種類と時刻を含む行がデータベースに挿入されますuser_logins
  • オペレーターがユーザーを呼び出すと、オペレーター ID、ユーザー ID、および日付を含む行がテーブルのデータベースに挿入されますoutgoing_calls
  • オペレーターがユーザー呼び出しに応答しない場合、日付、ユーザー ID、およびタイプ呼び出しを含む行がデータベースに挿入されます

次に、ある期間、たとえば 1 か月が経過した後、誰が誰に電話をかけたか、応答しなかった電話の数などに関するレポートが必要になります。この機能を編成するには、どのようなパターンを使用する必要がありますか?

一見、このプロセスは多くのログを記録しているように見えますが、ログとは、何らかの形式 (date-processId-messageWithPlaceHolders) でメッセージを保存するときのプロセスです。そのため、ログシステムを使用することはあまり適していません。

別の見方をすると、イベント処理のように見えますが、「イベント」が発生したときにアクションを実行する必要はなく、リスナーもキューもありません。さらなるレポートのためにデータベースに保存するだけです。

では、この機能を効果的に実装するには、どのようなパターンまたは手法を使用する必要があるでしょうか?

4

2 に答える 2

1

あなたの要件は、たとえば、通話の成功 (または何らかの理由) を理解できるように、誰が電話したかのレポートを毎月作成することです。

ロギングやイベント処理などとの類似性について考える必要はありません。問題を上から下に分析するだけで、タスクを達成するために必要な作業量を最小限に抑えることができます。

  • 毎月レポートを作成する必要がある
  • このためには、少なくとも月に 1 回結果を生成するジョブを実行する必要があります。
  • そのためには、ジョブが理解できる形式でイベントを保存する必要があります。

そのため、バッチ ジョブを毎月実行することをお勧めします。これは、手動で実行される Java プロセス、cron ジョブ、hadoop タスクなどの可能性があります。テクノロジ スタックによって異なります。イベントは発生時に保存する必要があります。繰り返しになりますが、スタックに応じて、リレーショナル データベース、キー値ストア、ログ行を含むファイルなど、テクノロジ スタックで最も簡単に操作できるものであれば何でもかまいません。

これらのオプションはすべて優れたものですが、おそらくより優れているものもあります。たとえば、純粋な文字列のログ記録は使用しないことをお勧めします。時間、数値などの構造化された属性を抽出する必要があるため、型の安全性を維持するのに役立つ形式を優先します。

于 2016-05-01T13:22:12.687 に答える
0

ビジネス サービスに実装するだけのパターンを使用します。

void login(User user) {
    entityManager.persist(new UserLogin(user));
}

void call(Operator op, User user) {
    entityManager.persist(new PhoneCall(op, user));
}

void missedCall(User user, Operator op) {
    entityManager.persist(new MissedCall(user, op));
}

これは、電話に出られなかった場合にビジネス サービスに通知されることを前提としています。回答がないだけでデータベースの更新がトリガーされる場合は、ロジックを逆にして、代わりに成功した回答を記録します。

void answeredCall(UserCall call, Operator op) {
    entityManager.merge(call).setAnsweredBy(op);
}

呼び出しをレポートしますcall.answeredBy is null

どちらの場合も、データベースにクエリを実行してレポートを作成します。

ビジネス サービスのほとんどの操作をそのように記録する必要がある場合は、AOP インターセプターを使用してこれを自動化できます。

于 2016-05-01T13:22:44.100 に答える