ウィジェットを自動リフレッシュするとセマフォが枯渇するIssue ウィジェットが自動リフレッシュメカニズムを使用している場合、/api/now/sp/rectangle という REST API に対して大量の要求を生成することがあります。こうした要求の数が非常に多いと、インスタンスでセマフォが枯渇する可能性があります。よくある原因は PRB956025 ですが、実際にはポータルの実装に問題があることも多く、枯渇はかなり簡単に軽減できます。 症状 /api/now/sp/rectangle/??? への要求が急増する全般的に処理速度が低下し、サーバーからの 429 応答が増加する /api/now/sp/rectangle とは何か /api/now/sp/rectangle は、ウィジェットのコントローラーとサーバースクリプトとの通信を容易にするためにサービスポータルが使用する REST API です。ウィジェットが server.update() や spUtil.update() といった関数を呼び出して、ウィジェットのサーバースクリプトを起動するたびに、この API が使用されます。ウィジェットのサーバースクリプトでは、データモデルに値を入力します。そのため、データを更新またはリフレッシュするときに、よくこうしてサーバースクリプトを起動します。 ウィジェットの自動リフレッシュの問題 サービスポータルを設計する際に、このユースケースが考慮されることはありません。サービスポータルは、単一ページの Angular アプリです。JavaScript 標準の setInterval() 関数などのメソッドを使用して自動リフレッシュを作成した場合、実際にはブラウザのランタイムに変数が作成されて、Angular アプリが存続する間ずっと保持されます。 このとき何が起きているかというと、ブラウザのランタイムにタイマーが作成され、自動リフレッシュするウィジェットを備えたページからいったん離れて戻ってくるたびに、タイマーが再作成されています。現在、これと同じ目的に使用されるタイマーが 2 つあります。サービスポータルを長く使っていると、ポータルから完全に離れるまで古い sp/rectangle 呼び出しが破棄されないというだけの理由で、ユーザーがこうした呼び出しをそうとは知らずに大量に生成してしまうことがあります。 自動リフレッシュするウィジェットが原因で発生するパフォーマンスの問題を診断する方法 /api/now/sp/rectangle/??? の呼び出し数が多くなっていないか確認します呼び出しを行っているウィジェットを見つけますこの API からその情報が提供されます。要求文字列には、ウィジェットインスタンス sp _instance の sys_id が含まれています。ウィジェットインスタンスは、ウィジェットをポータル内のページにマッピングするレコードであるため、常にウィジェットへの参照が含まれています。 ウィジェットのクライアントスクリプトまたはコントローラーに自動リフレッシュを作成するコードを見つけます。 最もよく見られるのが次のようなコードです。 setInterval(function(){server.update();},3000); これは、3 秒ごとに server.update() を呼び出すようにブラウザに指示しています。 同じ目的を果たすコードが他にもいくつか考えられますが、いずれもこのパターンに従っており、ある間隔を置くかループ内でサーバーへの呼び出しを行います。 呼び出しの数を減らす方法 呼び出しの数を減らすには、自動リフレッシュを作成するコードを削除します。複数のウィジェットに問題があることも考えられるため、ウィジェットへの sp/rectangle 呼び出しをすべてたどって、いずれも正しく処理されていることを確認してください。 こうした呼び出しはブラウザのランタイムに保存されるため、ユーザーのセッションがアクティブかどうかに関係なく、ブラウザが要求を送信し続ける場合があります。たとえば、ユーザーが夜間帰宅しても、デスクトップでポータルを開いたままにした場合、ブラウザは翌朝までそうした要求を送信し続ける可能性があります。 結局のところ、自動リフレッシュの機能性を維持したまま、パフォーマンスの問題を回避できる完璧なソリューションはありません。それでも、コミュニティへの投稿には参考になるアイデアがあり、この記事は「自動リフレッシュするウィジェットが原因でインスタンスの処理速度が低下していますか?Related Links詳細については、次の記事も参照してください KB0635134:サービスポータルウィジェットでレコード監視 (recordWatch) の呼び出しが適切に定義されていないために発生する「デフォルトセマフォの枯渇」に関するエラーを解決する KB0639111:サービスポータルでレコード監視を微調整する