node.js を介してサーバー側に Web サイトがあり、ページが更新されるたびに新しいコードが生成されます。最後のコード生成から 24 時間が経過したかどうかを検出したいのですが、問題はこれを行うことです。 24 時間が経過したかどうかを明確にするために、ユーザーの IP に対して setTimeout() を使用すると、2 つの問題が発生します。1 つ目は、簡単に IP を変更して新しいコードを取得したり、ルーターを再起動して割り当てたりすることができることです。新しい 1 コードの IP、一部のルーターには動的 IP が付属しているため、2 番目の問題は、何千人ものユーザーがこのような数の setTimeouts で毎日または毎時間 Web サイトにアクセスすることを考慮すると、割り当てられたメモリ量でサーバーが過負荷になることです。 setTimeouts のみの場合。 setTimeouts がどのように機能するかを読みました。指定された時間に実行するために JavaScript コンパイラーにスペースを割り当てるため、ヒープまたはメモリが間違いなく過負荷になります。24 時間が経過したかどうかを判断するより良い方法はありますか? setTimeout() を使用しないのですか?
同じ問題を見つけようとしましたが、この問題に対する解決策が見つかりませんでした。データベースを使用してこの問題を解決しようと考えましたが、データベース全体をループして現在時刻が正しいかどうかを確認する必要があるため、別の問題が発生しました。ドキュメントの作成時間は数時間長く、このようなループは完了するまでに数日かかるか、API がダウンすると失敗します (コンテンツを更新するために定期的に再起動しています)
setTimeouts を使用してもサーバーが壊れず、何らかの理由で API がダウンしても失敗せず、オプションでユーザーが IP アドレスをスプーフィングしているかどうかを判断できるソリューションを見つけようとしています。
P粉3563617222023-09-11 10:24:42
問題を解決するには、サーバー側のストレージとタイムスタンプを組み合わせて使用します。考えられるアプローチの 1 つを次に示します:
新しいコードが生成されたら、タイムスタンプとともにデータベースまたは Redis などの永続ストレージ ソリューションに保存します。
ユーザーが Web サイトにアクセスすると、最後に生成されたコードとそのタイムスタンプがストレージから取得されます。
現在のタイムスタンプと保存されているタイムスタンプを比較して、最後のコード生成から 24 時間が経過したかどうかを判断します。 JavaScript で Date オブジェクトを使用してタイムスタンプを処理できます。
24 時間以上経過すると、新しいコードが生成され、データベースに保存されているコードとタイムスタンプが更新されます。
このアプローチを使用すると、多くの setTimeout 呼び出しが回避され、ユーザーごとにデータベース全体をループする必要もなくなります。代わりに、各ユーザーの訪問のタイムスタンプを単純に比較するだけです。
ユーザーの IP スプーフィングの問題に関しては、ユーザーはさまざまな手法を使用して IP アドレスを変更できるため、IP スプーフィングを完全に防ぐことは困難です。ただし、追加のセキュリティ対策を実装して、IP スプーフィングの影響を最小限に抑えることができます。