2

私はゲームサーバーの設計に不慣れで、ログサーバーをリファクタリングするタスクに割り当てられました。ゲームサーバーとログサーバー間の通信用にクラス Log を作成します。

class Log
{
    public:
        void    encode(Encoder& encoder) const;
        int     decode(Decoder& decoder);
    private:
        std::string sql_cmd;
}

ゲームサーバーには、ログサーバーにログリクエストを送信するためのクラスがあります。

class LogHelper
{
public:
        static void LogItemChange(const GameShare::GameItem& item, const PackageChangeDetails& pcd);
        {
                Log log(get_item_change_sql(item,pcd);
                send_to_log_server();
        }


private:
        static std::string get_item_change_sql(const GameShare::GameItem& item, const PackageChangeDetails& pcd);
}

質問は:

  1. ゲーム サーバーで SQL テキストを生成する必要がありますか? ゲーム サーバーで SQL テキストを生成すると、ゲーム サーバーのパフォーマンスに悪影響がありますか?

  2. ゲーム サーバーで SQL テキストを生成しない場合は、ログ サーバーで SQL テキストを生成する必要があります。GameItem と PackageChangeDetails のインスタンス データをログ サーバーに送信する必要があります。ログ サーバーが複雑になります。

4

2 に答える 2

2

ログの SQL がゲーム サーバーによって生成される場合、ゲーム サーバーがほぼ確実に既に知っているデータベース マネージャー部分へのパススルーになるため、ログ サーバー コードが存在する必要はほとんどありません。異なるデータベースである可能性があります)、または簡単に対話できます。

Log Server は、最も便利な形式 (パフォーマンス、冗長性、サイズなど) でログを記録する別個のコンポーネントである必要があります。API が十分に柔軟である限り、基礎となる実装を置き換えることができるように記述できます。ゲームサーバーが知らないうちに。

基礎となる実装の完全な知識をゲーム サーバー コードと結合することで、そのような将来の作業を防ぐだけでなく、ログ サーバー上の別のスレッドによって実行される可能性のある多くの作業をゲーム サーバーのコードに入れる可能性があります。 . 言うまでもなく、API を SQL に開放することで、他の方法では一元化されていたゲーム サーバー コード全体に潜在的なバグを配置することになります。

オブジェクト指向システムを設計する場合、将来を見据えた交換主導のアプローチが理想的です。API 以外との結合を避けることができれば、外部コードに影響を与えることなく (バグを無視して) API の下にあるものをいつでも置き換えることができますが、これには、API が将来に十分な柔軟性を持っていることを保証するために、考えを API に組み込む必要があります。 .

その上で、Logging API を純粋な仮想インターフェイスとして実装し、その上にデータベースと対話する実装を作成することを強くお勧めします。テキスト ファイルにログを記録する別の実装を使用することもできます (便宜上、ローカルデータベースにアクセスできない状態でのテスト (それが問題になる場合) と、何もしない実装です。最初の 2 つを念頭に置いて、結合から離れて、より良い設計へと導くのに役立つはずです。

これは、他のクラスが実装するいくつかの基本的なインターフェイス (例: ) にもつながる可能性があります。public: std::string to_log_string() const;これを Logger が使用して、実装オブジェクトを取り込み、ログに記録されたメッセージにすばやく変換できます。

つまり、ロギング関連の SQL をゲーム サーバーではなく、ログ サーバーに配置します。Game Server は、Log Server が一般的な「ログ記録」を超えて何をするかを気にする必要はありません。

于 2012-09-04T05:49:36.007 に答える
0

ゲーム サーバーで SQL テキストを生成しないでください。ログサーバーでも実行しないでください。後知恵の SQL には、準備済みステートメントのみが含まれている必要があります。実行時にクエリを生成することは、実行時にインデックスを生成するのと同じくらい非常識です。したがって、最終的な SQL テキストの生成はデータベースに任せます。

したがって、ゲーム サーバーとログ サーバー間の API には、ログに記録するコードではなく、ログに記録する変数のみを含める必要があります。

これにより SQL インジェクションが完全に回避されるという事実は、副次的な利点です。しかし、それでも本当のメリットです。ユーザー名と同じくらいログに記録する場合は、すでに SQL インジェクションを検討する必要があります。

于 2012-09-04T06:54:12.600 に答える