13

Stackoverflowには気の利いたバッジシステムがあります。私が気づいたことの1つは、バッジがすぐには授与されないことですが、基準を満たした後、ある種の遅延があるように見えることがあります。バッジを持っている他のいくつかのサイトでもこれに気づきました。

おそらくこれは、新しいバッジを授与する必要があるかどうかを確認するために定期的にスキャンする遅延ジョブを使用しているためです。このアプローチもここでアドバイスされていると思います:
バッジを実装する方法は?

ただし、なぜこれが必要なのかはよくわかりません。実装では、新しいコメントが投稿されるなど、関連するアクションが実行された後、checkAwardBadge関数が呼び出されてチェックするシステムを使用することをお勧めします。ユーザーは新しいコメントバッジの基準を満たしています。

スピード的には、関連するすべてのユーザー統計は、UserStatsのように、Userのサブモデルに単純に隠されているので、毎回コメントの数を数えるのではなく、単純なクエリになると思っていました。

私が好んでいるシステムは、高速で非常に理解しやすいものでなければならないことに気づきました。仕事の遅れで物事を複雑にする必要がある理由について、私がここで見逃している欠点はありますか?

明確にするために:私は抽象クラスAchievementsを持ち、実際のAchievementsごとにAchievementsを実装する予定です。各アチーブメントにはcheckAwardBadge関数があり、コントローラーから呼び出すことができます。また、そのルートを選択する必要がある場合は遅延ジョブ、またはユーザーが特定のバッジを獲得したかどうかを確認するためにいつでも呼び出すことができます。したがって、アチーブメントコードはすべて一元化されます。

4

4 に答える 4

15

あなたの実装は単純なシナリオ(あなたが説明しているもののような)で動作するかもしれませんが、物事がより複雑になると、次のような解決策があります:

  1. すべてのアクションで不要なチェックを行います
  2. すべてのアクションにペナルティ性能を追加
  3. スケーリングしない
  4. すべてのルールの中心となる場所はありません。
于 2010-07-29T19:13:41.597 に答える
15

これはあなたが説明しているシナリオと大まかに似ているだけですが、私の仕事で私たちが何をしているのかを議論することは、このアプローチの理由の一部を明らかにするのに役立つと思います.

私はリアルタイムアルゴリズム商社で働いています。私たちのソフトウェアが行うことの一部は、ベンダーからの市場データを処理することです。

さて、個々の市場の刻みごとに対応して発生する必要があるものがあります。私たちは分析を実行し、特定の場合に有効になる安全トリガーを用意します。しかし、私たちが絶対に避けているのは、この「二次的な」ロジックのすべてで市場イベントに反応するコードを肥大化させることです。

ここでの理由は、データがデータ ベンダーからネットワーク経由で送信され、このデータ フィードがバックアップなしで自由に流れる必要があるためです。当社のソフトウェアは、1 秒あたり約 10,000 のマーケット ティックを処理できます。これらの市場イベントの処理に時間がかかりすぎると、フィードが詰まり始め、可能な限り迅速に市場に対応する能力が損なわれます。

この結果、新しい市場イベントを処理するコードは非常に無駄がなくなりました。イベントは価格を更新し、それだけです。イベントごとに実行する必要がある他のすべてのロジックについては、このロジックによってまだ検査されていないすべてのイベントのキューを介して、定期的に発生します。

これにより、非常に応答性が高く、データをバックアップしないスレッドを 1 つ持つことができ、別のスレッドは着信イベントを処理し、より重要な計算を実行できます。このように作業を 2 つに分割することで、すべてがスムーズに進みます。

これがあなたの質問に接しているだけであることは認めますが、すべてのユーザー アクションでバッジ関連のロジックをチェックしない理由は同じである可能性が非常に高いと思われます。操作が行われる正確な瞬間に重要度の低いロジックを実行して、サーバー上のすべての操作の速度を低下させたくありません。一般的な戦略は、高速な操作 (つまり、基本的にすべてのユーザー アクション) を高速に保ち、より時間のかかる作業を (おそらく頻繁に) 実行される二次プロセスに委任することですが、そのような操作ごとに実行するわけではありません。

于 2010-07-29T19:29:57.210 に答える
4

アクションが実行されてすぐに取り消された場合に、バッジが付与されないようにするためである可能性があります。

于 2010-07-29T19:12:57.457 に答える
2

私はいつも、静的コンテンツを提供する方が速いために遅延が発生したと思っていました。これはトラフィックの多いサイトでは一般的だと思います。静的コンテンツをWebリクエストごとに生成するのではなく、定期的に更新してください。

定期的なジョブは、新しい静的コンテンツを生成するだけで、非常に頻繁に実行されますが、すべての単一ページ要求よりも頻度は低くなります。

于 2010-07-29T19:13:12.457 に答える